当前位置: 首页 > 科技观察

说说Redis6的新特性

时间:2023-03-22 15:17:54 科技观察

前言Redis6的主要变化有:SSL、ACLs、RESP3、客户端缓存、线程I/O、Redisbenchmark中的集群支持和改进的Rediscli集群支持、Redis集群代理.1.多线程Ioredis6.0提供了多线程支持。严格来说redis6之前的版本也是多线程的,只是单线程模型用于执行用户命令请求,还有一些线程用于执行后台任务,比如unlink删除大key,RDB持久化等.Redis6.0提供了多线程的读写IO,但是最终执行用户命令的线程还是单线程的,所以不存在多线程数据的竞争,效率还是很高的。redis6.0之前的线程执行方式,以下操作在一个线程中执行Redis6.0线程执行方式:多线程模型可以通过以下参数配置:如:io-threads4//这里有3个IO线程,和一个线程是mainThread,主线程负责IO读写和命令执行操作。默认情况下,如上配置,有三个IO线程。这三个IO线程只会执行IO中的write操作,也就是说read和command的执行都是由主线程来完成的。实施。最后,多线程将数据写回客户端。启用以下参数:io-threads-do-readsyes//将支持IO线程执行读写任务。图片.png2.clientsidecaching客户端缓存:redis6提供了服务端跟踪key变化和客户端缓存数据的特性,需要客户端实现执行过程如下:客户;客户端获取到数据后,客户端进行缓存;此时再次访问key时,会直接返回key,避免与redis服务器重新交互,节省服务器资源;当数据访问其他请求被修改时,服务端会主动通知客户端无效的key;客户端将执行本地失效,下次请求时,它将检索最新数据。目前只有lettuce支持:io.lettucelettuce-core6.0.0.RELEASEpublicstaticvoidmain(String[]args)throwsInterruptedException{RedisClientredisClient=RedisClient.create("redis://192.168.109.200");MapclientCache=newConcurrentHashMap<>();StatefulRedisConnectionmyself=redisClient.connect();CacheFrontendfrontend=ClientSideCaching.enable(CacheAccessor.forMap(clientCache),myself,TrackingArgs.Builder.enabled().noloop());Stringkey="csk";intcount=0;while(true){System.out.println(frontend.get(key));TimeUnit.SECONDS.sleep(3);if(count++==Integer.MAX_VALUE){myself.close();redisClient.shutdown();}}}注:https://redis.io/topics/客户端缓??存3。ACL权限控制ACL是对命令访问和执行权限的控制。默认情况下可以执行任意指令,兼容之前的版本。ACL设置有两种方式:命令方式ACLSETUSER+具体权限规则,通过ACLSAVE持久化写入ACL配置文件和执行ACLLOAD加载ACL存储有两种方式,但是两种方式不能同时配置,否则会报错,直接退出进程。Redis配置文件:redis.confACL配置文件,传入redis.confaclfile/path配置acl文件的路径命令方法:ACLSETUSERAlice//创建一个名为alice的用户上述命令创建的用户语义为:it处于关闭状态,被禁用,不能使用auth进行认证,不能访问任何命令不能访问任何密钥。上面的用户alice没有密码。创建一个带有cached:前缀的用户来执行get命令,并设置密码是没有任何意义的:aclsetuseraliceon>pass123~cached:*+getauthalicepass123setaa(error)NOPERMthisuserhasnopermissionstorunthe'set'commandoritssubcommandgetaa(error)NOPERMthisuserhasnopermissionstoaccessoneofthekeysusedasargumentsgetcached:namevvvAs上面如果访问了未授权的命令或key,会报错,set命令未授权,keya未授权,cached:name可以通过验证。更符合阅读习惯的格式ACLGETUSERAlice添加多种访问模式,以空格分隔,注意,切换到其他用户登录,alice没有admin权限ACLSETUSERAlice~objects:*~items:*~public:*Constraints对于类型命令ACLSETUSERAliceon+@all-@dangerous>password~*这里+@all:包含所有命令然后用-@去掉redis命令表中定义的危险命令。可以使用如下命令查看哪些命令属于某个类别aclcat//查看所有类别aclcatdangerous//查看所有危险命令打开子命令ACLSETUSERmyuser-client+client|setname+client|getname禁用客户端命令,但是开启客户端命令中的子命令setname和getname,只能先禁用,再添加子命令,因为后续可能会有新的命令添加。4.RESP3协议RESP(RedisSerializationProtocol)是Redis服务器和客户端之间的一种通信协议。Redis5使用RESP2,Redis6在兼容RESP2的基础上开始支持RESP3。推出RESP3的目的:一是为客户提供更多的语义响应,以开发使用旧协议难以实现的功能;另一个原因是为了实现Client-side-caching(客户端缓存)功能。注意:https://github.com/antirez/RESP3/blob/master/spec.md6。改进的RDB日志加载速度根据文件的实际组成(更大或更小的值),您可以期望提高20/30%。当有很多客户端连接时,消息也会更快,这个老问题终于得到解决。7.RedisClusterProxy模块RedisClusterproxy在Redis集群中,clients会很分散,现在为此引入了一个clusterproxy,可以为client抽象出Redis集群,让它看起来像是在跟一个单个实例。当简单且客户端仅使用简单的命令和功能时,也执行多路复用。RedisClusterproxy8.提供了很多新的模块(modules)API注:https://redis.io/topics/modules-api-ref