1. 多线程网络IO
采用epoll的机制,实现一个Redis服务端接收多个客户端的并发网络IO请求(避免有时候Redis服务端处理速度快,而网络IO传输客户端请求慢,造成Redis CPU空闲),网络IO多线程连接,处理请求的还是单线程。
2. 客户端缓存
Redis服务端一次读取一定数据,将这些key-value缓存在客户端,下次客户端可以直接在自己内存中获取数据(当Redis中某些缓存在客户端的key-value值改变后会以广播形式通知相应的客户端,使得客户端内的数据缓存失效,客户端需要向Redis注册自己监听的数据)
3. 细粒度权限控制
像Linux操作系统一样可以创建多个子用户(Github团队成员权限分配),手动给每个用户分配相应的权限,这样可以限制一些人远程连接Redis后进行一些关键配置的更改。
4. RESP3通信协议
通信协议一般可以分为二进制字节码传输(直接通过TCP,UDP传输字节码),以及字符形式传输。RESP2后采用字符形式传输(如Http传输Json,xml等文本数据),3.0中可以在传输内容包头设置不同的标识字符来表示更多的传输数据类型(+,$, :, -, *)。
- PS: 一般MQ以及与硬件设备进行通信时选择TCP的字节码传输,网络带宽占用少,数据解析处理快,但是复用性差,可读性差,每个项目要实现规定好数据包的结构。
- 前后端交互一般使用基于Http(底层也是TCP/IP)的协议,直接传输Json等文本数据,可读性好,复用性强。
5. 未来Redis基于NVM内存的可能性
NVM的特点:
- 容量大;
- 可以像磁盘一样直接持久化(省去RDB和AOF,但是要主从复制时要找替代方法);
- 读写速度略低于传统的DRAM内存条(可用性与可靠性平衡)
6. Memcached内存键值数据库
使用的是一致性hash算法分配键值数据,适合需要较大的数据库集群时使用(Redis是使用hash slot的方式,数据本来就被放到了slot里面,所以单个Redis可以存放少数的slot来达到存放大量键值对的情况,不需要太多的数据库实例来形成大集群);
但是Memcached只支持String类型数据
7. RocksDB
大容量的持久化键值对数据库,并且支持MySQL一样的表结构来存放键值对,但是读写性能差。
8. 集群部署选择
Redis Cluster,Redis Codis,Memcached
可扩展性 Memcached > Redis Codis > Redis Cluster(集群规模由大到小)
参考文章:
https://time.geekbang.org/column/article/313129