Redis内容整理
目录
- 基础数据结构
- 持久化
- 主从架构
- 哨兵模式
- 集群配置
1. 基础数据结构
string, value是一个字符串,在没有确定数据结构的复杂度时,建议使用string
常用操作指令 | 说明 |
---|---|
set | 给key设置一个值 |
get | 获取一个key的值 |
del | 删除一个key |
mset | 批量设置key的值 |
mget | 批量获取多个key的值 |
setnx | 判断key是否已经存在,如果存在返回0不做操作,如果不存在插入并返回1 |
exists | 判断key是否存在 |
incr | 给key设置自增+1 |
incrby | 给key设置自增+n |
decr | 给key设置自减-1 |
decrby | 给key设置自减-n |
expire | 给key设置过期时间 |
ttl | 查看key的过期时间 |
hash,value是个<field, vlaue>的键值对集合,field没有过期时间的属性。可以存储相对string比较复杂的数据,单个key的field建议不超过5000
常用操作指令 | 说明 |
---|---|
hset | 给key设置一个field |
hget | 获取key的一个field |
hdel | 删除key的一个field |
hmset | 给key设置多个field |
hmget | 获取key的多个field |
hsetnx | 判断key的field是否存在,如果存在返回0不做操作,如果不存在插入并返回1 |
hlen | 获取key的field个数 |
hgetall | 获取key的所有field |
hincr | key的field自增+1 |
list,value是个有序的链表,可以通过他实现栈(FILO),队列(FIFO),阻塞队列
常用操作指令 | 说明 |
---|---|
lpush | 在列表的最左端push一个值 |
rpush | 在列表的最右端push一个值 |
lpop | 在列表的最左端弹出一个值 |
rpop | 在列表的最右端弹出一个值 |
lbpop | 在列表的最左端弹出一个值,如果null就阻塞,直到有值可以被弹出 |
rbpop | 在列表的最右端弹出一个值,如果null就阻塞,直到有值可以被弹出 |
lrange | 在列表的最左端获取对应数量的值 |
llen | 获取列表的长度 |
lindex | 获取列表索引对应的值 |
lrem | 根据count移除等于value的值,count>0从头,count<0从尾,count=0全部移除 |
lset | 给索引位置设置一个值 |
linsert | 给索引前或者后插入一个值 |
set,value是个集合,可以用该数据类型做一些交集,并集和随机选举的运算
常用操作指令 | 说明 |
---|---|
sadd | 新增集合值 |
smembers | 获取集合所有值 |
srem | 移除集合中对应值 |
scard | 获取集合的长度 |
sismember | 检查集合中是否包含该值 |
srandmember | 在集合中随机选举 |
spop | 在集合中随机选举,并弹出 |
sinter | 交集 |
sinterstore | 将交集的结果存在一个新的集合中 |
sunion | 并集 |
sunionstore | 将并集的结果存在一个新的集合中 |
sdiff | 差集 |
sdiffstore | 将差集的结果存在一个新的集合中 |
zset,value是个集合,与set不同的是每个节点都有一个score,可以通过这个score值进行排序
常用操作指令 | 说明 |
---|---|
zadd | 新增集合值 |
zrem | 移除集合值 |
zcard | 获取集合长度 |
zscore | 获取集合成员的分值 |
zrange | 获取集合正序范围区间值 |
zrerange | 获取集合倒序范围区间值 |
zinterstore | 将交集结果存到新集合 |
zunionstore | 将并集结果存到新集合 |
2. 持久化
RDB持久化配置,使用二进制rdb文件进行存储
save
和 bgsave
命令可以手动执行,默认配置文件的 save
使用的是 bgsave
,异步的进行持久化
# 60秒内1000个数据发生了变化,会将数据进行一次持久化到rdb文件中
save 60 1000
命令 | IO类型 | 是否阻塞其他线程 | 优点 | 缺点 |
---|---|---|---|---|
save | 同步 | 是 | 不会消耗额外内存 | 阻塞其他线程 |
bgsave | 异步 | 否 | 不会阻塞其他线程 | 消耗额外的内存 |
AOF持久化配置,根据配置规则将命令持久化到aop文件中
# 打开aop持久化开关,默认no
appendonly yes
# 每条操作数据的命令都进行一次持久化,安全但效率不高
appendfsync always
# 每秒的操作数据命令,进行一次持久化,建议使用此策略,兼顾安全与效率
appendfsync everysec
# no不是关闭,指的是交给系统去决定多久进行一次持久化,有效率,但不安全
appendfsync no
AOF重写,在aof文件中可能会有很多没有用的指令,所以redis会对aof文件进行重写。重写aof文件redis会fork一个子线程去执行,所以不会对redis正常操作造成多大影响。可以使用指令bgrewriteaof进行重写,也可以通过下面配置进行重写
# 配置重写的最小文件限制,太小了没有重写的必要
auto-aof-rewrite-min-size 64mb
# 配置自上一次重写,文件大小增长的百分比
auto-aof-rewrite-percentage 100
RDB体积小,恢复速度快,不过安全性差,易丢失数据
AOF体积大,恢复速度慢,安全性根据配置策略决定
在redis启动恢复数据时,AOF相对RDB的优先级要高,因为AOF的数据要比RDB的更完整
Redis4.0 混合持久化
# 开启混合持久化
aof-use-rdb-preamble yes
在开启混合持久化后,当aop文件发生重写时,会将重写前的所有指令写为rdb格式的内容,在将后续的aof指令追加存放在一个新的aof文件中,重写完成后替换appendonly.aof文件,redis重启时,先恢复rbd区域的数据,然后再加载aof的数据指令 这样就可以大大的加快了重启速度
appendonly.aof
3. 主从架构
主从架构主从节点配置
# 设置master节点ip地址和端口
replicaof ip port
# 设置master的密码
masterauth <yourpassword>
# 设置slave节点只读
replica-read-only yes
# 对外暴露的ip
replica-announce-ip
# 对外暴露的端口
replica-announce-port
为一个master节点配置一个slave节点,不管这个slave节点是否第一次连接,都会向master发送一个SYNC请求。master接收到这个SYNC请求后,会在后台通过 bgsave
进行持久化rdb,在持久化新的rdb文件之前,所有接收到的请求命令都会同时放入到一个缓冲区,rdb文件完成持久化后同步给slave节点,slave节点将rdb文件持久化并加载到内存中,之后master会将缓冲区的命令同步给slave节点。
如果因为某些原因断开连接,slave会自动重连master
如果master有多个slave节点并发连接,master只会持久化一次
master与slave断开重连后,一般是对数据完整的复制,在redis2.8以后可以部分复制,实际上就是缓冲区同步的每个指令都有个offset标记,重连后在master的缓冲区如果找到对应的offset就直接同步缓冲区后面的命令,如果没有对应的offset就进行全量同步
4. 高可用哨兵架构
sentinel哨兵
是redis的一种特殊服务,他本身不提供读写服务,用作监听redis实例节点。哨兵架构下redis client通过sentinel获取redis的master节点,后续访问master节点,并不会一直连接sentinel节点。当有master节点故障,sentinel会选举新的节点通知给client(一般client都实现了订阅功能,订阅了sentinel发布节点变动消息)
选主机制
主观下线:每个sentinel节点会对redis集群节点发送心跳包,如果有节点在 down-after-milliseconds
内没有回复心跳,则认为该节点主观下线
客观下线:当其中一个节点被sentinel节点认为主观下线时,并不意味真的下线了,需要其他sentinel节点共同认为主观下线才可以。超过 quorum
数量的sentinel节点认同主观下线,则是客观下线。如果下线的是sentinel节点 或者slave节点,那么就到此结束了,如果是master节点,那么就开始从slave节点中选取一个master节点
选取主节点前,sentinel节点之间需要竞选一个leader,每个节点都可能成为leader,与确认客观下线一样,在sentinel节点发现有master节点主管下线时,就会给所有sentinel发起一个请求,如果同意的数量大于等于 quorum
节点,那么这个sentinel节点竞选成功
sentinel选举规则
- 优先排除故障节点
- 选择优先级slave-priority最大的
- offset偏移量最大的
- 选择runid最小的
配置sentinel
复制一份sentinel.conf然后配置如下
# 配置监听redis集群的mater节点,quorum是指多少个sentinel节点认为一个master失效
sentinel monitor <master ip> <port> <quorum>
redis-sentinel sentinel.conf // 运行sentinel节点
sentinel节点一般是建议配置三个或者基数节点,因为只有超过半数才能完成选主流程,例如(2/2+1 = 1)
5. 集群架构
集群模式需要配置多个主从,因为在多个主节点之间是分片进行存储的,如果没有配置主从,当其中一个master出现故障时,会直接导致落在这个节点的请求失败,无法立即做出响应。配置了主从后,当其中有mater节点发生故障时,它下面的从节点会第一时间发现,并发送fail的请求给其他集群节点,这时其他正常的master节点会收到fail请求,并会对第一个接收到的fail请求做出ack响应,故障的master节点下面的从节点接收到ack数量超过master节点总数的一半,就会被选为新的master节点
集群模式建议配置奇数节点,3,5,7 因为在当有mater节点发生故障时,偶数的节点无法做出选举,选举的条件是超过总master节点总数的一半
总线端口是留给gossip协议用作每个节点通信,在不同服务器上部署时,注意开放端口访问权限,默认此端口是redis服务端口加10000
集群配置
# 暴露被访问的地址,也就是所使用的网卡被分配的ip(或者全部注释掉,默认扫描全部可以被访问的地址)
bind 0.0.0.0
# 关闭安全保护模式,如果打开的话,没有设置bind参数并且没有设置密码,只有本地可以访问
protected-mode no
# 因为集群自动分配主从,每个节点如果都设置了密码。需要在这里配置好对应密码供节点之间能够相互访问
masterauth <yourpassword>
# 打开集群模式
cluster-enabled yes
# 配置当前节点的集群配置文件名称,文件名称尽量对应当前节点的端口
cluster-config-file nodes-6379.conf
# 配置当前节点故障,重连的超时时间,不要设置太短,网络抖动并非真的故障会导致服务频繁主从切换
cluster-node-timeout 15000
# 当前节点暴露的ip,如果没有当前节点没有被发现,可以配置暴露ip
cluster-announce-ip
# 当前节点暴露的port
cluster-announce-port
# 当前节点暴露的总线端口,gossip协议使用此端口用来节点之间通信,默认是port加偏移量10000
cluster-announce-bus-port
启动cluster节点
redis-server redis.conf // 逐个节点启动
redis-cli -a <password> —cluster create [ host port ] —cluster-replicas <slave num> // 开启集群 并配置集群信息。 服务自动分配master和slave节点,并为其分片
网友评论