1 我的数据存入redis了但是怎么不见了?
redis的内存使用是有限的,一直向redis中写入数据(如果配置了allkeyLRU)就会触发内存淘汰机制,将最近没有访问过的的key,value删除掉。
2 数据设置了过期时间,到时间以后内存仍然看不到明显被释放呢?
redis如果key设置了过期时间,清除算法是 “随机淘汰机制”+“被动删除机制”;当redis有一批key到达了过期时间,则会随机抽样删除一部分key,但是很多key会在你访问的时候去校验,如果过期则直接删除给你返回空值。这样做大大提升了redis的性能,否则加入几十万个key同时国企,redis又要完全主动删除则会非常消耗cpu!!!
3 redis为什么性能这么好
1)基于内存的数据存储;
2)单线程内存模型,相比多线程会省去很多并发处理的内部逻辑,从而提高了效率‘
3)多路复用机制,数据插入时由带有Looper监控的异步队列处理机制控制,并发性极好
4)采用RESP协议,实现容易,解析速度快,而且可读性很高。
4 redis的主从复制原理
1)redis主从同步是基于RDB的快照进行的,当发生数据同步时,master节点会fork出子进程来进行dump.rdb的生成,如果配置了无磁盘化的操作时则将rdb直接发送给slave节点,并不会将dump.rdb放在本地一份;salve收到dump.rdb数据以后会落地磁盘然后将数据加载到内存。
2)那么redis2.8以后也支持断点续传,重启后任然可以根据offset继续发送数据。
5 reids“集群脑裂”和“异步复制”丢失数据问题:
(1)如果master写入数据后直接挂掉,slave还没来得及同步数据。
(2)脑裂:1个master,2个slave节点,如果master突然出现网络分区那么剩余的两个slave节点就会从中选举出一个节点作为master。这个时候集群中就会出现两个master,而这时有可能client还没有指向到新的master;而被分区的master恢复正常以后重新以slave身份加入集群会清除掉自己的数据,然后重新同步新的master数据,在这里会丢失数据。
解决办法:
配置参数min-slaves-to-write:1 master至少有1个slave节点挂接否则将拒绝客户端写入。
配置参数min-slaves-max-lag:10 如果master异步复制到slave的节点数据ack超过10秒,则master拒绝客户端写入
这样配合设置能够保证最多只丢失10秒的数据;当master拒绝后,客户端无法链接时jedis提供了mapcache机制,暂时保存数据,等到切换master成功后会将数据发送过去。
6 redis的savecheck检查点
- 5分钟 1个key变化就复制一份
- 1分钟100个key变化就复制一份
- 1秒钟1000key变化就复制一份