目录
- 1.安装
- 2.启动
- 3.常用命令
- 3.1 string相关
- 3.2 hash相关
- 4.redis集群
- 4.1 准备工作
- 4.2 搭建redis集群
- 4.3 redis集群使用
- 附录
- 关闭redis集群的脚本
1.安装
- 由于redis本身是采用c++编写的,所以需要安装c++编译器gcc。
yum install -y gcc-c++
出现Complete!
表示安装成功。
- 使用root用户,在linux系统的文件系统中解压linux版本的redis安装包点击下载redis-3.0.0.tar.gz
tar -zxvf redis-3.0.0.tar.gz
- 安装redis
进入解压后的目录,采用编译和安装同时进行的方式安装。
安装目录自己选,假设安装到根目录/workdev的redis文件夹里,注意PREFIX大写!
[root@localhost workdev] cd redis-3.0.0
[root@localhost redis-3.0.0] make install PREFIX=/workdev/redis
- 进入redis/bin目录,redis-server就是启动文件,运行这个文件(该方式为前置启动,一般不用)
./redis-server
看到如下内容说明启动成功
_._
_.-``__ ''-._
_.-`` `. `_. ''-._ Redis 3.0.0 (00000000/0) 64 bit
.-`` .-```. ```\/ _.,_ ''-._
( ' , .-` | `, ) Running in standalone mode
|`-._`-...-` __...-.``-._|'` _.-'| Port: 6379
| `-._ `._ / _.-' | PID: 5393
`-._ `-._ `-./ _.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' | http://redis.io
`-._ `-._`-.__.-'_.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' |
`-._ `-._`-.__.-'_.-' _.-'
`-._ `-.__.-' _.-'
`-._ _.-'
`-.__.-'
退出前置启动的方式:Ctrl+C
2.启动
- 到redis的解压目录中拷贝redis.conf到redis的安装目录中(和redis-server在同一个目录)
cp redis.conf /workdev/redis/bin/
- 打开redis.conf这个文件,修改daemonize的值为yes(设为后置启动)
vim redis.conf
保存
:wq
- 后置启动redis
./redis-server redis.conf
查看是否已启动
方式一:查看进程
ps aux|grep redis
root 2591 0.1 0.7 137440 7512 ? Ssl 18:36 0:00 ./redis-server *:6379
root 2648 0.0 0.0 103244 864 pts/0 S+ 18:44 0:00 grep redis
方式二:使用redis自带的客户端工具(相当于进入客户端)
[root@localhost bin] ./redis-cli
# 命令反馈
127.0.0.1:6379> ping
PONG
127.0.0.1:6379> echo hello
"hello"
- 正确停止redis的方式
127.0.0.1:6379> SHUTDOWN
- 退出redis-cli
quit
3.常用命令
3.1 string相关
set 以字符串类型存入数据(value的“”可以不加)
127.0.0.1:6379> set uname gjy
OK
127.0.0.1:6379> set age 20
OK
127.0.0.1:6379> set gender 1
OK
get 通过key取value(key的“”可以不加,返回字符串)
127.0.0.1:6379> get uname
"gjy"
127.0.0.1:6379> get age
"20"
127.0.0.1:6379> get gender
"1"
keys * 查询所有的key
127.0.0.1:6379> keys *
1) "gender"
2) "uname"
3) "age"
keys 如下命令的含义:查询u开头的5个字符的key
127.0.0.1:6379> keys u?
(empty list or set)
127.0.0.1:6379> keys u????
1) "uname"
rename 重命名key
127.0.0.1:6379> rename gender sex
OK
127.0.0.1:6379> get sex
"1"
exists 判断指定的key是否存在(存在返回1,不存在返回0)
127.0.0.1:6379> exists sex
(integer) 1
127.0.0.1:6379> exists gender
(integer) 0
del 通过一个或多个key删除(返回受影响的条数)
127.0.0.1:6379> del sex age
(integer) 2
127.0.0.1:6379> keys *
1) "uname"
expire (前提是先要有一个key)设置一个key的过期时间(成功返回1,失败返回0)
127.0.0.1:6379> expire uname 30
(integer) 1
127.0.0.1:6379> keys *
1) "uname"
127.0.0.1:6379> keys *
(empty list or set)
ttl 查看key的过期时间(key不存在返回-2;永久存在返回-1;否则返回剩余过期时间)
127.0.0.1:6379> set uname gjy
OK
127.0.0.1:6379> ttl uname
(integer) -1
127.0.0.1:6379> expire uname 30
(integer) 1
127.0.0.1:6379> ttl uname
(integer) 25
127.0.0.1:6379> ttl uname
(integer) 12
127.0.0.1:6379> ttl uname
(integer) -2
select 选择数据库(0-15,默认选择0)
select 1
move 把当前库的key移到另一个指定库(成功返回1,失败返回0)
127.0.0.1:6379[1]> select 0
OK
127.0.0.1:6379> set uname gjy
OK
127.0.0.1:6379> move uname 2
(integer) 1
127.0.0.1:6379> keys *
(empty list or set)
127.0.0.1:6379> select 2
OK
127.0.0.1:6379[2]> keys *
1) "uname"
persist 移除指定key的过期时间(成功返回1,失败返回0)
127.0.0.1:6379[2]> persist uname
(integer) 0
127.0.0.1:6379[2]> expire uname 30
(integer) 1
127.0.0.1:6379[2]> persist uname
(integer) 1
127.0.0.1:6379[2]> ttl name
(integer) -2
type 返回值的类型
127.0.0.1:6379[2]> type uname
string
randomkey 随机返回库中的一个key
quit 退出连接
dbsize 返回当前库中的key数目
info 获取服务器的信息和统计
flushdb 删除当前库中的key
flushall 删除所有库中的key
incr 让当前key值以1递增,并返回递增后的值(key值为NaN无法递增,报错)
127.0.0.1:6379> set uname gjy
OK
127.0.0.1:6379> incr uname
(error) ERR value is not an integer or out of range
127.0.0.1:6379> set age 20
OK
127.0.0.1:6379> incr age
(integer) 21
127.0.0.1:6379> incr age
(integer) 22
127.0.0.1:6379> get age
"22"
incrby 指定一次增加的数值,并返回递增后的值
127.0.0.1:6379> get age
"22"
127.0.0.1:6379> incrby age 5
(integer) 27
127.0.0.1:6379> incr age
(integer) 28
127.0.0.1:6379> incrby age 5
(integer) 33
127.0.0.1:6379> incrby age 5
(integer) 38
decr 减
decrby 指定,减
incrbyfloat
127.0.0.1:6379> get age
"38"
127.0.0.1:6379> incrbyfloat age 0.4
"38.4"
append 向key值的末尾追加(返回值是追加后的总长度)
127.0.0.1:6379> get uname
"gjy"
127.0.0.1:6379> append uname dad
(integer) 6
127.0.0.1:6379> get uname
"gjydad"
mset 存入多值
127.0.0.1:6379> mset uname gjy age 20 sex 1
OK
127.0.0.1:6379> keys *
1) "sex"
2) "uname"
3) "age"
127.0.0.1:6379> get uname
"gjy"
127.0.0.1:6379> get sex
"1"
127.0.0.1:6379> get age
"20"
mget 获取多值
127.0.0.1:6379> keys *
1) "sex"
2) "uname"
3) "age"
127.0.0.1:6379> mget uname age sex
1) "gjy"
2) "20"
3) "1"
3.2 hash相关
hset
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> hset person uname gjy
(integer) 1
127.0.0.1:6379> hset person age 20
(integer) 1
127.0.0.1:6379> keys *
1) "person"
hget
127.0.0.1:6379> hget person uname
"gjy"
127.0.0.1:6379> hget person age
"20"
hmset
127.0.0.1:6379> hmset person uname gjy age 20
OK
hmget
127.0.0.1:6379> hmget person uname age
1) "gjy"
2) "20"
hgetall
127.0.0.1:6379> hgetall person
1) "uname"
2) "gjy"
3) "age"
4) "20"
注意:在使用hash结构存储数据时,很多时候使用如下方式存储数据
127.0.0.1:6379> hmset user:1 name aaa password 111
OK
127.0.0.1:6379> hmset user:2 name bbb password 222
OK
127.0.0.1:6379> hmset user:3 name ccc password 333
OK
这样的存储方式的意义在于这三条数据的根key拥有相同的前缀user,在使用Redis Desktop Manager(基于windows的redis桌面工具),在使用这个工具连接redis查看时(需要关闭linux的防火墙),显示成文件夹结构
4.redis集群
4.1 准备工作
在redis解压后的src目录下有个叫redis-trib.rb的文件,该文件可以帮助创建redis集群。同时还需要一个redis.gem文件点击下载redis-3.0.0.gem。
- 安装ruby解释器
由于redis-trib.rb是一个ruby语言写的一个脚本程序,所以需要安装ruby解释器。
yum install -y ruby
- 安装ruby的包管理器
redis.gem是ruby写的redis包,运行该包需要ruby的包管理器。
yum install -y rubygems
- 执行redis.gem
gem install redis-3.0.0.gem
4.2 搭建redis集群
实际工作搭建集群,需要多台物理设备,在每台物理设备上安装一个redis进行集群的搭建。我们这里因为无法提供多台设备,所以在一个虚拟机中安装多个redis实例,这种搭建的方式叫做伪集群。
但伪集群的搭建方式和物理集群的搭建方式几乎相同。学会了伪集群的搭建,就可以完成真正集群的搭建。
- 创建6个redis实例
由于redis在创建集群时,需要考虑到单点故障以及高可用。所以需要采用主备模式。同时redis在管理集群判断节点是否健康采用的是投票策略,所以主节点的数量一定是单数的。如:创建redis的最小的集群,应该是三个实例,在加上主备模式,那么一共应该是6个redis实例。
我们可以将已经安装好的redis拷贝6份。注意:在拷贝创建集群节点时。在该实例中一定要将备份文件(dump.rdb)删除掉。否则创建集群时会出问题。
cd /workdev/redis/bin/
rm -f dump.rdb
mkdir /workdev/redis-cluster
cp -r /workdev/redis /workdev/redis-cluster/redis01
cp -r /workdev/redis /workdev/redis-cluster/redis02
cp -r /workdev/redis /workdev/redis-cluster/redis03
cp -r /workdev/redis /workdev/redis-cluster/redis04
cp -r /workdev/redis /workdev/redis-cluster/redis05
cp -r /workdev/redis /workdev/redis-cluster/redis06
- 开启6个实例中的集群并修改端口号
伪集群因为在一台机器上运行,所以要修改端口号,实际搭建不需要。
假设redis01 ~ redis06的端口号设为6381 ~ 6386,
以redis01为例,其他以此类推
vim /workdev/redis-cluster/redis01/bin/redis.conf
#port 6379
port 6381
# cluster-enabled yes
cluster-enabled yes
- 创建一个startall.sh启动脚本
redis在创建集群时,要求只能对已启动的redis创建集群。所以我们需要将六个redis启动,每次分别启动6个实例比较麻烦,我们可以创建一个startall.sh。
startall.sh与6个redis同级,即在redis-cluster里
vim /workdev/redis-cluster/startall.sh
startall.sh脚本内容为
cd redis01/bin
./redis-server redis.conf
cd ../../redis02/bin
./redis-server redis.conf
cd ../../redis03/bin
./redis-server redis.conf
cd ../../redis04/bin
./redis-server redis.conf
cd ../../redis05/bin
./redis-server redis.conf
cd ../../redis06/bin
./redis-server redis.conf
分配startall.sh的使用权限
[root@localhost redis-cluster] chmod +x startall.sh
启动测试
[root@localhost redis-cluster] ./startall.sh
[root@localhost redis-cluster] ps aux|grep redis
root 28736 0.1 0.7 137440 7496 ? Ssl 06:41 0:00 ./redis-server *:6381 [cluster]
root 28738 0.1 0.7 137440 7500 ? Ssl 06:41 0:00 ./redis-server *:6382 [cluster]
root 28742 0.1 0.7 137440 7496 ? Ssl 06:41 0:00 ./redis-server *:6383 [cluster]
root 28748 0.1 0.7 137440 7496 ? Ssl 06:41 0:00 ./redis-server *:6384 [cluster]
root 28752 0.1 0.7 137440 7496 ? Ssl 06:41 0:00 ./redis-server *:6385 [cluster]
root 28754 0.1 0.7 137440 7496 ? Ssl 06:41 0:00 ./redis-server *:6386 [cluster]
root 28769 0.0 0.0 103252 832 pts/0 S+ 06:43 0:00 grep redis
- 把redis-trib.rb拷贝到集群目录下,使用这个文件来创建集群
[root@localhost redis-cluster] cp /workdev/redis-3.0.0/src/redis-trib.rb /workdev/redis-cluster/
[root@localhost redis-cluster] ls
redis01 redis02 redis03 redis04 redis05 redis06 redis-trib.rb startall.sh
- 执行如下命令
[root@localhost redis-cluster] ./redis-trib.rb create --replicas 1 192.168.80.133:6381 192.168.80.133:6382 192.168.80.133:6383 192.168.80.133:6384 192.168.80.133:6385 192.168.80.133:6386
上面命令的1
表示创建集群时主备模式的策略,1表示1主1备;后面跟6个redis的IP,实际工作搭建的IP是地址不同端口相同而非地址相同端口不同。
当显示如下
Can I set the above configuration? (type 'yes' to accept):
到这一步输入yes,开始创建集群。。。
4.3 redis集群使用
redis集群在做数据存储时采用的hash算法,redis集群会准备16384个槽,他会将这些槽平分到主节点上。当有数据要进行存储时,redis会使用CRC16算法,先将key做16进制的转换,然后使用该值与16384取模,该值就决定了当前要将这个key与value存储到哪个节点中。
redis允许我们使用任何一个节点下的客户端工具连接到集群中的任何一个节点下。
假设使用redis01的redis-cli
[root@localhost redis-cluster] cd redis01/bin
[root@localhost bin] ./redis-cli -h 192.168.80.133 -p 6381 -c
上述命名中-h
后指定地址,-p
后指定端口,-c
一定要加上表示连接集群。
192.168.80.133:6381> set uname gjy
-> Redirected to slot [10359] located at 192.168.80.133:6382
OK
192.168.80.133:6382> set age 20
-> Redirected to slot [741] located at 192.168.80.133:6381
OK
192.168.80.133:6381> get uname
-> Redirected to slot [10359] located at 192.168.80.133:6382
"gjy"
192.168.80.133:6382> get age
-> Redirected to slot [741] located at 192.168.80.133:6381
"20"
上述向redis集群存入数据,uname通过计算得到10359存入端口6382的redis02节点中,age通过计算得到741存入端口6381的redis01节点中,同时客户端也切换到不同的节点中了,但通过get命令依然可以获取自身或其他节点的数据,只是用户无需考虑节点间的切换。
192.168.80.133:6381> cluster nodes
b5c24b98db839004003c489b07a052c3a6c7209b 192.168.80.133:6383 master - 0 1566633746495 3 connected 10923-16383
eb78c8ca8a59c2d71df477bfc2be8453185d0ffe 192.168.80.133:6384 slave d904aad48ace37631ba6eb671ae7b17701387a41 0 1566633744480 4 connected
d904aad48ace37631ba6eb671ae7b17701387a41 192.168.80.133:6381 myself,master - 0 0 1 connected 0-5460
01958c3ee1aea22d5e501e140dee437a99f887a5 192.168.80.133:6385 slave ef75c295cd7a1842b7bcbdb4458eca4d1561a967 0 1566633748508 5 connected
ef75c295cd7a1842b7bcbdb4458eca4d1561a967 192.168.80.133:6382 master - 0 1566633747502 2 connected 5461-10922
e4bf49cfd354403ea3a3e40f66b7fe998049fdf7 192.168.80.133:6386 slave b5c24b98db839004003c489b07a052c3a6c7209b 0 1566633745488 6 connected
附录
关闭redis集群的脚本
按照4.2的3中的步骤我们同样可以写出关闭redis集群的脚本,下面只附上脚本内容,具体步骤请查看4.2的3。
cd redis01/bin
./redis-cli -h 192.168.80.133 -p 6381 shutdown
cd ../../redis02/bin
./redis-cli -h 192.168.80.133 -p 6382 shutdown
cd ../../redis03/bin
./redis-cli -h 192.168.80.133 -p 6383 shutdown
cd ../../redis04/bin
./redis-cli -h 192.168.80.133 -p 6384 shutdown
cd ../../redis05/bin
./redis-cli -h 192.168.80.133 -p 6385 shutdown
cd ../../redis06/bin
./redis-cli -h 192.168.80.133 -p 6386 shutdown
脚本中的地址和端口请根据实际情况修改。