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给对应的时间处理器。

20211128212453.png

20211128212501.png

;每次我们一个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如何设置超时