1)说一下Redis 的数据类型有哪些
String :可以存储任何数据,字符串、图片、序列化对象等等
哈希:键值对集合,特别适合存储对象(string也可以存储对象,但是需要序列化和反序列化,并且只能整体修改,不能修改属性)
List:双向链表,支持左右两头的插入,增删快
Set:无序集合、基于哈希表实现
ZSet:有序集合,基于set 增加了一个socre 权重
2)redis 的 rehash 过程
渐进式哈希
单线程,不可能全量rehash,这样redis 会中断
当哈希表H1容量满了为N,则会开辟一个空间 H2,其容量为2N ,哈希表同时持有H1 和H2
在哈希表容量没有满时,其reHashIndex 为 -1;需扩容时,reHashIndex 设置为0,指向H1的第0个节点
当该哈希表每经过一次CRUD 时,就将 H1 中的一个元素移动到H2中,直到reHashIndex 达到N-1,此时reHash完成,reHashIndex 再次被设置为-1
3)redis 怎么进行数据持久化
RDB:
完整数据快照
按照配置策略定时触发备份
备份时fork 出一个子进程出来进行RDB 生成
如果有数据进行修改时,利用操作系统的COW会拷贝出新页,从而不应影响备份的数据
文件小且集中
数据恢复迅速
遍历整个内存,加重系统负担
最后一次备份到宕机中间的数据会丢失
AOF:
记录的是增删改的操作
操作是追加到AOF 文件末尾的
可以做到实时备份、备份数据完整
文件太大
数据恢复慢
混合模式:
fork 出子进程进行RDB 全数据备份
同时记录开始RDB备份后的所有AOF操作
4)redis 三种集群模式,分别有什么特点
主从:
从节点 用slave of命令加入到主节点后向主节点发起同步请求
主节点执行BGSAVE 生成快照并记录生成快照期间的aof
将快照发送给 slave ,slave 载入快照
将aof 发送给slave ,slave载入aof
可解决数据备份问题、读写分离问题
无法做到动态扩容
主节点宕机需要人为干预恢复
主从数据一致
哨兵:
哨兵是对主从的一个优化
启动一个哨兵去监控主节点
主节点一旦宕机,哨兵节点会开启选举,选择一个salve 节点作为master
会选择复制偏移量最大的那个节点作为新的master
无法移除宕机的 slave
也无法做到动态扩容
节点间的数据一致
集群:
多个主从组成的集群
主节点之间相互通讯
从节点只是用于主节点宕机时的崩溃恢复
数据分散到各个实例上
一致性哈希解决扩容问题
master间进行pingpong 通讯,判断节点是否失联,如果失联超过一定时间则判断为宕机
如果超过一半的节点人为该节点宕机,那么就让该主节点下线,用其从节点替换
选择复制偏移量最大的从节点作为新的主节点,接管原主节点所有卡槽
并向集群内其他主节点发送pingpong 消息,集群恢复,对外提供服务
集群中如果主节点宕机且没有从节点补充,那么集群也挂了
redis更新 缓存与数据 库数据 不同步时,采用延迟双删策略 。
redis支持发布 订阅方式,类似于观察者模式,消息渠道 发布消息,订阅者 订阅这个渠道的消息 ,银行客消费时,发布交易信息到短信,微信等。
发布订阅监听类,监听容器 。
redis内存淘汰 策略,默认noevication 不淘汰,
volatile-lru 淘汰超时的,
volatile-ttl 淘汰存活时间最短的
volatile-random 淘汰随机超时的
allkeys-random 淘汰所有的
allkeys-lru 淘汰最近 最少 使用的
5)redis缓存写满了怎么办?
首先要明确, 用作缓存的数据都是设置了过期时间的, 没有过期时间那不叫缓存, 那叫持久化.
我们的业务量并没有那么大
如果遇到缓存满了又该怎么办呢?
加内存
这是最简单粗暴的办法, 不过成本相对较高
内存淘汰策略
redis的内存淘汰策略是指在Redis的用于缓存的内存不足时, 怎么处理需要新写入且需要申请额外空间的数据.
maxmemory参数: 设置内存的最大使用量(配置)
maxmemory-policy参数: 对应的内存淘汰规则(配置), 当内存不够用时, 会设置的内存淘汰规则
规则 规则说明
noeviction 当内存不足以容纳新写入的数据时, 新写入操作会报错
allkeys-lru 当内存不足以容纳新写入数据时, 在键空间中, 移除最近最少使用的key
allkeys-random 当内存不足以容纳新写入数据时, 在键空间中, 随机移除某个key
volatile-lru 当内存不足以容纳新写入数据时, 在设置了过期时间的键空间中, 移除最近最少使用的key
volatile-ttl 当内存不足以容纳新写入数据时, 在设置了过期时间的键空间中, 有更早过期时间的key优先移除
集群slaveof 从机替换主机, 主机下来后做相应的操作
配置多主多从
内存淘汰策略,毕竟都是缓存,缓存的意义就是为了减缓数据库的压力。
那么淘汰1.最少使用 2. 随机移除 3. 移除带过期时间的key最少使用的 4.删除最早时间的
总之就是,配置内存淘汰策略一般不会超出的。
6,redis集群之间通讯
在分布式存储中需要提供维护节点元数据信息的机制,所谓元数据是指:节点负责哪些数据,是否出现故障等状态信息。
常见的元数据维护方式分为:集中式和P2P方式。
Redis集群采用P2P的Gossip(流言)协议,Gossip协议工作原理就是节点彼此不断通信交换信息,一段时间后所有的节点都会知道集群完整的信息,这种方式类似流言传播
常用的Gossip消息可分为:meet消息(新节点的加入)、ping消息(周期性的通知)、pong消息(周期性的接收)、fail消息(节点下线)
扩展:zookeeper节点间通讯
Leader服务器会和每一个Follower/Observer服务器都建立TCP连接,同时为每个F/O都创建一个叫做LearnerHandler的实体。LearnerHandler主要负责Leader和F/O之间的网络通讯,包括数据同步,请求转发和Proposal提议的投票等。Leader服务器保存了所有F/O的LearnerHandler。
消息类型主要是:leader、follower、observer等。
7.redis各类型应用
string类型的应用:
1.缓存: 经典使用场景,把常用信息,字符串,图片或者视频等信息放到redis中,redis作为缓存层,mysql做持久化层,降低mysql的读写压力。
2.计数器:redis是单线程模型,一个命令执行完才会执行下一个,同时数据可以一步落地到其他的数据源。
3.session:常见方案spring session + redis实现session共享,
hash的应用:
1.缓存: 能直观,相比string更节省空间,的维护缓存信息,如用户信息,视频信息等。
list(链表 有序)的应用:
1.timeline:例如微博的时间轴,有人发布微博,用lpush加入时间轴,展示新的列表信息。
set集合(不重复,无序)
1.标签(tag),给用户添加标签,或者用户给消息添加标签,这样有同一标签或者类似标签的可以给推荐关注的事或者关注的人。
2.点赞,或点踩,收藏等,可以放到set中实现
zset有序集合
1.排行榜:有序集合经典使用场景。例如小说视频等网站需要对用户上传的小说视频做排行榜,榜单可以按照用户关注数,更新时间,字数等打分,做排行。