Redis6新特性
之前一直听别人说redis6出了,还实现了多线程,以后面试官问redis是单线程还是多线程
这样的问题肯定要涨10个百分点,今天就结合antirez
的博客和github文档看看redis到底实现了什么新技能。先看下antirez
的概览:
- 许多新的模块API。
- 更好过期算法。
- SSL支持。
- ACL支持。
- 新的RESP3协议。
- 客户端缓存。
- 多线程I/O。
- 副本的无盘复制。
- redis-benchmark支持和redis-cli改进。
- Systemd 支持重写。
- redis集群代理的发布。
- disque模块的发布。
我们分别来看看redis每个特性的主要特点。
ACL
在redis6以前,无法进行用户权限管理,只有一个auth
密码验证的功能,如果验证码通过那么就是root权限,如果我们想要禁用一些redis指令,只能使用rename
将原指令名字修改,这样做很不方便。而在redis6中引入了ACL模块,可以定制不同用户的权限,包括:
- 用户名和密码。
- 可以执行的指令。
- 可以操作的key。
root密码登入的用户名为default
,查看ACL列表的指令为:ACL LIST
。
127.0.0.1:6379> acl list
格式为:user 用户名 on 密码(如果没有密码那么为nopass) 可以执行的指令 可以操作的key
- “user default on #06f2fc19c20fc7aae5e74974e7ea85fab4093055564939ebf2102d9ed3d13afc ~* +@all”
- “user bigkai on #565c9a0d69440194596f8bf3cf3c5b1f904245f5c539a72a5a4f9baddd933dce ~* +@all -set”
ACL规则:下面是有效ACL规则的列表。某些规则只是用于激活或删除标志,或对用户ACL执行给定更改的单个单词。其他规则是字符前缀,它们与命令或类别名称、键模式等连接在一起。
启动和禁用用户:
-
on
:激活某用户账号。 -
off
:禁用某用户账号。注意,已验证的连接仍然可以工作。如果默认用户被标记为off
,则新连接将在未进行身份验证的情况下启动,并要求用户使用AUTH选项发送AUTH或HELLO,以便以某种方式进行身份验证。
权限的添加删除:
-
+<command>
:将指令添加到用户可以调用的指令列表中。 -
-<command>
:从用户可执行指令列表移除指令。 -
+@<category>
:添加该类别中用户要调用的所有指令,有效类别为@admin
、@set
、@sortedset
…等,通过调用ACL CAT
命令查看完整列表。特殊类别@all
表示所有命令,包括当前存在于服务器中的命令,以及将来将通过模块加载的命令。 -
-@<actegory>
:从用户可调用指令中移除类别。 -
allcommands
:+@all
的别名。 -
nocommand
:-@all
的别名。
可操作键的添加或删除:
~<pattern>
:添加可作为用户可操作的键的模式。例如~*
允许所有的键。
例如
查看指令:
# 查看所有指令分类
127.0.0.1:6379> acl cat
# 查看某个分类下的指令
127.0.0.1:6379> acl setuser cat
创建一个用户账号:
# acl setuser 用户名 on 密码(可多个) 权限 键模式
127.0.0.1:6379> acl setuser testuser on >testuser1 >testuser2 >testuser3 +@all ~*
禁用用户:
# 激活用户账号是将off替换为on
127.0.0.1:6379> acl setuser testuser off
查看所有用户名字:
127.0.0.1:6379> acl users
查看所有用户信息:
127.0.0.1:6379> acl list
查看当前用户:
127.0.0.1:6379> acl whoami
删除当前用户:
127.0.0.1:6379> acl deluser test
RESP3
RESP(REdis Serialization Protocol)是 redis 服务端与客户端之间通信的协议。redis以前使用的是RESP2,而redis6在兼容RESP2的基础上,开始支持RESP3。
RESP3在性能上并没有很大的提升,它主要的作用是扩展redis的数据结构和语义。RESP3 新增了许多类型,比如Null
、Double
、Boolean
、Blob error
等,不同于RESP2只是返回字符流 ,RESP3 返回类型包含足够的信息以返回适当的数据类型,即HGETALL
将返回 RESP3 Map,而LRANGE
将返回 Array,而EXISTS
将返回 RESP3 Boolea。
多线程I/O
询问redis是单线程还是多进程是所有入门文档的Hello World
,在今年antirez
终于在他的博客上宣布redis实现多进程,真是可喜可贺,可喜可贺。在这里你一定要记住了,redis是单进程的
,多进程是不可能多进程的,这辈子都不会多进程(惊不惊喜,意不意外)。官方的解释是:
概括来说就是:
- CPU成为redis瓶颈的情况并不常见,可能性更高的是内存和网络的约束。
- 从redis4开始会将多线程技术用于数据清理、模块方法调用。
然后现在为了解决网络IO的问题,redis使用了多进程,对网络事件进行电梯,分发给工作线程处理,处理完之后再交给主线程进行执行操作,执行之后交给工作线程回写响应数据:图片来源于https://zhuanlan.zhihu.com/p/118450227
其它
SSL支持:
redis6 提供了通过SSL加密通信流的能力。在此版本之前,redis中的加密需要其他应用程序提供实现。
客户端缓存:
redis实现的是一个服务端协助的客户端缓存,叫做tracking。要实现客户端缓存与redis缓存一致,需要开启tracking和广播模式, redis会记住每个客户端请求的key,当key的值发现变化时会发送失效的信息给客户端。失效信息RESP3协议发送给请求的客户端(即使它没请求过对应的key)。
cluster管理:
redis-cli集成了redis-trib.rb,优化了redis-benchmark,benchmark工具也支持cluster,可以通过多线程的方式对多个分片进行压测。
过期策略优化:
过期策略已在redis6中进行了重写,以允许更快的到期,从而更接近于生存时间(time-to-live, TTL)属性。
Proxy:
redis6 提供了一个完整的集群代理,以帮助不支持redis集群API的语言平台连接到redis集群,只需要一个简单的单实例库实现。Redis集群代理是多线程的,默认情况下,它当前使用一个多路复用通信模型,每个线程都有自己到集群的连接,该连接共享给属于线程本身的所有客户端。
Disque:
Disque是一个基于redis的消息队列工具,如果业务里不要求消息的严格顺序,那么使用它就可以了。