美文网首页
5、Redis6.0版的新特性

5、Redis6.0版的新特性

作者: chanyi | 来源:发表于2021-08-13 16:57 被阅读0次

    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提出一种客户端缓存方案
    主要实现过程如下图

    客户端缓存方案
    • 实现过程是:客户端 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"
    

    相关文章

      网友评论

          本文标题:5、Redis6.0版的新特性

          本文链接:https://www.haomeiwen.com/subject/hsjkbltx.html