5、Redis6.0版的新特性

2021-08-13  本文已影响0人  chanyi

redis在6.0版本之后更新了一些重要的新特性

1、增加了多线程Thread I/O

6.0之前的redis基本上是一个单线程的,但并不是指只有一个线程,比如说执行unlink操作删除大key的时候(unlinkdel命令一样都是用来删除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提出一种客户端缓存方案
主要实现过程如下图

客户端缓存方案

3、ACL细粒度安全控制acces control list

可以根据命令和key来控制访问连接
在redis6之前,只能通过密码来控制,还有通过rename来调整高危命令flushdb,keys*,shutdown等命令的权限。

# 在配置文件中做这些配置,禁用掉以下的危险操作
rename-command FLUSHALL ""
rename-command FLUSHDB ""
rename-command KEYS ""

redis6之后,提供了更细粒度的权限控制

#查看权限列表
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"
上一篇下一篇

猜你喜欢

热点阅读