1、一个KEY过期了,redis是怎么处理的?
redis不会主动去轮询过期的KEY,这个KEY一直存留在redis占着内存,只有在使用到KEY的时候才会查询KEY是否过期。过期了就会清除这个KEY并释放内存;
同时redis还有一种主动内存回收机制,在redis.conf配置文件的最后有一个配置项zh,默认是zh=10,意思是1秒钟轮询10次,每次抽取100个KEY检查是否过期,如果过期了就清除键值对并释放内存,如果本次有超过25个KEY是过期的,就不会等到下一次轮询而继续抽取100个KEY检查是否过期;
当redis无法再为新KEY分配内存时,还有另外一种内存回收策略,这个策略是在redis.conf配置文件里配置的maxmemory-policy,一般是回收那些已经配置了过期时间的键值对,比如volatile_lru,根据lru算法对已设置过期时间的键值对进行回收。volatile_random是随机回收。volatile_ttl是删除使用频率最少的。allkeys_lru是对所有的键值对进行lru算法回收,不管你有没有设置过期时间。allkeys_random随机删除。还有一种是不回收内存noevietion,也就是说内存满时再塞键值对进去,服务端就报错并返回给客户端了。以上的回收策略不是对所有的KEY的,是随机抽取maxmemory-samples个KEY来判断。
2、一个KEY怎么到redis服务器查找缓存的?
对一个KEY进行CRC16运算得到一个值,在将这个值模以16384个槽位,得到的值就是key要存储的slot
3、redis cluster中的一个节点挂了,集群是怎么处理的?
slave挂了master上位,如果一个节点的master和slave都挂了,这个节点的槽位都转移到其它节点上。挂了的节点的数据也跟着转移到其它节点上
4、redis的内存持久化机制是什么?
有RDB和AOF两种,RDB出厂默认900秒内操作一个KEY、300秒内操作15个KEY、60秒内操作10000个KEY就持久化到RDB,RDB存储的是二进制格式的数据。
5、redis是单线程还是多线程?
redis是单进程单线程,memcached是基于libevent事件驱动的,属于单进程多线程。
redis只所以快,是因为使用了epoll内核,采用了多路复用技术,自己轻量级的实现epoll内核,而不使用libevent的重量级的功能。
6、redis是在客户端还是服务端进行HASH运算的?
redis是在服务端,客户端jedis只是负责将操作指令发送到服务端。
memcached是在客户端进行KEY和cache服务器的的一致性HASH运算