5、Redis6.0版的新特性
2021-08-13 本文已影响0人
chanyi
redis在6.0
版本之后更新了一些重要的新特性
1、增加了多线程Thread I/O
6.0之前的redis基本上
是一个单线程的,但并不是指只有一个线程,比如说执行unlink
操作删除大key的时候(unlink
和del
命令一样都是用来删除key,但是unlink
是异步的,适合删除大的key),会有单独的线程完成,不然会阻塞主线程,还有慢的IO操作的时候,也会使用单独的线程完成,还有比如持久化的时候,也是会有单独的线程来实现
6.0之后增加了多线程的实现,多线程使用在io的操作上,工作线程还是只有一个单线程,还是串行实现的,多的io线程用于读read
或者写write
,
多线程不会同时执行读写操作。所有多出的线程要不是全部用于读
,要不全部都是用于写
。
多线程的配置默认情况下是关闭的,需要通过配置开启
io-threads 4 #默认开启4个线程,其中包含1个main线程和3个写线程,默认情况下不开启读线程
io-threads-do-reads no#默认情况下,开启了多线程之后是用来写操作的,如果此设置为yes则表示新开启的线程用于读操作
2、客户端缓存Client Side Cache
如果本地没有实现JVM
缓存,那么在大并发的情况下对redis服务器也是一种考验,所以redis提出一种客户端缓存方案
主要实现过程如下图
- 实现过程是:客户端 1从服务器获取某个key的value,然后服务器缓存下当前key的,并返回value给客户端1。客户端1拿到value之后,将key-value缓存在本地。如果另一个客户端2修改了key的value为value2,则服务端检查之后发现此key已经被缓存到客户端1,则会给客户端1发送一个失效key的value的通知,客户端1收到通知后,失效缓存在本地的key-value
3、ACL细粒度安全控制acces control list
可以根据命令和key来控制访问连接
在redis6之前,只能通过密码来控制,还有通过rename
来调整高危命令flushdb
,keys*
,shutdown
等命令的权限。
# 在配置文件中做这些配置,禁用掉以下的危险操作
rename-command FLUSHALL ""
rename-command FLUSHDB ""
rename-command KEYS ""
redis6之后,提供了更细粒度的权限控制
- 1、接入权限:用户名和密码
- 2、控制可以执行的命令
- 3、控制可以操作的key
#查看权限列表
127.0.0.1:6379> acl list
1) "user default on nopass ~* &* +@all"
# default表示用户名,on表示是否启用,nopass表示没有密码,~*表示可操作性的key, +@all表示可执行的命令
#增加用户权限
127.0.0.1:6379> acl setuser lilei
OK
127.0.0.1:6379> acl list
1) "user default on nopass ~* &* +@all"
2) "user lilei off &* -@all"
#查看当前操作用户
127.0.0.1:6379> acl whoami
"default"
#设置一个密码是123456 只能够使用get的命令的用户,并且在key前一定要加上`cached:`这个限制
127.0.0.1:6379> acl setuser lilei1 on >123456 ~cached:* +get
OK
#检查是否设置成功
127.0.0.1:6379> acl list
1) "user default on nopass ~* &* +@all"
2) "user lilei off &* -@all"
3) "user lilei1 on #8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92 ~cached:* &* -@all +get"
#切换用户操作
127.0.0.1:6379> auth lilei1 123456
OK
#没有权限的key,无法操作
127.0.0.1:6379> get a
(error) NOPERM this user has no permissions to access one of the keys used as arguments
#有权限的key可以正常操作
127.0.0.1:6379> get cached:a
(nil)
4、增加SSL
模块
通过增加设置,在传输的时候使用SSL
协议,确保传输过程的安全性
当SSL
模块开启的时候,不能使用多线程
5、增加RESP3新的通信协议
增加RESP3
同行协议,优化服务端和客户端之间的通信
#启用RESP3协议
127.0.0.1:6379> hello 3
1# "server" => "redis"
2# "version" => "6.2.5"
3# "proto" => (integer) 3
4# "id" => (integer) 4
5# "mode" => "standalone"
6# "role" => "master"
7# "modules" => (empty array)
#获取所有hash显示结构的变化(可读性更高一点)
127.0.0.1:6379> hgetall hash1
1# "a" => "1"
2# "b" => "2"
3# "c" => "3"
#未开启RESP3协议时展示的结构
127.0.0.1:6379> hgetall hash1
1) "a"
2) "1"
3) "b"
4) "2"
5) "c"
6) "3"