Redis常见面试题
Redis和Memcache的区别
- Redis拥有更多的数据结构
- Redis相比Memcache来说,拥有更多的数据结构和支持更丰富的数据操作,通常在Memcache里,你需要将数据拿到客户端来进行类似的修改,在set进去。这就大大增加了网络IO的次数和体积,在Redis中,这些复杂的操作通常和一般的set/get一样高效。所以,如果需要缓存能够支持更复杂的结构和操作,那么Redis是不错的选择。
- 内存利用率对比
- 使用简单的key-value存储的话,Memcache的内存利用率更高,而Redis采用Hash结构来做key-value存储,由于其组合式的压缩,其内存利用率会高于Memcache。
- 性能对比
- 由于Redis只使用了单核,而Memcache可以使用多核,所以平均每核上Redis在存储小数据比Memcache性能更高,而在100K以上的数据中,Memcache性能更高,虽然Redis最近也在存储大数据的性能上进行优化,但是比起Memcache还有略有逊色。
- 集群模式
- Memcache没有原生的集群模式,需要依赖客户端来实现往集群中分片写入数据,但是Redis目前是原生支持cluster模式的。
Redis的线程模型
文件事件处理器
Redis基于reactor模式开发了网络事件处理器,这个处理器叫做文件事件处理器,file event handler,这个文件事件处理器是单线程的,因此Redis才叫做单线程的模型,采用IO多路复用机制同时监听多个socket,根据socket上的事件来选择相应的事件处理器来处理这个事件。
文件事件处理器是单线程模式下运行的,但是通过IO多路复用机制监听了多个socket,可以实现高性能的网络通信模型,又可以跟内部的其它单线程的模块进行对接,保证了Redis内部的线程模型的简单性。
文件事件处理器的结构包含4个部分:多个socket,IO多路复用程序,文件事件分派器,事件处理器等。
多个socket可能并发的产生不同的操作,每个操作对应不同的文件事件,但是IO多路复用程序会监听多个socket,但是会把socket放入到一个队列中排队,每次从队列中取出一个socket给事件分派器,事件分派器把socket给对应的时间处理器。


;每次我们一个socket请求过来 和 redis中的 server socket建立连接后,通过IO多路复用程序,就会往队列中插入一个socket,文件事件分派器就是将队列中的socket取出来,分派到对应的处理器,在处理器处理完成后,才会从队列中在取出一个。
这里也就是用一个线程,监听了客户端的所有请求,被称为Redis的单线程模型。
为什么Redis单线程模型效率这么高?
- 纯内存操作;
- 核心是非阻塞的IO多路复用机制;
- 单线程反而避免了多线程频繁上下文切换的问题;
Redis的Key的过期策略
Redis 的过期策略是指当Redis中缓存的Key过期了,Redis如何处理
- 惰性过期:只有当访问一个key时,才会判断可以是否已经过期,过期则删除。
- 该策略可以最大化的节省CPU资源。但咋在极端情况下可能出现大量过期key没有彩瓷被访问,从而不会被清除占用大量内存。
- 定时过期:给每个key设置一个定时器,定时器时间一到,就把这个Key删掉。
- 该方案对内存友好,对CPU不友好,需要实时监控。
- 定期过期:==每隔一定时间==,会==扫描一定数量的数据库中expires字段中一定数量的可以==,并清除其中已过期的key。该策略是前两种的这种方案。通过调整定时扫描的时间间隔和每次赛秒的限定耗时,可以在不同情况下是的CPU和内存资源达到最优的平衡结果。
Redis中使用了惰性过期和定期过期两种策略;
Redis的Key的命名规范
尽量短,用冒号连接
Redis的用法
大Key问题
Redis中的Hash
用法
小Key如何设置超时
本文是原创文章,采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 程序员小航
评论
匿名评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果