Redis是单线程还是多线程?
Redis 6.0的版本之前的单线程是指网络IO和键值对读写是由单个线程去完成的.
而Redis6.0增加的多线程,是指Redis在网络请求的情况下是采用了多线程,而对键值对的读写操作还是由单线程去处理的,所以对于Redis中的数据而言,依旧是并发安全的
但是持久化、集群数据同步其实是由其他线程去进行完成的
Redis单线程为什么还能这么快?
1、命令执行基于内存操作,一般一条命令在内存中操作的时间是几十纳秒.
2、命令执行单线程,不需要担心线程切换开销.
3、采用了IO多路复用机制(Reactor)机制,提升了Redis的IO利用率
4、高效的数据存储结构:全局hash表及多种高效数据结构,比如:跳表、压缩列表、链表等.
Redis底层数据是如何用跳表来存储的?
比如zset如果以链表存储有序值,虽然插入数据很快,但是有一个缺陷,如果要寻找或是插入数据的位置比较靠后,需要从表头一个个顺序寻找,需要进行多次寻址,效率变低..
而跳表会给数据增加冗余索引,比如 1、2、3、4、5、6、7、8、9、10. 你想寻找8,就需要1->2->3->4->5->6->7->8(依次寻找),但是冗余了1、3、5、7、9的话,只需要查询1->3->5->7->8(先在上层冗余数据中寻找是否有大于该值的,如果下个数据比所要插入或是寻找的数据大则往下一层冗余字段寻找),类似于折半查找,能够减少查询的次数.并且在冗余的数据上可以再次进行冗余.
能够更快的寻找到对应的元素,并且插入和删除数据的速度还是非常快.
Redis Key过期了为什么内存没释放?
1、可能有后续对同一个key的set命令没有设置EX参数,进行覆盖了
2、Redis的过期key的处理策略有惰性和定时删除 惰性:当处理到过期key的时候会触发惰性删除策略,会进行删除key 定时删除:因为惰性删除无法保证冷数据能够被及时删除,所以还有定时删除策略来定期清除(默认每100ms)一批过期的key,并不会一次性将所有的key进行清除.
Redis Key没设置过期时间为什么被Redis主动删除了?
当Redis已用内存空间超过maxmemory限定时,会触发主动清除策略
a、针对设置了过期时间的key做处理:
1.volatile-ttl :在筛选时会针对过期时间做筛选,过期时间越早的越先删除
2.volatile-random:在设置过期时间的键值对中随机进行删除
3.volatile-lru:使用lru算法筛选设置了过期时间的key进行删除
4.volatile-lfu:使用lfu算法筛选设置了过期时间的键值对删除
b、针对所有的key做处理:
5.allkeys-random:从所有键值对中随机选择并删除数据.
6.allkeys-lru:使用lru算法从所有键值对中进行筛选删除.
7.allkeys-lfu:使用lfu算法从所有键值对中进行筛选删除.
c、不处理
8.noviction:不会删除任何数据,但是会拒绝所有的写操作并且返回错误提示,只响应读操作.
标签:面试题,删除,过期,Redis,键值,key,整理,冗余 From: https://www.cnblogs.com/youjunhui/p/17087535.html