11、Redis6 新特性

新特性

 

  • ACL用户权限控制功能
  • IO多线程支持
  • 工具支持 Cluster
  • RESP3:新的 Redis 通信协议
  • Client side caching客户端缓存
  • Proxy集群代理模式
  • Modules API
  • 新的 Expire 算法
  • SSL支持
  • 新的RESP3协议
  • 副本的无盘复制
  • redis-benchmark支持和redis-cli改进
  • Systemd 支持重写
  • disque模块的发布

ACL

Redis ACL是Access Control List(访问控制列表)的缩写,该功能允许根据可以执行的命令和可以访问的键来限制某些连接。

在Redis 5版本之前,Redis 安全规则只有密码控制 还有通过rename 来调整高危命令比如 flushdb , KEYS* , shutdown 等。Redis 6 则提供ACL的功能对用户进行更细粒度的权限控制 :

  • 接入权限:用户名和密码;
  • 可以执行的命令;
  • 可以操作的 KEY

acl list

使用acl list命令展现用户权限列表。可以查看用户可以操作哪些Key及命令。
 

acl cat

查看添加权限指令类别。

127.0.0.1:6379> acl cat 
 1) "keyspace"
 2) "read"
 3) "write"
 4) "set"
 5) "sortedset"
 6) "list"
 7) "hash"
 8) "string"
 9) "bitmap"
10) "hyperloglog"
11) "geo"
12) "stream"
13) "pubsub"
14) "admin"
15) "fast"
16) "slow"
17) "blocking"
18) "dangerous"
19) "connection"
20) "transaction"
21) "scripting"

acl cat 参数类型

加参数类型名可以查看类型下具体命令。

127.0.0.1:6379> acl cat string 
 1) "get"
 2) "append"

acl whoami

查看当前用户。

127.0.0.1:6379> acl whoami
"default"

aclsetuser

创建和编辑用户ACL。

ACL规则

以下是有效的ACL规则的列表。某些规则只是一个单词,用于激活或删除标志或对用户ACL执行给定的更改。其他规则是与命令或类别名称或键模式等串联的char前缀。
启用和禁止用户

  • on:启用用户:可以以该用户身份进行认证。
  • off:禁用用户:不再可以与此用户进行身份验证,但是已经过身份验证的连接仍然可以使用。请注意,如果默认用户标记为off,则无论默认用户配置如何,新连接都将开始不进行身份验证,并且要求用户使用AUTH选项发送AUTH或HELLO以进行身份验证。

允许和禁止命令

允许和禁止某些键

  • ~< pattern>:添加可以在命令中提及的键模式。例如~*允许所有键。该模式是类似于KEYS之一的glob样式的模式。可以指定多个模式。
  • allkeys:的别名~*。
  • resetkeys:刷新允许的键模式列表。例如ACL ~foo:* ~bar:* resetkeys ~objects:,将导致客户端只能访问与模式匹配的密钥objects:

允许和禁止发布/订阅频道

  • &< pattern>:添加用户可以访问的发布/订阅频道的全局样式模式。可以指定多个通道模式。请注意,仅对PUBLISH和SUBSCRIBE提及的通道进行模式匹配,而PSUBSCRIBE要求其通道模式与用户允许的通道模式之间进行文字匹配。
  • allchannels:别名&*,允许用户访问所有发布/订阅频道。
  • resetchannels:刷新允许的频道模式列表,如果用户的Pub / Sub客户端不再能够访问其各自的频道和/或频道模式,则断开其连接。

为用户配置有效密码

  • < password>:将此密码添加到用户的有效密码列表中。例如,>`mypass将“ mypass”添加到有效密码列表中。该指令清除nopass标志(请参阅下文)。每个用户可以具有任意数量的密码。
  • < < password>`:从有效密码列表中删除此密码。如果实际上未设置要删除的密码,则会发出错误。
  • #< hash>:将此SHA-256哈希值添加到用户的有效密码列表中。该哈希值将与为ACL用户输入的密码的哈希值进行比较。这允许用户将哈希存储在acl.conf文件中,而不是存储明文密码。仅接受SHA-256哈希值,因为密码哈希必须为64个字符,并且只能为容器的小写十六进制字符。
  • !< hash>:从有效密码列表中删除该哈希值。当您不知道哈希值指定的密码但想从用户中删除密码时,此功能很有用。
  • nopass:删除了用户设置的所有密码,并且该用户被标记为不需要密码:这意味着每个密码都将对该用户起作用。如果此指令用于默认用户,则每个新连接都将立即通过默认用户进行身份验证,而无需任何显式的AUTH命令。请注意,resetpass指令将清除此情况。
  • resetpass:刷新允许的密码列表。此外,删除不通过状态。之后resetpass用户没有关联的密码,也没有办法来验证不增加一些密码(或设置它NOPASS更高版本)。

注意:未使用nopass进行标记且没有有效密码列表的使用实际上是无法使用的,因为将无法以该用户身份登录。

重置用户

reset执行以下操作:resetpass,resetkeys,resetchannels,off,-@ all。用户返回到创建后立即具有的相同状态。

通过命令创建新用户默认权限

创建用户不指定任何规则。

127.0.0.1:6379> acl setuser asan
OK
127.0.0.1:6379> acl list 
1) "user asan off &* -@all"
2) "user default on nopass ~* &* +@all"
设置有用户名、密码、ACL权限、并启用的用户
27.0.0.1:6379> acl setuser user2 on >password ~cached:* +get
OK
127.0.0.1:6379> acl list 
1) "user asan off &* -@all"
2) "user default on nopass ~* &* +@all"
3) "user user2 on #5e884898da28047151d0e56f8dc6292773603d0d6aabbdd62a11ef721d1542d8 ~cached:* &* -@all +get"
127.0.0.1:6379> auth user2 password
OK
127.0.0.1:6379> acl whoami
(error) NOPERM this user has no permissions to run the 'acl' command or its subcommand
127.0.0.1:6379> get cached:q
(nil)

IO多线程

IO多线程其实指客户端交互部分的网络IO交互处理模块多线程,而非执行命令多线程。Redis6执行命令依然是单线程。
&nbsp;

Redis 6 加入多线程,但跟 Memcached 这种从 IO处理到数据访问多线程的实现模式有些差异。Redis 的多线程部分只是用来处理网络数据的读写和协议解析,执行命令仍然是单线程。之所以这么设计是不想因为多线程而变得复杂,需要去控制 key、lua、事务,LPUSH/LPOP 等等的并发问题。整体的设计大体如下:

多线程IO默认也是不开启的,需要再配置文件中配置

  • io-threads-do-reads yes
  • io-threads 4

工具支持 Cluster

之前老版Redis想要搭集群需要单独安装ruby环境,Redis 5 将 redis-trib.rb 的功能集成到 redis-cli 。另外官方 redis-benchmark 工具开始支持 cluster 模式了,通过多线程的方式对多个分片进行压测。

RESP3新的 Redis 通信协议

优化服务端与客户端之间通信

Client side caching客户端缓存

基于RESP3 协议实现的客户端缓存功能。为了进一步提升缓存的性能,将客户端经常访问的数据cache到客户端。减少TCP网络交互。

Proxy集群代理模式

Proxy 功能,让 Cluster 拥有像单实例一样的接入方式,降低大家使用cluster的门槛。不过需要注意的是代理不改变 Cluster 的功能限制,不支持的命令还是不会支持,比如跨 slot 的多Key操作

Modules API

Redis 6中模块API开发进展非常大,因为Redis Labs为了开发复杂的功能,从一开始就用上Redis模块。Redis可以变成一个框架,利用Modules来构建不同系统,而不需要从头开始写然后还要BSD许可。Redis一开始就是一个向编写各种系统开放的平台。