目录
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,还是稍有逊色。
- 网络 IO 模型对比
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的大数据学习资料一份。