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模块,可以定制不同用户的权限,包括:

  1. 用户名和密码。
  2. 可以执行的指令。
  3. 可以操作的key。
    root密码登入的用户名为default,查看ACL列表的指令为:ACL LIST
127.0.0.1:6379> acl list
# 格式为:user 用户名 on 密码(如果没有密码那么为nopass) 可以执行的指令 可以操作的key
1) "user default on #06f2fc19c20fc7aae5e74974e7ea85fab4093055564939ebf2102d9ed3d13afc ~* +@all"
2) "user bigkai on #565c9a0d69440194596f8bf3cf3c5b1f904245f5c539a72a5a4f9baddd933dce ~* +@all -set"

ACL规则:下面是有效ACL规则的列表。某些规则只是用于激活或删除标志,或对用户ACL执行给定更改的单个单词。其他规则是字符前缀,它们与命令或类别名称、键模式等连接在一起。

启动和禁用用户:

  1. on:激活某用户账号。
  2. off:禁用某用户账号。注意,已验证的连接仍然可以工作。如果默认用户被标记为off,则新连接将在未进行身份验证的情况下启动,并要求用户使用AUTH选项发送AUTH或HELLO,以便以某种方式进行身份验证。

权限的添加删除:

  1. +<command>:将指令添加到用户可以调用的指令列表中。
  2. -<command>:从用户可执行指令列表移除指令。
  3. +@<category>:添加该类别中用户要调用的所有指令,有效类别为@admin@set@sortedset…等,通过调用ACL CAT命令查看完整列表。特殊类别@all表示所有命令,包括当前存在于服务器中的命令,以及将来将通过模块加载的命令。
  4. -@<actegory>:从用户可调用指令中移除类别。
  5. allcommands+@all的别名。
  6. 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 新增了许多类型,比如NullDoubleBooleanBlob error等,不同于RESP2只是返回字符流 ,RESP3 返回类型包含足够的信息以返回适当的数据类型,即HGETALL将返回 RESP3 Map,而LRANGE将返回 Array,而EXISTS将返回 RESP3 Boolea。

多线程I/O

询问redis是单线程还是多进程是所有入门文档的Hello World,在今年antirez终于在他的博客上宣布redis实现多进程,真是可喜可贺,可喜可贺。在这里你一定要记住了,redis是单进程的,多进程是不可能多进程的,这辈子都不会多进程(惊不惊喜,意不意外)。官方的解释是:
在这里插入图片描述
概括来说就是:

  1. CPU成为redis瓶颈的情况并不常见,可能性更高的是内存和网络的约束。
  2. 从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的消息队列工具,如果业务里不要求消息的严格顺序,那么使用它就可以了。

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐