Redis之路系列(5)功夫在诗外

2024-04-25 04:36

本文主要是介绍Redis之路系列(5)功夫在诗外,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

5 拓展篇—功夫在诗外

6.0新特性

相对都比较鸡肋,谨慎在生产环境使用

ACL安全策略

Redis6版本推出了ACL(Access Control List)访问控制权限 的功能,基于此功能,可以设置多个用户,并且给每个用户单独设 置命令权限和数据权限。

ACL文件配置方式有两种,一种是在config文件中直接配置,另一种是在外部aclfile中配置,配置命令是一样的
ACL是使用DSL定义的,该规则是从上到下,从左到右的,具体可以参考附录中的具体规则说明

RESP3和客户端缓存

RESP(REdisSerializationProtocol),是 Redis服务端与客户端之间通信的协议。
在Reds6之前的版本,使用的是RESP2协议,数据都是以字符串数组的形式返回给客户端,客户端需要根据类型进行解析,增加了客户端实现的复杂度。
RESP3协议可以按类型返回数据。 可以使用HELLO命令在RESP2和RESP3协议之间进行切换

新增的客户端缓存的设计导致客户端缓存和redis缓存绑定,十分不灵活,会导致资源浪费,没有很大的实际使用价值。

Redis中值的变化每次需要同步到客户端缓存,但是客户端并非会用到没的变化,导致资源浪费,数据管理更加复杂了,实际价值不大

I/O多线程

注意:主流程操作还是单线程
开启IO多线程:io-threads-do-reads yes 配置线程数量,如果设为1就是主线程模式:io-threads 4

目前官方建议:至少4核的机器才开启IO多线程,并且除非真的遇到了性能瓶颈,否则不建议开启此配置 。 建议配置的线程数少于机器总线程数,线程并不是越多越好 ,多于8个线程意义不大

集群代理

集群代理把集群抽象成为单个Redis实例,客户端通过集群 代理访问集群,就像访问单个Redis一样,不去关心很多集群上 的问题,比如:集群模式下multiple操作的限制及跨slot操作限 制等等,这些由集群代理去处理。

目前是一个实验性的功能,需要单独安装、单独配置、单独运行,不建议生产环境使用。

Lua脚本

Lua是一个高效、简洁、轻量级、可扩展的脚本语言,可以很方便的嵌入到其它语言或中间件中使用,Redis从2.6版支持Lua。

使用脚本好处
  • 1:减少网络开销
  • 2:原子操作:Redis会把脚本当作一个整体来执行,中间不会插入其它命令
  • 3:复用功能
基本数据类型

Lua是一个动态类型的语言,一个变量可以存储任何类型的值

基础语法
  • 默认全局变量,但是在Redis中不允许使用,局部变量使用local关键字进行声明
  • 变量名必须是非数字开头,只能包含字母、数字和下划线
  • 变量名是区分大小写
  • 逻辑操作符用单词表示:and、or、not
  • 单行注释使用 --来表示,多行注释使用--[[ 开始,到 ]] 结束
  • 支持多重赋值:local a,b = 1,2,3 (a=1,b=2),不过不建议,难维护易错
  • 使用 .. 用来连接字符串
  • 使用 #来获取长度,比如:print(#‘helloworld’)
  • 只有nil和false是假,其它都是真
  • 循环语句有for、while、repeat三种
与Redis结合

在Redis中执行lua脚本命令: redis-cli --eval 脚本 [key...] , [arg...]
在脚本中调用Redis命令:redis.call ,遇到错误会直接返回;想要继续执行使用redis.pcall 命令

Lua数据类型与Redis返回值类型对应关系:

其它命令:

  • evalsha:可以通过脚本摘要来运行,作用同eval
  • script load:将脚本加入缓存,返回值就是SHA1摘要
  • script exists:判断脚本是否已经缓存
  • script flush:清空脚本缓存
  • script kill:强制终止脚本的执行

发布订阅模式

Redis支持简单的发布订阅模式,可以实现进程间的消息传递,对业务要求不高的可以选择使用
下面是一些常用的操作命令:

  • 1:publish:发布消息,格式是publish channel 消息
  • 2:subscribe:订阅频道,格式是subscribe channel,可以是多个channel
  • 3:psubscribe:订阅频道,格式是psubscribe channel,支持glob风格的通配符
  • 4:unsubscribe:取消订阅,格式是unsubscribe channel,不指定频道表示取消所有subscribe命令的订阅
  • 5:punsubscribe:取消订阅,格式是punsubscribe channel,不指定频道表示取消所有psubscribe命令的订阅

注意这里匹配模式的时候,是不会将通配符展 开的,是严格进行字符串匹配的,比如:punsubscribe * 是无法退定 c1.* 的,必须严格使用punsubscribe c1.*才可以

常用优化手段

  • 使用管道Pipeline,有利于减少网络通信和传输
  • 精简键名和键值
  • 合理设计存储的数据结构和数据关系,减少数据冗余
  • 尽量使用mset来赋值,类似还有lpush、zadd等批量操作的命令
  • 如果可能,尽量使用Lua脚本来辅助获取和操作数据
  • 尽量使用hash结构来存储对象
  • 使用hash结构时,应尽量保证每个key下面<field,value>的数目不超过限制(默认值是64)
  • 配置使用类似ziplist以优化list等数据结构
  • 一定要设置maxmemory,保证redis不会因为内存导致崩溃

客户端

Lettuce简介

Lettuce是一个可伸缩线程安全的Redis客户端。多个线程可以共享同一个RedisConnection。它利用优秀netty NIO框架来高效地管理多个连接。

Lettuce核心组件有:RedisURI、Connection、RedisClient、RedisCommands

  • RedisURI:封装Redis的连接信息
  • Connection:Redis的连接,包含一些具体方式(单机、哨兵、集群、订阅发布等)
  • RedisClient:Redis的客户端,如果连接集群则为RedisClusterlient
  • RedisCommands:Redis的命令操作API接口,提供了三种调用方式:同步、异步、响应式

基本使用

官网地址:https://lettuce.io/docs/getting-started.html

基本依赖:

dependencies {compile 'io.lettuce:lettuce-core:6.1.4.RELEASE
}

基本使用示例:

RedisClient redisClient = RedisClient.create("redis://password@localhost:6379/0");
StatefulRedisConnection<String, String> connection = redisClient.connect();
RedisCommands<String, String> syncCommands = connection.sync();syncCommands.set("key", "Hello, Redis!");connection.close();
redisClient.shutdown();

与Spring的集成

@Configurationclass AppConfig { @Beanpublic LettuceConnectionFactory redisConnectionFactory() { return new LettuceConnectionFactory(new RedisStandaloneConfiguration("server", 6379)); } }

这篇关于Redis之路系列(5)功夫在诗外的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/933705

相关文章

redis群集简单部署过程

《redis群集简单部署过程》文章介绍了Redis,一个高性能的键值存储系统,其支持多种数据结构和命令,它还讨论了Redis的服务器端架构、数据存储和获取、协议和命令、高可用性方案、缓存机制以及监控和... 目录Redis介绍1. 基本概念2. 服务器端3. 存储和获取数据4. 协议和命令5. 高可用性6.

Redis的数据过期策略和数据淘汰策略

《Redis的数据过期策略和数据淘汰策略》本文主要介绍了Redis的数据过期策略和数据淘汰策略,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录一、数据过期策略1、惰性删除2、定期删除二、数据淘汰策略1、数据淘汰策略概念2、8种数据淘汰策略

Redis存储的列表分页和检索的实现方法

《Redis存储的列表分页和检索的实现方法》在Redis中,列表(List)是一种有序的数据结构,通常用于存储一系列元素,由于列表是有序的,可以通过索引来访问元素,因此可以很方便地实现分页和检索功能,... 目录一、Redis 列表的基本操作二、分页实现三、检索实现3.1 方法 1:客户端过滤3.2 方法

Python中操作Redis的常用方法小结

《Python中操作Redis的常用方法小结》这篇文章主要为大家详细介绍了Python中操作Redis的常用方法,文中的示例代码简洁易懂,具有一定的借鉴价值,有需要的小伙伴可以了解一下... 目录安装Redis开启、关闭Redisredis数据结构redis-cli操作安装redis-py数据库连接和释放增

redis防止短信恶意调用的实现

《redis防止短信恶意调用的实现》本文主要介绍了在场景登录或注册接口中使用短信验证码时遇到的恶意调用问题,并通过使用Redis分布式锁来解决,具有一定的参考价值,感兴趣的可以了解一下... 目录1.场景2.排查3.解决方案3.1 Redis锁实现3.2 方法调用1.场景登录或注册接口中,使用短信验证码场

Redis 多规则限流和防重复提交方案实现小结

《Redis多规则限流和防重复提交方案实现小结》本文主要介绍了Redis多规则限流和防重复提交方案实现小结,包括使用String结构和Zset结构来记录用户IP的访问次数,具有一定的参考价值,感兴趣... 目录一:使用 String 结构记录固定时间段内某用户 IP 访问某接口的次数二:使用 Zset 进行

解读Redis秒杀优化方案(阻塞队列+基于Stream流的消息队列)

《解读Redis秒杀优化方案(阻塞队列+基于Stream流的消息队列)》该文章介绍了使用Redis的阻塞队列和Stream流的消息队列来优化秒杀系统的方案,通过将秒杀流程拆分为两条流水线,使用Redi... 目录Redis秒杀优化方案(阻塞队列+Stream流的消息队列)什么是消息队列?消费者组的工作方式每

Redis如何使用zset处理排行榜和计数问题

《Redis如何使用zset处理排行榜和计数问题》Redis的ZSET数据结构非常适合处理排行榜和计数问题,它可以在高并发的点赞业务中高效地管理点赞的排名,并且由于ZSET的排序特性,可以轻松实现根据... 目录Redis使用zset处理排行榜和计数业务逻辑ZSET 数据结构优化高并发的点赞操作ZSET 结

Redis的Zset类型及相关命令详细讲解

《Redis的Zset类型及相关命令详细讲解》:本文主要介绍Redis的Zset类型及相关命令的相关资料,有序集合Zset是一种Redis数据结构,它类似于集合Set,但每个元素都有一个关联的分数... 目录Zset简介ZADDZCARDZCOUNTZRANGEZREVRANGEZRANGEBYSCOREZ

Redis多种内存淘汰策略及配置技巧分享

《Redis多种内存淘汰策略及配置技巧分享》本文介绍了Redis内存满时的淘汰机制,包括内存淘汰机制的概念,Redis提供的8种淘汰策略(如noeviction、volatile-lru等)及其适用场... 目录前言一、什么是 Redis 的内存淘汰机制?二、Redis 内存淘汰策略1. pythonnoe