当前位置:网站首页>走进Redis,让你重新认识redis。绝不是表面
走进Redis,让你重新认识redis。绝不是表面
2022-07-30 21:08:00 【InfoQ】
为什么要使用缓存?
为什么Redis那么快
- C语言实现,效率高(因为C是面向过程的编程语言,并且更接近底层)
- 单线程避免了多线程情况下频繁的上下文切换
- 基于非阻塞的IO复用模型机制(这有兴趣的小伙伴可以了解一下IO多路复用的机制)
- 纯内存操作
- 丰富的数据结构(hash结构、跳跃表等)
- 还有一点是:偏向 计算向数据移动
如何去理解Redis的线程模型
file event handler- 多个socket
- IO多路复用程序
- 文件事件分派器
- 事件处理器(连接应答处理器、命令请求处理器、命令回复处理器)

- 首先:客户端socket 01向redis 的server socket请求建立连接,此时Server Socket 会产生一个
AE_READABLE事件,IO多路复用程序监听到server socket产生的事件后,将该事件压入到队列中,文件事件分派器从队列中获取该事件交给连接应答处理器。连接应答处理器会创建一个能与客户端通信的socket 01,并将socket 01的AE_READABLE事件与命令请求处理器关联。
- 假设此时客户端发送了一个set key value的请求,此时Redis中的socket 01 会产生一个AE_READABLE事件,IO多路复用程序会将该事件压入队列中,此时事件分派器从队列中获取该事件,由于前面socke 01的AE_READABLE已经与命令请求处理器关联,因此事件分派器将事件交给命令请求处理器来处理。命令请求处理器读取socket 01的set key value 并在自己的内存中完成设置,操作完成后,它会将socket 01的AE_WRITABLE事件与命令回复处理器关联
- 如果此时客户端已经做好了接收返回结果的准备,那么Redis中的socket 01 会产生一个
AE_WRITABLE事件,同样压入队列中,事件分派器找到相关联的命令回复处理器,由命令回复处理器对socket 01 输入本次操作的一个结果,比如:ok。之后就会解除socket 01 的AE_WIRTABLE事件与命令回复处理器的关联。
- 以上就是完成了一次客户端与redis的通信
Redis 问什么要基于内存去操作数据?
硬盘:
- 寻址--毫秒ms级别的。
- 高传输带宽在传输大块连续数据时具有优势
- 高IOPS在传输小块不连续的数据时具有优势
- 磁盘的 IOPS,也就是在一秒内,磁盘进行多少次 I/O 读写。
- 磁盘的吞吐量(指的是硬盘或设备(路由器/交换机)在传输数据的时候数据流的速度即使同一块硬盘在写入不同大小的数据时、表现出来的带宽也是不同的),也就是每秒磁盘 I/O 的流量,即磁盘写入加上读出的数据的大小。
内存
- 纳秒ns级别的。秒=1000毫秒=1000*1000微妙=1000*1000*1000纳秒。在寻址上,磁盘比内存慢了10万倍。
Reids缺点:
- 由于是内存数据库,所以单台机器存储的数据量跟机器本身的内存大小有关。虽然redis本身有key过期策略,但是还是需要提前预估和节约内存。如果内存增长过快,需要定期删除数据
- 定时删除和定期删除为主动删除,Redis会定期主动淘汰一批已过去的key
- 惰性删除为被动删除,用到的时候才会去检验key是不是已过期,过期就删除过期的key
- 惰性删除是redis服务器内置策略(过期的key对aof文件没有任何影响,删除过期的key时系统会向aof文件追加一条del;如果key过期了但是没有删除,此时进行持久化操作这个key不会进入aof文件,因为没有发生修改指令)
- 如果进行完整重同步,由于需要生成rdb文件,并进行传输,会占用主机的CPU,并会消耗现网的带宽。不过redis2.8版本以后,已经有部分重同步的功能,但是还是有可能有完整重同步的。比如,新上线的从库
- 修改配置文件,进行重启,将硬盘中的数据加载进内存,时间比较久。在这个过程中,redis不能提供服务。
为什么使用Redis而不选择Memcache呢?
- Redis 和 Memcache 都是将数据存放在内存中,都是内存数据库。不过 Memcache 还可用于缓存其他东西,例如图片、视频等等
- Memcache 仅支持key-value结构的数据类型,Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,hash等数据结构的存储。
- 虚拟内存– Redis 当物理内存用完时,可以将一些很久没用到的value 交换到磁盘
- 分布式–设定 Memcache 集群,利用 magent 做一主多从; Redis 可以做一主多从。都可以一主多从
存储数据安全– Memcache 挂掉后,数据没了; Redis 可以定期保存到磁盘(持久化)
Memcache 的单个value最大 1m , Redis 的单个value最大 512m。
灾难恢复– Memcache 挂掉后,数据不可恢复; Redis 数据丢失后可以通过 aof 恢复
Redis 原生就支持集群模式, Redis3.0 版本中,官方便能支持Cluster模式了, Memcached 没有原生的集群模式,需要依赖客户端来实现,然后往集群中分片写入数据。
- Memcached 网络IO模型是多线程,非阻塞IO复用的网络模型,原型上接近于 nignx 。而 Redis使用单线程的IO复用模型,自己封装了一个简单的 AeEvent 事件处理框架,主要实现类epoll,kqueue 和 select ,更接近于Apache早期的模式。
为什么要使用缓存?
为什么Redis那么快
- C语言实现,效率高(因为C是面向过程的编程语言,并且更接近底层)
- 单线程避免了多线程情况下频繁的上下文切换
- 基于非阻塞的IO复用模型机制(这有兴趣的小伙伴可以了解一下IO多路复用的机制)
- 纯内存操作
- 丰富的数据结构(hash结构、跳跃表等)
- 还有一点是:偏向 计算向数据移动
如何去理解Redis的线程模型
file event handler- 多个socket
- IO多路复用程序
- 文件事件分派器
- 事件处理器(连接应答处理器、命令请求处理器、命令回复处理器)

- 首先:客户端socket 01向redis 的server socket请求建立连接,此时Server Socket 会产生一个
AE_READABLE事件,IO多路复用程序监听到server socket产生的事件后,将该事件压入到队列中,文件事件分派器从队列中获取该事件交给连接应答处理器。连接应答处理器会创建一个能与客户端通信的socket 01,并将socket 01的AE_READABLE事件与命令请求处理器关联。
- 假设此时客户端发送了一个set key value的请求,此时Redis中的socket 01 会产生一个AE_READABLE事件,IO多路复用程序会将该事件压入队列中,此时事件分派器从队列中获取该事件,由于前面socke 01的AE_READABLE已经与命令请求处理器关联,因此事件分派器将事件交给命令请求处理器来处理。命令请求处理器读取socket 01的set key value 并在自己的内存中完成设置,操作完成后,它会将socket 01的AE_WRITABLE事件与命令回复处理器关联
- 如果此时客户端已经做好了接收返回结果的准备,那么Redis中的socket 01 会产生一个
AE_WRITABLE事件,同样压入队列中,事件分派器找到相关联的命令回复处理器,由命令回复处理器对socket 01 输入本次操作的一个结果,比如:ok。之后就会解除socket 01 的AE_WIRTABLE事件与命令回复处理器的关联。
- 以上就是完成了一次客户端与redis的通信
Redis 问什么要基于内存去操作数据?
硬盘:
- 寻址--毫秒ms级别的。
- 高传输带宽在传输大块连续数据时具有优势
- 高IOPS在传输小块不连续的数据时具有优势
- 磁盘的 IOPS,也就是在一秒内,磁盘进行多少次 I/O 读写。
- 磁盘的吞吐量(指的是硬盘或设备(路由器/交换机)在传输数据的时候数据流的速度即使同一块硬盘在写入不同大小的数据时、表现出来的带宽也是不同的),也就是每秒磁盘 I/O 的流量,即磁盘写入加上读出的数据的大小。
内存
- 纳秒ns级别的。秒=1000毫秒=1000*1000微妙=1000*1000*1000纳秒。在寻址上,磁盘比内存慢了10万倍。
Reids缺点:
- 由于是内存数据库,所以单台机器存储的数据量跟机器本身的内存大小有关。虽然redis本身有key过期策略,但是还是需要提前预估和节约内存。如果内存增长过快,需要定期删除数据
- 定时删除和定期删除为主动删除,Redis会定期主动淘汰一批已过去的key
- 惰性删除为被动删除,用到的时候才会去检验key是不是已过期,过期就删除过期的key
- 惰性删除是redis服务器内置策略(过期的key对aof文件没有任何影响,删除过期的key时系统会向aof文件追加一条del;如果key过期了但是没有删除,此时进行持久化操作这个key不会进入aof文件,因为没有发生修改指令)
- 如果进行完整重同步,由于需要生成rdb文件,并进行传输,会占用主机的CPU,并会消耗现网的带宽。不过redis2.8版本以后,已经有部分重同步的功能,但是还是有可能有完整重同步的。比如,新上线的从库
- 修改配置文件,进行重启,将硬盘中的数据加载进内存,时间比较久。在这个过程中,redis不能提供服务。
为什么使用Redis而不选择Memcache呢?
- Redis 和 Memcache 都是将数据存放在内存中,都是内存数据库。不过 Memcache 还可用于缓存其他东西,例如图片、视频等等
- Memcache 仅支持key-value结构的数据类型,Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,hash等数据结构的存储。
- 虚拟内存– Redis 当物理内存用完时,可以将一些很久没用到的value 交换到磁盘
- 分布式–设定 Memcache 集群,利用 magent 做一主多从; Redis 可以做一主多从。都可以一主多从
存储数据安全– Memcache 挂掉后,数据没了; Redis 可以定期保存到磁盘(持久化)
Memcache 的单个value最大 1m , Redis 的单个value最大 512m。
灾难恢复– Memcache 挂掉后,数据不可恢复; Redis 数据丢失后可以通过 aof 恢复
Redis 原生就支持集群模式, Redis3.0 版本中,官方便能支持Cluster模式了, Memcached 没有原生的集群模式,需要依赖客户端来实现,然后往集群中分片写入数据。
- Memcached 网络IO模型是多线程,非阻塞IO复用的网络模型,原型上接近于 nignx 。而 Redis使用单线程的IO复用模型,自己封装了一个简单的 AeEvent 事件处理框架,主要实现类epoll,kqueue 和 select ,更接近于Apache早期的模式。
边栏推荐
- opencv,numpy,tensor格式转换
- 弹性盒子模型
- Network layer protocol------IP protocol
- chrome扩展:如何使对话框位于当前窗口的右侧?
- awk笔记
- KingbaseESV8R6 snapshot too old的配置和测试
- 【网络安全专栏目录】--企鹅专栏导航
- DPW-SDNet: Dual Pixel-Wavelet Domain Deep CNNsfor Soft Decoding of JPEG-Compressed Images
- MySQL----多表查询
- Image Restoration by Estimating Frequency Distribution of Local Patches
猜你喜欢
随机推荐
【网络安全专栏目录】--企鹅专栏导航
[Nuxt 3] (十三) Nuxt 是如何工作的?
flyway的快速入门教程
MySQL笔记1(数据库的好处,数据库的概念,数据库的特点,MySQL的启动,数据模型,SQL)
[Deep Learning] Understanding of Domain Adaptation in Transfer Learning and Introduction of 3 Techniques
chrome扩展:如何使对话框位于当前窗口的右侧?
Deep Non-Local Kalman Network for VideoCompression Artifact Reduction
手把手教你搭建一台永久运行的个人服务器
GateWay实现负载均衡
Swift RegexBuilder Vs. Raku Grammar
Use the map function to operate on each element in the list It seems that you don't need a map
7、MySQL Workbench 导出导入数据库
Image Restoration by Estimating Frequency Distribution of Local Patches
用于视频压缩伪影消除的深度卡尔曼滤波网络
5分钟搞懂MySQL - 行转列
MYSQL 唯一约束
What is the common factor
使用map函数,对list中的每个元素进行操作 好像不用map
QUALITY-GATED CONVOLUTIONAL LSTM FOR ENHANCING COMPRESSED VIDEO
MySQL (2)









