目录
2.5.hlen命令返回hash集合里的所有的键数量(size)
一、安装
1.准备
在CentOS7上安装redis时,如下两个工具必须要有:wget和gcc
如果没有,则分别进行安装:
yum -y install wget
yum -y install gcc
2.下载redis
cd /usr/local/src
wget http://download.redis.io/releases/redis-4.0.6.tar.gz
如果该版本无法下载,请去redis官网查看最新的稳定版本:
3.解压
tar -xvf redis-4.0.6.tar.gz
4.make
cd redis-4.0.6
make MALLOC=libc
5.安装
make MALLOC=libc PREFIX=/usr/local/redis install
cp ./redis.conf /usr/local/redis
6.启动redis服务器
cd /usr/local/redis
./bin/redis-server ./redis.conf
7.以服务方式启动redis服务器
vi redis.conf
修改如下参数:daemonize yes,然后启动服务器:
./bin/redis-server ./redis.conf
8.客户端连接
./bin/redis-cli
9.测试
127.0.0.1:6379> set test 123
OK
127.0.0.1:6379> incr test
(integer) 124
二、基本命令
参考文档:http://redisdoc.com/
在redis安装目录下,执行
./bin/redis-cli --raw
进入redis客户端,如果服务器设置了密码,可以执行如下命令:
127.0.0.1:6379> auth cailei
OK
其中cailei是密码
redis有5中数据类型:
String,Hash, List, Set , ZSet,下面分别说明不同类型数据的命令,最后还补充了一些通用命令
1.操作String类型
1.1.set/get命令
设置key值为name,value为cailei
127.0.0.1:6379> set name cailei
OK
127.0.0.1:6379> get name
"cailei"
1.2.setnx命令
如果key存在,则不设值并返回0;如果key不存在,则设值并返回1。
127.0.0.1:6379> setnx name cai
(integer) 0
127.0.0.1:6379> setnx name1 lei
(integer) 1
1.3.setex命令
设置name1值为lei2,过期时间为10秒
127.0.0.1:6379> setex name1 10 lei2
OK
127.0.0.1:6379> get name1
"lei2"
10秒后name1清除
127.0.0.1:6379> get name1
(nil)
1.4.del命令
删除
127.0.0.1:6379> del name
(integer) 1
127.0.0.1:6379> del name
(integer) 0
127.0.0.1:6379> get name
(nil)
1.5.mset/mget命令
批量读写
127.0.0.1:6379> mset name1 cai1 name2 cai2
OK
127.0.0.1:6379> mget name1 name2
1) "cai1"
2) "cai2"
127.0.0.1:6379> del name1 name2
(integer) 2
1.6.getset命令
一次性设值和读取(返回旧值,写上新值)
127.0.0.1:6379> getset name cailei
(nil)
127.0.0.1:6379> getset name cailei1
"cailei"
1.7.incr/decr命令
给相应的数值增加或者减少1,只能针对值为数字的,如果是字符串会报错
127.0.0.1:6379> set students 10
OK
127.0.0.1:6379> incr students
(integer) 11
127.0.0.1:6379> decr students
(integer) 10
127.0.0.1:6379> incr name
(error) ERR value is not an integer or out of range
1.8.incrby/decrby命令
给相应的数值增加或者减少指定的数值,只能针对值为数字的
127.0.0.1:6379> incrby students 3
(integer) 13
127.0.0.1:6379> decrby students 3
(integer) 10
1.9.append命令
给对应的字符串尾部追加字符串
127.0.0.1:6379> append name -lei
(integer) 11
127.0.0.1:6379> get name
"cailei1-lei"
1.10.strlen命令
获取字符串长度
127.0.0.1:6379> strlen students
(integer) 2
127.0.0.1:6379> strlen name
(integer) 11
1.11.setrange命令
从某个索引始进行字符串替换
127.0.0.1:6379> get name
"cailei1-lei"
127.0.0.1:6379> setrange name 2 xxx
(integer) 11
127.0.0.1:6379> get name
"caxxxi1-lei"
2.操作Hash类型
Hash类型是String类型的field和value的映射表,或者说是一个String集合。它特别适合存储对象,相比较而言,将一个对象类型存储在Hash类型要存储在String类型里占用更少的内存空间,并方便整个对象的存取。
2.1.hset/hget命令
设置、获取值
127.0.0.1:6379> hset book1 name 上下五千年
1
127.0.0.1:6379> hset book1 author 无名
1
127.0.0.1:6379> hset book1 publisher 人民出版社
1
127.0.0.1:6379> hget book1 name
上下五千年
2.2.hmset/hmget命令
批量设置和获取属性
127.0.0.1:6379> hmset book1 name 全球通史 author xxx publisher yyy
OK
127.0.0.1:6379> hmget book1 name author publisher
全球通史
xxx
yyy
2.3.hexists命令
判断某个key是否存在
127.0.0.1:6379> hexists book1 name
1
127.0.0.1:6379> hexists book1 name1
0
127.0.0.1:6379> hexists book2 name1
0
2.4.hdel命令
删除hash的某个属性
127.0.0.1:6379> hget book1 publisher
yyy
127.0.0.1:6379> hdel book1 publisher
1
127.0.0.1:6379> hget book1 publisher
127.0.0.1:6379>
2.5.hlen命令
返回hash集合里的所有的键数量(size)
127.0.0.1:6379> hlen book1
2
2.6.hkeys/hvals命令
hkeys返回hash集合里的所有key,hvals返回hash集合里的所有value
127.0.0.1:6379> hkeys book1
name
author
127.0.0.1:6379> hvals book1
全球通史
xxx
2.7.hgetall命令
返回hash集合里的所有key和value
127.0.0.1:6379> hgetall book1
name
全球通史
author
xxx
2.8.hsetnx命令
如果hash中对应的属性不存在,则设置值并返回1;否则不设置,并返回0
127.0.0.1:6379> hsetnx book1 publisher xxxx
1
127.0.0.1:6379> hsetnx book1 publisher yyyy
0
127.0.0.1:6379> hgetall book1
name
全球通史
author
xxx
publisher
xxxx
2.9.hincrby命令
给hash的某个数字属性值增加值,如果增加值为负值,则表示减少
127.0.0.1:6379> hset book1 readers 100
1
127.0.0.1:6379> hincrby book1 readers 5
105
127.0.0.1:6379> hincrby book1 readers -5
100
127.0.0.1:6379> hgetall book1
name
全球通史
author
xxx
publisher
xxxx
readers
100
3.操作List类型
List类型是一个链表结构的集合,其主要功能有push、pop、获取元素等。更详细的说,List类型是一个双端链表的结构,我们可以通过相关的操作进行集合的头部或者尾部添加和删除元素,List的设计非常简单精巧,即可以作为栈,又可以作为队列,满足绝大多数的需求。
3.1.lpush命令
从list头部加入一个或者多个元素(栈,先进后出)
127.0.0.1:6379> lpush mylist a b c d
4
127.0.0.1:6379> lrange mylist 0 -1
d
c
b
a
3.2.rpush命令
从list尾部加入一个或者多个元素(队列,先进先出)
127.0.0.1:6379> rpush mylist2 1 2 3 4
4
127.0.0.1:6379> lrange mylist2 0 -1
1
2
3
4
3.3.linsert命令
向list中插入元素
127.0.0.1:6379> linsert mylist before c kk
5
127.0.0.1:6379> lrange mylist 0 -1
d
kk
c
b
a
127.0.0.1:6379> linsert mylist after b jj
6
127.0.0.1:6379> lrange mylist 0 -1
d
kk
c
b
jj
a
3.4.lrange命令
lrange key start stop:获取指定索引内的所有元素,只可从左到右 0 -1代表所有
3.5.lset命令
lset key index value:将列表中 index下标的元素替换掉
127.0.0.1:6379> lrange mylist 0 -1
d
kk
c
b
jj
a
127.0.0.1:6379> lset mylist 1 kk-2
OK
127.0.0.1:6379> lrange mylist 0 -1
d
kk-2
c
b
jj
a
3.6.lrem命令
lrem命令会删除列表中前count个值为value的元素,返回实际删除的元素个数。根据count值的不同,该命令的执行方式会有所不同:
当count>0时, 从列表左边开始删除。
当count<0时, 从列表后边开始删除。
当count=0时, 删除所有值为value的元素。
127.0.0.1:6379> lrange mylist 0 -1
d
kk-2
c
b
jj
a
127.0.0.1:6379> lrem mylist 1 kk-2
1
127.0.0.1:6379> lrange mylist 0 -1
d
c
b
jj
a
3.7.ltrim命令
ltrim key start stop:保留制定key的值范围内的数据, 其他数据会删掉, 和 lrange 一样的参数范围
127.0.0.1:6379> lrange mylist 0 -1
d
c
b
jj
a
127.0.0.1:6379> ltrim mylist 1 -1
OK
127.0.0.1:6379> lrange mylist 0 -1
c
b
jj
a
3.8.lpop命令
lpop key:从list的头部删除元素,并返回删除元素
127.0.0.1:6379> lrange mylist 0 -1
c
b
jj
a
127.0.0.1:6379> lpop mylist
c
127.0.0.1:6379> lrange mylist 0 -1
b
jj
a
3.9.rpop命令
rpop key:从list的尾部删除元素,并返回删除元素
127.0.0.1:6379> lrange mylist 0 -1
b
jj
a
127.0.0.1:6379> rpop mylist
a
127.0.0.1:6379> lrange mylist 0 -1
b
jj
3.10.rpoplpush命令
rpoplpush list1 list2:从list1尾部删除元素,并将被移除的元素添加到list2的头部,返回被移除的元素,可以实现MQ
127.0.0.1:6379> lrange mylist1 0 -1
3
4
127.0.0.1:6379> lrange mylist2 0 -1
1
2
127.0.0.1:6379> rpoplpush mylist1 mylist2
4
127.0.0.1:6379> lrange mylist1 0 -1
3
127.0.0.1:6379> lrange mylist2 0 -1
4
1
2
3.11.llen命令
返回元素个数
127.0.0.1:6379> lrange mylist 0 -1
b
jj
127.0.0.1:6379> llen mylist
2
3.12.lindex命令
返回名称为key的list中index位置的元素
127.0.0.1:6379> lrange mylist 0 -1
b
jj
127.0.0.1:6379> lindex mylist 0
b
4.操作Set类型
set集合是String类型的无序集合,set是通过hashtable实现的,对集合我们可以取交集、并集、差集
4.0.sadd命令
sadd key member [member ...]:向名称为key的set中添加元素,set集合不允许重复元素
127.0.0.1:6379> sadd myset a b c d
4
127.0.0.1:6379> sadd myset a
0
127.0.0.1:6379> smembers myset
d
c
b
a
4.1.smembers命令
查看set集合中的元素。
4.2.srem命令
删除set集合的元素
127.0.0.1:6379> smembers myset
d
c
b
a
127.0.0.1:6379> srem myset b
1
127.0.0.1:6379> smembers myset
c
a
d
4.3.spop命令
随机删除指定set中的一个内容并将删除的内容返回
127.0.0.1:6379> smembers myset
c
a
d
127.0.0.1:6379> spop myset 2
a
d
127.0.0.1:6379> smembers myset
c
4.4.sdiff命令
差集运算,返回在第一个set中存在,第二个set 中不存在的内容
127.0.0.1:6379> sadd myset1 a b c
3
127.0.0.1:6379> sadd myset2 1 2 3
3
127.0.0.1:6379> sdiff myset1 myset2
b
c
a
4.5.sdiffstore命令
sdiffstore set4 set2 set3:将set2中存在,set3不存在的元素的保存到set4中
127.0.0.1:6379> sdiffstore myset3 myset1 myset2
3
127.0.0.1:6379> smembers myset1
c
b
a
127.0.0.1:6379> smembers myset2
1
2
3
127.0.0.1:6379> smembers myset3
b
c
a
4.6.sinter命令
取交集,集合重复的数据
127.0.0.1:6379> smembers myset1
c
b
a
127.0.0.1:6379> smembers myset2
1
2
a
3
127.0.0.1:6379> sinter myset1 myset2
a
4.7.sinterstore命令
sinterstore:set3 set1 set2取交集后保存到set3
127.0.0.1:6379> smembers myset1
c
b
a
127.0.0.1:6379> smembers myset2
1
2
a
3
127.0.0.1:6379> sinterstore myset3 myset1 myset2
1
127.0.0.1:6379> smembers myset3
a
4.8.sunion命令
取并集,因为是set所以相同部分只会取一次
4.9.sunionstore命令
sunionstore set3 set1 set2:取并集后保存到 set3
4.10.smove命令
smove set1 set2:从一个set集合移动到另一个set集合里
4.11.scard命令
查看集合里的元素个数
4.12.sismember命令
判断某个元素是否为集合中的元素,是,返回1;不是,返回0
4.13.srandmember命令
随机返回一个元素
5.操作Zset类型
有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。
有序集合的成员是唯一的,但分数(score)却可以重复。
集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。 集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)。
5.1.zadd命令
zadd key score member [score member ...]: score 是分, member 是内容, score 必须是数字,向有序集合中添加一个元素,该元素如果存在则更新顺序,如果分值相同元素不同会同时存在两个元素。
5.2.zscore命令
zscore key member 获取指定key 中指定内容的分数
5.3.zrem命令
zrem key member [member ...] :删除zset名称key中的member元素
5.4.zrange命令
zrange key start stop [WITHSCORES] 获得排名在某个范围的元素列表,照元素分数从小到大的顺序返回索引从start到stop之间的所有元素(包含两端的元素)[WITHSCORES]为可选项,代表是否在结果中显示分数
5.5.zrevrange命令
ZREVRANGE key start stop [WITHSCORES] 照元素分数从大到小的顺序返回索引从start到stop之间的所有元素(包含两端的元素)
5.6.zrank命令
ZRANK key member 返回有序集合中指定成员的索引(从小到大排序)
5.7.zrevrank命令
ZREVRANK key member 返回有序集合中指定成员的排名,有序集成员按分数值递减(从大到小)排序
5.8.zcard命令
ZCARD key 返回集合里所有元素的个数
5.9.zcount命令
ZCOUNT key min max 返回集合中score在给定区间中的数量
5.10.zincrby命令
zincrby key increment member: 有序集合中对指定成员的分数加上增量 increment
5.11.zrangebyscore命令
zrangebyscore key min max [WITHSCORES] [LIMIT offset count] :通过分数返回有序集合指定区间内的成员 min max 代表分数范围 ,offset 代表偏移量, count 代表获取多少个,类似于数据库
5.12.zremrangebyrank命令
zremrangebyrank key start stop :移除有序集合中给定的排名区间的所有成员
5.13.zremrangebyscore命令
zremrangebyscore key min max:移除有序集合中给定的分数区间的所有成员
6.操作HyperLogLog类型
Redis 在 2.8.9 版本添加了 HyperLogLog 结构。
Redis HyperLogLog 是用来做基数统计的算法,HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定 的、并且是很小的。
在 Redis 里面,每个 HyperLogLog 键只需要花费 12 KB 内存,就可以计算接近 2^64 个不同元素的基 数。这和计算基数时,元素越多耗费内存就越多的集合形成鲜明对比。
但是,因为 HyperLogLog 只会根据输入元素来计算基数,而不会储存输入元素本身,所以 HyperLogLog 不能像集合那样,返回输入的各个元素。
小知识:
什么是基数?
比如数据集 {1,2,1,2} 那么这个数据集的基数集为 {1,2}, 基数(不重复元素)为2。 基数估计就是在误差可接受的范围内,快速计算基数。
6.1.PFADD命令
PFADD 新增元素
6.2.PFCOUNT命令
PFCOUNT 获取基数的估计值
6.3.PFMERGE命令
PFMERGE 将多个 HyperLogLog 合并为一个 HyperL
7.其他命令
7.1.keys命令
keys * : 返回满足的所有键 ,可以模糊匹配 比如 keys abc* 代表 abc 开头的 key
7.2.exists命令
exists key :是否存在指定的key,存在返回1,不存在返回0
7.3.expire命令
expire key second:设置某个key的过期时间 时间为秒
7.4.del命令
del key:删除某个key
7.5.ttl命令
ttl key:查看剩余时间,当key不存在时,返回 -2;存在但没有设置剩余生存时间时,返回 -1,否则,以秒为单位,返回 key 的剩余生存时间。
7.6.persist命令
persist key:取消过去时间
7.7.PEXPIRE命令
PEXPIRE key milliseconds 修改key 的过期时间为毫秒
7.8.select命令
select : 选择数据库 数据库为0-15(默认一共16个数据库) s
设计成多个数据库实际上是为了数据库安全和备份
7.9.move命令
move key dbindex : 将当前数据中的key转移到其他数据库
7.10.randomkey命令
randomkey:随机返回一个key
7.11.rename命令
rename key key2:重命名key
7.12.echo命令
echo:打印命令
7.13.dbsize命令
dbsize:查看数据库的key数量
7.14.INFO命令
info:查看数据库信息
7.15.config get命令
config get * 实时传储收到的请求,返回相关的配置
7.16.flushdb命令
flushdb :清空当前数据库
7.17.flushall命令
flushall :清空所有数据库
8.事务命令
Redis 事务可以一次执行多个命令, 并且带有以下两个重要的保证:
事务是一个单独的隔离操作:
事务中的所有命令都会序列化、按顺序地执行。
事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。
事务是一个原子操作:
事务中的命令要么全部被执行,要么全部都不执行
一个事务从开始到执行会经历以下三个阶段:
开始事务
命令入队
执行事务
常用命令
MULTI 开启事务
EXEC 执行事务
DISCARD 取消事务
WATCH key 监听某个 key的值是否发生变化,如果发生变化, watch 之后的操作会失败
127.0.0.1:6379> multi
OK
127.0.0.1:6379> sadd myset1 abc
QUEUED
127.0.0.1:6379> discard
OK
127.0.0.1:6379> smembers myset1
2
3
127.0.0.1:6379> multi
OK
127.0.0.1:6379> sadd myset1 abc
QUEUED
127.0.0.1:6379> exec
1
127.0.0.1:6379> smembers myset1
3
abc
2
9.发布订阅消息
建立两个Xshell连接,并分别启动redis客户端,连接到redis服务器上,在客户端1上执行消息订阅,指定订阅的channel如下:
127.0.0.1:6379> subscribe ch01
subscribe
ch01
1
在客户端2上针对channel发布消息如下:
127.0.0.1:6379> publish ch01 hello
1
客户端1收到消息红色部分:
[root@localhost redis]# ./bin/redis-cli --raw
127.0.0.1:6379> subscribe ch01
subscribe
ch01
1
message
ch01
hello
message
ch01
hello
10.数据备份和恢复
备份执行save命令即可:
127.0.0.1:6379> save
OK
127.0.0.1:6379> quit
[root@localhost redis]# ls
bin dump.rdb redis.conf
数据恢复只需将备份文件 (dump.rdb) 移动到 redis 安装目录并启动服务即可
三、主从复制
进入redis安装目录,复制redis.conf为redis6380.conf
修改redis.conf
bind 0.0.0.0
修改redis6380.conf
port 6380
slaveof 127.0.0.1 6379
启动主服务
./bin/redis-server ./redis.conf
启动从服务
./bin/redis-server ./redis6380.conf
启动两个xShell连接到linux服务器
分别启动redis客户端,连接到主服务和从服务
连接主服务
./bin/redis-cli --raw
连接从服务
./bin/redis-cli -p 6380 --raw
a.在连接主服务的客户端中,设置某个key值,然后在从服务的客户端中,即可查看到相应的值:
连接主服务的客户端命令及返回:
127.0.0.1:6379> keys *
myset1
myset
mylist1
myset3
myset2
book1
mylist
name
students
127.0.0.1:6379> set test test
OK
连接从服务的客户端命令及返回:
127.0.0.1:6380> get test
test
b.连接从服务的客户端订阅频道chtest,然后在主服务的客户端中发布该频道的消息,从服务器可以收到
连接从服务的客户端命令及返回:
127.0.0.1:6380> subscribe chtest
subscribe
chtest
1
连接主服务的客户端命令及返回:
127.0.0.1:6379> publish chtest testmsg
0
连接从服务的客户端命令及返回:
127.0.0.1:6380> subscribe chtest
subscribe
chtest
1
message
chtest
testmsg
四、哨兵模式
配置哨兵模式主要是防止主服务宕机,切换到从服务。
不时地监控redis是否按照预期良好地运行;
如果发现某个redis节点运行出现状况,能够通知另外一个进程(例如它的客户端);
能够进行自动切换 当一个master节点不可用时,能够选举出master的多个slave(如果有超过一个slave的话)中的一个来作为新的master,其它的slave节点会将它所追随的master的地址改为被提升为master的slave的新地址。
哨兵为客户端提供服务发现,客户端链接哨兵,哨兵提供当前master的地址然后提供服务,如果出现切换,也就是master挂了,哨兵会提供客户端一个新地址。
首先从redis源代码目录下去拷贝文件到安装目录下:
cp /usr/local/src/redis-4.0.6/sentinel.conf /usr/local/redis
进入redis安装目录,并修改哨兵配置文件
cd /usr/local/redis
vi sentinel.conf
修改配置如下:
daemonize yes
port 26379
sentinel monitor mymaster 127.0.0.1 6379 1
sentinel down-after-milliseconds mymaster 10000
部分配置说明:
dir: 日志路径,根据自己的要求保存。
sentinel monitor mymaster 10.0.31.144 6379 1 解释:#名称 #ip #端口号 # 投票选举次数(即有多少篇就被选举为主,这里节点少,就配置为1)
sentinel down-after-millisecond mymaster 5000 解释:哨兵程序多久去监控一次集群,#默认 30s 检查一次,这里配置超时30000毫秒为宕机
sentinel parallel-syncs mymaster 1 解释:有多少个从节点
sentinel failover-timeout mymaster 600000 解释:若哨兵在该配置值内未完成failover操作(即发生故障时,m/s切换),本次failover失败
sentinel parallel-syncs mymaster 1 解释:有多少个从节点
启动哨兵服务:
./bin/redis-server ./sentinel.conf --sentinel
查看哨兵服务,此时master0的服务端口6379
[root@localhost redis]# ./bin/redis-cli -p 26379 info sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=127.0.0.1:6379,slaves=1,sentinels=1
然后杀死端口6379的主服务(使用kill命令)后10秒,再次查看哨兵服务,此时master0的服务端口为6380,说明当主服务(端口6379)宕机时,从服务(端口6380)自动切换为主服务
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=127.0.0.1:6380,slaves=1,sentinels=1
五.集群
(1)所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽.
(2)节点的fail是通过集群中超过半数的节点检测失效时才生效.
(3)客户端与redis节点直连,不需要中间proxy层.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可
(4)redis-cluster把所有的物理节点映射到[0-16383]slot上,cluster 负责维护node<->slot<->value Redis 集群中内置了 16384 个哈希槽,当需要在 Redis 集群中放置一个 key-value 时,redis 先对 key 使用 crc16 算法算出一个结果, 然后把结果对 16384 求余数,这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,redis 会根据节点数量大致均等的将哈希槽映射到不同的节点
集群搭建需要ruby环境,安装命令如下:
yum install ruby
yum install rubygems
接着安装redis的相关ruby包
gem install redis
此时有可能会报错,需要ruby.2.2以上版本,因为yum默认安装的ruby2.0
[root@localhost create-cluster]# gem install redis
Fetching: redis-4.0.1.gem (100%)
ERROR: Error installing redis:
redis requires Ruby version >= 2.2.2.
[root@localhost create-cluster]# ruby -v
ruby 2.0.0p648 (2015-12-16) [x86_64-linux]
需要安装较高的ruby版本
yum install centos-release-scl-rh
yum install rh-ruby23 -y
scl enable rh-ruby23 bash
重新安装redis的相关ruby包
gem install redis
进入redis源代码目录/usr/local/src/redis-4.0.6/utils/create-cluster
cd /usr/local/src/redis-4.0.6/utils/create-cluster
创建6台redis集群,端口30001-30006,前三台为主,后三台为从
启动6台redis,端口30001-30006
[root@localhost create-cluster]# ./create-cluster start
Starting 30001
Starting 30002
Starting 30003
Starting 30004
Starting 30005
Starting 30006
创建集群配置,前三台为主,后三台为从,中间需要输入yes确认配置:
[root@localhost create-cluster]# ./create-cluster create
>>> Creating cluster
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
127.0.0.1:30001
127.0.0.1:30002
127.0.0.1:30003
Adding replica 127.0.0.1:30004 to 127.0.0.1:30001
Adding replica 127.0.0.1:30005 to 127.0.0.1:30002
Adding replica 127.0.0.1:30006 to 127.0.0.1:30003
M: 288830900da1c576e73370c277eb6dd3130c1ec0 127.0.0.1:30001
slots:0-5460 (5461 slots) master
M: 9a872ea4a8889e9dd3b6257aafd300d0c9d374c7 127.0.0.1:30002
slots:5461-10922 (5462 slots) master
M: 40217144c8cbf1f6b89d9b43d9fca98495ae9af6 127.0.0.1:30003
slots:10923-16383 (5461 slots) master
S: fd21ffa0f3179148722d01a77a7731f80d0122ef 127.0.0.1:30004
replicates 288830900da1c576e73370c277eb6dd3130c1ec0
S: e751853bcbe36aa769653757e90a391dad94e1a6 127.0.0.1:30005
replicates 9a872ea4a8889e9dd3b6257aafd300d0c9d374c7
S: 06303685c3bbef82aea7dc639bedece4e9e96398 127.0.0.1:30006
replicates 40217144c8cbf1f6b89d9b43d9fca98495ae9af6
Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join..
>>> Performing Cluster Check (using node 127.0.0.1:30001)
M: 288830900da1c576e73370c277eb6dd3130c1ec0 127.0.0.1:30001
slots:0-5460 (5461 slots) master
1 additional replica(s)
S: 06303685c3bbef82aea7dc639bedece4e9e96398 127.0.0.1:30006
slots: (0 slots) slave
replicates 40217144c8cbf1f6b89d9b43d9fca98495ae9af6
M: 40217144c8cbf1f6b89d9b43d9fca98495ae9af6 127.0.0.1:30003
slots:10923-16383 (5461 slots) master
1 additional replica(s)
S: e751853bcbe36aa769653757e90a391dad94e1a6 127.0.0.1:30005
slots: (0 slots) slave
replicates 9a872ea4a8889e9dd3b6257aafd300d0c9d374c7
S: fd21ffa0f3179148722d01a77a7731f80d0122ef 127.0.0.1:30004
slots: (0 slots) slave
replicates 288830900da1c576e73370c277eb6dd3130c1ec0
M: 9a872ea4a8889e9dd3b6257aafd300d0c9d374c7 127.0.0.1:30002
slots:5461-10922 (5462 slots) master
1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
客户端登录集群,set值时,会根据key的不同,自动保存数据到不同的slot上
cluster nodes命令显示所有集群中的redis实例
[root@localhost redis]# ./bin/redis-cli -p 30001 -c --raw
127.0.0.1:30001> set name cailei
-> Redirected to slot [5798] located at 127.0.0.1:30002
OK
127.0.0.1:30002> cluster nodes
9a872ea4a8889e9dd3b6257aafd300d0c9d374c7 127.0.0.1:30002@40002 myself,master - 0 1524190434000 2 connected 5461-10922
fd21ffa0f3179148722d01a77a7731f80d0122ef 127.0.0.1:30004@40004 slave 288830900da1c576e73370c277eb6dd3130c1ec0 0 1524190433586 4 connected
40217144c8cbf1f6b89d9b43d9fca98495ae9af6 127.0.0.1:30003@40003 master - 0 1524190434088 3 connected 10923-16383
288830900da1c576e73370c277eb6dd3130c1ec0 127.0.0.1:30001@40001 master - 0 1524190434088 1 connected 0-5460
e751853bcbe36aa769653757e90a391dad94e1a6 127.0.0.1:30005@40005 slave 9a872ea4a8889e9dd3b6257aafd300d0c9d374c7 0 1524190434088 5 connected
06303685c3bbef82aea7dc639bedece4e9e96398 127.0.0.1:30006@40006 slave 40217144c8cbf1f6b89d9b43d9fca98495ae9af6 0 1524190434088 6 connected
127.0.0.1:30002> quit
六、持久化机制
1.RDB
RDB(snapshotting快照)是将数据写入一个临时文件,持久化结束后,用这个临时文件替换上次持久化的文件,达到数据恢复。
RDB(snapshotting快照)是将数据写入一个临时文件,持久化结束后,用这个临时文件替换上次持久化的文件,达到数据恢复。 优点:使用单独子进程来进行持久化,主进程不会进行任何IO操作,保证了redis的高性能 缺点:RDB是间隔一段时间进行持久化,如果持久化之间redis发生故障,会发生数据丢失。所以这种方式更适合数据要求不严谨的时候
RDB默认开启,redis.conf中的具体配置参数如下:
save 900 1 #900秒内,超过1个key被修改,则发起快照保存 save 300 10 #300秒内,超过10个key被修改,则发起快照保存 save 60 10000 #60秒内,超过10000个key被修改,则发起快照保存 dbfilename dump.rdb 持久化数据存储在本地的文件 dir ./ 持久化数据存储在本地的路径,如果是在/redis/redis-3.0.6/src下启动的redis-cli,则数据会存储在当前src目录下
2.AOF
AOF(append-only file)是将执行过的指令记录下来,数据恢复时按照从前到后的顺序再将指令执行一遍,实现数据恢复
优点:可以保持更高的数据完整性,如果设置追加file的时间是1s,如果redis发生故障,最多会丢失1s的数据;且如果日志写入不完整支持redis-check-aof来进行日志修复;AOF文件没被rewrite之前(文件过大时会对命令进行合并重写),可以删除其中的某些命令(比如误操作的flushall)。
缺点:AOF文件比RDB文件大,且恢复速度慢。 类似于mysql日志,由于快照方式是在一定时间间隔做一次,所以可能发生redis意外宕机的情况就会丢失最后一次快照后的所有被修改的数据,aof比快照方式有更好的持久化型,是由于redis在使用aof时,redis会将每一个收到的写命令都通过write函数追加到命令中,在redis重新启动时会重新执行文件中保存的写命令在内存中重建这个数据库的内容,这个文件在redis/bin目录下,appendonly.aof。aof不是立即写到硬盘上,可以通过配置文件修改强制写到硬盘中
配置 appendonly yes //启动aof持久化 ,持久化有三种方式: #appendfsync always //收到写命令就立即写入到磁盘,效率最慢,但是保证完整的持久化(最常用) #appendfsync everysec //每秒写一次硬盘,在性能和持久化方面做了很好的这种 #appendfsync no //完全依赖os,性能最好,持久化没保证。