目录
1、redis的优点
2、redis的缺点
3. redis的线程模型
4. redis单线程模型效率高的原因
5. redis与Memcached的区别
大家好,我是四九城最豪横的小耳朵。
今天咱们来用大白话聊聊redis的优点,缺点,线程模型,与Memcached的区别。
1、 redis的优点
一. 速度快
Redis 本质上是一个 Key-Value 类型的内存数据库,整个数据库统统加载在内存当中进行操作,定期通过异步操作把数据库数据刷到硬盘上进行保存。
因为是纯内存操作,Redis 的性能非常出色,每秒可以处理超过 10 万次读写操作,是已知性能最快的 Key-Value 数据库。
二. 支持丰富数据类型
支持 String ,List,Set,Sorted Set,Hash 五种基础的数据结构。
Redis 的出色之处不是性能,而是支持保存多种数据结构,Memcached只支持String。此外单个 Value 的最大限制是 1GB,而 Memcached只能保存 1MB 的数据,因此 Redis 可以用来实现很多有用的功能。例如,用redis的 List 来做 FIFO 双向链表,实现一个轻量级的高性能消息队列服务。
三. 支持持久化存储
Redis 提供 RDB 和 AOF 两种数据的持久化存储方案,解决内存中的数据因redis宕机数据丢失风险。
四、支持高可用
1.内置 Redis Sentinel 高可用方案,实现主从故障自动转移。
2.内置 Redis Cluster 集群方案,实现基于槽的分片方案,从而支持更大的 Redis 规模。
五 . 丰富的特性
支持订阅发布 Pub / Sub 功能,支持Key 过期策略,支持事务,支持多个 DB。
2、 redis的缺点
1、同步的时候,由于需要生成 RDB 文件,并进行传输,会占用主机的 CPU ,并会消耗网络带宽。
2、修改配置文件进行重启的时候,需要将硬盘中的数据重新加载到内存,这个时间是比较久的。并且在这个过程中,Redis 不能对外提供服务。
3、虽然 Redis 本身有 Key 过期策略,但是还是需要提前预估和节约内存。如果内存增长过快,需要定期删除数据。
3、 redis 的线程模型
Redis 内部使用文件事件处理器 file event handler,这个文件事件处理器是单线程的,所以 Redis 才叫做单线程的模型。它采用 IO 多路复用机制同时监听多个 Socket,根据 Socket 上的事件来选择对应的事件处理器进行处理。
文件事件处理器的结构包含 4 个部分:
多个 Socket 。
IO 多路复用程序。
文件事件分派器。
事件处理器(连接应答处理器、命令请求处理器、命令回复处理器)。
多个 Socket 可能会并发产生不同的操作,每个操作对应不同的文件事件,但是 IO 多路复用程序会监听多个 socket,会将 socket 产生的事件放入队列中排队,事件分派器每次从队列中取出一个事件,把该事件交给对应的事件处理器进行处理。
客户端与 redis 的通信过程:
第一步,客户端 Socket01 向 Redis 的 Server Socket 请求建立连接,此时 Server Socket 会产生一个 AE_READABLE 事件,IO 多路复用程序监听到 server socket 产生的事件后,将该事件压入队列中。文件事件分派器从队列中获取该事件,交给连接应答处理器。连接应答处理器会创建一个能与客户端通信的 Socket01,并将该 Socket01 的 AE_READABLE 事件与命令请求处理器关联。
第二步,假设此时客户端发送了一个 set key value 请求,此时 Redis 中的 Socket01 会产生 AE_READABLE 事件,IO 多路复用程序将事件压入队列,此时事件分派器从队列中获取到该事件,由于前面 Socket01 的 AE_READABLE 事件已经与命令请求处理器关联,因此事件分派器将事件交给命令请求处理器来处理。命令请求处理器读取 Scket01 的 set key value 并在自己内存中完成 set key value 的设置。操作完成后,它会将 Scket01 的 AE_WRITABLE 事件与令回复处理器关联。
第三步,如果此时客户端准备好接收返回结果了,那么 Redis 中的 Socket01 会产生一个 AE_WRITABLE 事件,同样压入队列中,事件分派器找到相关联的命令回复处理器,由命令回复处理器对 socket01 输入本次操作的一个结果,比如 ok,之后解除 Socket01 的 AE_WRITABLE 事件与命令回复处理器的关联。
4、 redis 单线程模型效率高的原因
1、C 语言实现。
2、纯内存操作。Redis 为了达到最快的读写速度,将数据都读到内存中,并通过异步的方式将数据写入磁盘。所以 Redis 具有快速和数据持久化的特征。如果不将数据放在内存中,磁盘 I/O 速度为严重影响 Redis 的性能。
3、基于非阻塞的 IO 多路复用机制。
4、单线程,避免了多线程的频繁上下文切换问题。Redis 利用队列技术,将并发访问变为串行访问,消除了传统数据库串行控制的开销。
5、丰富的数据结构。Redis 全程使用 hash 结构,读取速度快,还有一些特殊的数据结构,对数据存储进行了优化。例如,压缩表,对短数据进行压缩存储。也因为 Redis 是单线程的,所以可以实现丰富的数据结构,无需考虑并发的问题。
5、 redis与Memcached的区别
1.数据结构层面对比
Redis 提供复杂的数据结构,丰富的数据操作,Memcached 仅提供简单的字符串。Redis 相比 Memcached 来说,拥有更多的数据结构,能支持更丰富的数据操作。如果需要缓存能够支持更复杂的结构和操作,Redis 会是不错的选择。
Memcached 不支持持久化存储,重启时,数据被清空。Redis 支持持久化存储,重启时,可以恢复已持久化的数据。所以这是Redis最终取代Memcached 的原因之一。
Redis 只使用单核,而 Memcached 可以使用多核,所以平均每一个核上 Redis在存储小数据时比 Memcached 性能更高。在 100k 以上的数据中,Memcached 性能要高于 Redis 。虽然 Redis 最近也在存储大数据的性能上进行优化,但是比起 Memcached,还是稍有逊色。
Memcached 是多线程,非阻塞 IO 复用的网络模型。Redis 使用单线程的 IO 复用模型,自己封装了一个简单的 AeEvent 事件处理框架,主要实现了 epoll , kqueue 和 select 。
简单的 Key-Value 存储的话,Memcached 的内存利用率更高,可以使用类似内存池。如果 Redis 采用 hash 结构来做 key-value 存储,由于其组合式的压缩, 其内存利用率会高于 Memcached 。
6. 集群模式对比
在 Redis支持 Cluster 模式。Memcached 没有原生的集群模式,需要依靠客户端来实现往集群中分片写入数据。
End
作者简介:豪横的小耳朵,一个豪横的程序员。想和大家一起在技术的世界里豪横,用技术的眼光去看待世界。欢迎扫描下方二维码,持续关注,一大波原创系列文章正在路上。
扫码关注后回复“666”,可免费获取下图所示的java高级工程师学习资料一份。
扫码关注后回复“1024”,可免费获取下图所示的价值1888的大数据学习资料一份。