Redis高级特性及应用

一、Redis慢查询

1.1 Redis命令流程

在这里插入图片描述

1.2 慢查询配置:

可以通过以下命令配置慢查询时间阈值(慢查询值得是上图中执行命令的时间,不包含其他时间)

config set slowlog-log-slower-than 10000   //单位微秒
config rewrite  //写入配置文件
  • 时间阈值 ==0 所有查询时间都记录
  • 时间阈值 < 0 都不记录
  • 时间阈值 ==N 所有查询时间超过N微秒的都记录

多慢算慢查询?
一般配置到1000就可以
慢查询记录在哪里?
慢查询保存在内存的一个链表中
slowlog-max-len 128 //这个配置项是慢查询链表的长度,默认128

slowlog get 3 //查看最近3条慢查询记录
slowlog reset //清空慢查询

执行两条命令,并查看慢查询记录

127.0.0.1:6379> set shibng333 333
OK
127.0.0.1:6379> set shibing444 444
OK
127.0.0.1:6379> slowlog get 3
1) 1) (integer) 7           //命令序号2) (integer) 1726739963  //执行的时间戳3) (integer) 72          //执行耗时,单位微秒4) 1) "set"              //命令2) "shibing444"3) "444"5) "127.0.0.1:38730"     //节点地址6) ""

二、Redis的PipeLine

Pipeline相当于一次性发送多条执行给Redis执行,相比普通命令执行方式减少了往返的网络时间。
Pipeline命令多长合适呢?
pipeline 内存输入输出缓冲区大小4k-8k。单个TCP报文大小1460B,超过这个大小会拆包,有额外的网络开销,所以尽量不要超过这个大小
在这里插入图片描述

实战

pipeline命令的使用

public class RedisPipeline {@Autowiredprivate JedisPool jedisPool;public List<Object> plGet(List<String> keys) {Jedis jedis = null;try {jedis = jedisPool.getResource();//pipe是将所有的命令组装成pipelinePipeline pipelined = jedis.pipelined();pipelined.multi();//开启事务//。。。。。等等命令pipelined.exec();//提交事务for(String key:keys){pipelined.get(key);//不是仅仅是get方法,set方法还要很多很多方法pipeline都提供了支持}return pipelined.syncAndReturnAll();//这里只会向redis发送一次} catch (Exception e) {throw new RuntimeException("执行Pipeline获取失败!",e);} finally {jedis.close();}}public void plSet(List<String> keys,List<String> values) {if(keys.size()!=values.size()) {throw new RuntimeException("key和value个数不匹配!");}Jedis jedis = null;try {jedis = jedisPool.getResource();Pipeline pipelined = jedis.pipelined();for(int i=0;i<keys.size();i++){pipelined.set(keys.get(i),values.get(i));}pipelined.sync();} catch (Exception e) {throw new RuntimeException("执行Pipeline设值失败!",e);} finally {jedis.close();}}
}

三、redis事物

redis事物有原子性,一致性,隔离性,特殊情况下支持持久性。不支持回滚。
但是Redis事务对回滚支持有问题,对于命令错误,可以支持回滚。但是命令没错,其他错误不支持回滚机制。所以不建议使用Redis事务。
Redis事务multi命令开始,exec提交事务。
如下 sadd命令的key和上一个重复了,但是上一个操作没有回滚,仍然是成功的:

127.0.0.1:6379> multi
OK
127.0.0.1:6379> set shi1900 apple
QUEUED
127.0.0.1:6379> sadd shi1900 grape
QUEUED
127.0.0.1:6379> exec
1) OK
2) (error) WRONGTYPE Operation against a key holding the wrong kind of value
127.0.0.1:6379> get shi1900
"apple"
127.0.0.1:6379> 

四、Redis Watch机制(乐观锁机制)

Watch实现了一个乐观锁的功能,如果一个key被watch,那么key被修改的时候,会将key当前的值和watch之前的值进行比较,相同就可以修改成功。否则会失败。
例:客户端1对key-watched进行了watch操作,然后开启事务执行命令给key-watched设置一个新值999,客户端2这时也给key-watched设置新值555成功,然后客户端1提交事务失败。

//客户端1:
127.0.0.1:6379> set key-watched 111
OK
127.0.0.1:6379> watch key-watched
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set key-watched 999  //执行该条命令后,在客户端2执行命令 set key-watched 555
QUEUED
127.0.0.1:6379> exec              //提交失败
(nil)
127.0.0.1:6379> get key-watched   //值已经被改成555
"555"
127.0.0.1:6379>//客户端2:
127.0.0.1:6379> set key-watched 555
OK 

五 Redis和Lua脚本

Redis可以支持使用Lua脚本执行命令,一个Lua脚本一次性执行完成,是个原子操作。
使用LUA脚本的好处

  • 减少网络开销,在Lua脚本中可以把多个命令放在同一个脚本中运行
  • 原子操作,Redis会将整个脚本作为一个整体执行,中间不会被其他命令插入。(Redis执行命令是单线程)
  • 复用性,客户端发送的脚本会存储在Redis中,这意味着其他客户端可以复用这一脚本来完成同样的逻辑
    在这里插入图片描述

六、Lua脚本限流实战

在Redis维护一个计数器count,每次有请求进来,计数器count+1,当计数器的值超过限流值之后,请求会被拒绝,计数器设置一个超时时间,比如一分钟。计数器过期之后又可以接收请求。
在这里插入图片描述
代码实现:

@RequestMapping("/order")
public String killProduct(@RequestParam(required = true) String name) throws Exception{//rateLimiter.tryAcquire(1); //调用if(isAcquire.acquire("iphone",10,60)){//60秒只能进行10次System.out.println("业务成功!");return "恭喜("+name+"),抢到iphone!";}else{System.out.println("-----------业务被限流");return "对不起,你被限流了!";}}//判断限流方法---类似于RateLimiter
public boolean acquire(String limitKey,int limit,int expire) throws  Exception{//连接RedisJedis jedis =  new Jedis("127.0.0.1",6379);getRedisScript =new  DefaultRedisScript<>();getRedisScript.setResultType(Long.class);//脚本执行返回值 longgetRedisScript.setScriptSource(new ResourceScriptSource(new ClassPathResource("rateLimiter.lua")));Long result = (Long)jedis.eval(getRedisScript.getScriptAsString(),1,limitKey,String.valueOf(limit),String.valueOf(expire));if(result ==0){return false;}return true;
}

限流计数的Lua脚本:
afterval做流量计数,limit是流量限制次数,超过流量就会禁止

--java端送入三个参数(1个key,2个param  )string
--limitKey(redi中key的值)
local key =KEYS[1];
--limit(次数)
local times = ARGV[1];
--expire(秒S)
local expire = ARGV[2];
--对key-value中的 value +1的操作  返回一个结果
local afterval=  redis.call('incr',key);
if afterval ==1 then --第一次redis.call('expire',key,tonumber(expire) )  --失效时间(1S)  TLL 1Sreturn 1; --第一次不会进行限制
end
--不是第一次,进行判断
if afterval > tonumber(times) then--限制了return 0;
end
return 1;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1549005.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

大模型与智能体的市场调研分析

2024年&#xff0c;很多人都在谈论智能体&#xff0c;我老婆这样的美术老师&#xff0c;也让我给她科普一下&#xff0c;于是我花了几天时间&#xff0c;系统学习和深入调研了一下&#xff0c;在此分享给大家。 时代背景 人工智能就像电力一样&#xff0c;如果你的竞争对手正…

木材检测系统源码分享

木材检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vision …

物联网智能项目全面解析

目录 引言 一、物联网概述 1.1 什么是物联网 1.2 物联网的历史与发展 二、物联网智能项目分类 三、关键组件与技术 3.1 传感器和执行器 3.2 连接技术 3.3 数据处理与分析 3.4 用户界面 四、物联网智能项目案例分析 4.1 智能家居 4.2 智慧城市 4.3 工业物联网 4.4…

C# 字符串(String)的应用说明一

一.字符串&#xff08;String&#xff09;的应用说明&#xff1a; 在 C# 中&#xff0c;更常见的做法是使用 string 关键字来声明一个字符串变量&#xff0c;也可以使用字符数组来表示字符串。string 关键字是 System.String 类的别名。 二.创建 String 对象的方法说明&#x…

$attrs 和 $listeners

通常情况下&#xff0c;父子组件之间的数据是通过 props 由父向子传递的&#xff0c;当子组件想要修改数据时&#xff0c;则需要通过 $emit 以事件形式交由父组件完成&#xff0c;而这种交互方式只存在于父子组件之间&#xff0c;多层嵌套的时候&#xff0c;处于内层的组件想要…

SQL进阶技巧:如何获取状态一致的分组? | 最大、最小值法

目录 0 需求描述 1 数据准备 2 问题分析 方法1&#xff1a;最大、最小值法&#xff08;技巧&#xff09; 方法2&#xff1a;常规思路 3 小结 如果觉得本文对你有帮助&#xff0c;那么不妨也可以选择去看看我的博客专栏 &#xff0c;部分内容如下&#xff1a; 数字化建设通…

(JAVA)队列 和 符号表 两种数据结构的实现

1. 队列 1.1 队列的概述 队列是一种基于先进先出&#xff08;FIFO&#xff09;的数据结构&#xff0c;是一种只能在一端进行插入&#xff0c;在另一端进行删除操作的特殊线性表。 它按照先进先出的原则存储数据&#xff0c;先进入的数据&#xff0c;在读取时先被读出来 1.2 …

【anki】显示 “连接超时,请更换网络后重试” 怎么办

文章目录 前言一、问题描述二、解决方案 前言 在 anki同步 时遇到的问题 一、问题描述 二、解决方案 从电信换为了移动热点&#xff0c;电脑手机都同步成功了

图像超分辨率(SR)

图像超分辨率&#xff08;Image Super-Resolution, SR&#xff09;是一种图像处理技术&#xff0c;旨在从低分辨率&#xff08;LR&#xff09;图像中恢复出高分辨率&#xff08;HR&#xff09;图像。这种技术通过增加图像中的细节和清晰度来提高图像的视觉质量&#xff0c;从而…

Stable Diffusion扩散模型【详解】新手也能看懂!!

前言 文章目录 1、Diffusion的整体过程2、加噪过程 2.1 加噪的具体细节2.2 加噪过程的公式推导 3、去噪过程 3.1 图像概率分布 4、损失函数5、 伪代码过程 此文涉及公式推导&#xff0c;需要参考这篇文章&#xff1a; Stable Diffusion扩散模型推导公式的基础知识 1、Diffu…

数据结构 ——— 顺序表oj题:编写函数,删除有序数组中的重复项

目录 题目要求 代码实现 题目要求 一个升序排列的数组 nums &#xff0c;要求原地删除重复出现的元素&#xff0c;使每个元素只出现一次&#xff0c;并返回删除后数组的新长度&#xff0c;元素的相对顺序应该保持一致 代码实现 代码演示&#xff1a; int removeDuplicate…

你要的Air201录音和播放录音功能?直接拿去!

最近拼拼收到同学们的疑问&#xff1a;Air201是否支持录音、播放录音功能&#xff1f; 必须支持&#xff01;Air201可是高集成化设计&#xff0c;并且Air201自带了ES8311音频解码芯片&#xff08;Audio Codec&#xff09;及MIC麦克&#xff0c;可支持本地的录音功能&#xff1…

SAP Message - self-explanatory 自身说明

SAP Message 解释、创建和应用可见如下文章&#xff1a;SAP Abap】SE91 - SAP MESSAGE 消息类创建与应用-CSDN博客 SE91 SAP消息类型 - tongxiaohu - 博客园 这里主要想聊一下常用的SE91 中不常用的功能 - 自身说明 选项的作用。 以 VF - 004 为例&#xff1a; 我们都知道自…

《凡人歌》中的IT职业启示录

《凡人歌》是由中央电视台、正午阳光、爱奇艺出品&#xff0c;简川訸执导&#xff0c;纪静蓉编剧&#xff0c;侯鸿亮任制片&#xff0c;殷桃、王骁领衔主演&#xff0c;章若楠、秦俊杰、张哲华、陈昊宇主演的都市话题剧 &#xff0c;改编自纪静蓉的小说《我不是废柴》。该剧于2…

上位机通讯汇川Plc3U和5U

开发过程中需要调用到汇川官网的两个动态库(ModbusTcpAPI.dll&#xff1b;StandardModbusApi.dll) 解压完成后找到上面的动态库复制到自己项目的根目录下面然后就可以进行下一步操作了 UI界面&#xff1a; 通讯类集成了3U和5U的连接断开以及读写方法&#xff1a; public clas…

如何巧妙运用Shell变量:掌握脚本编程的核心技巧

目录 前言一、Shell变量——变量类型1、用户自定义变量2、环境变量用./ 启动脚本文件记得加权限哦 二、Shell变量——变量赋值和访问(一&#xff09;变量定义(二&#xff09;变量的使用(三&#xff09;删除变量(四&#xff09;添加环境变量(五&#xff09;内部变量(六&#xff…

开源链动2+1模式AI智能名片小程序源码:放大特色,构建独特竞争力

摘要&#xff1a;本文探讨在当今社会背景下&#xff0c;开源链动21模式AI智能名片小程序源码如何通过坚持与众不同来构建独特竞争力。在信息传播便捷但个体易同质化的时代&#xff0c;拥有特色是脱颖而出的关键&#xff0c;而这种模式下的小程序源码具有独特的发展潜力。 一、引…

有效解决配置管理混乱,麒麟桌面操作系统V10 sp1 2403最新版本推出统一配置系统

了解更多银河麒麟操作系统全新产品&#xff0c;请点击访问 麒麟软件产品专区&#xff1a;https://product.kylinos.cn 开发者专区&#xff1a;https://developer.kylinos.cn 文档中心&#xff1a;https://documentkylinos.cn 当前桌面操作系统中可通过配置定义的应用有限&a…

使用 Git 帮助文档

聊聊如何更好地查阅官方文档。 ‍ git help 学习某个工具&#xff0c;官方文档是少不了的&#xff0c;也是最权威的。我们可以使用 git help 来查看帮助&#xff0c;该命令会列举出常用的命令和介绍&#xff1a; > git help usage: git [--version] [--help] [-C <pa…

十一假期地区人流量出行大数据分析:技术驱动下的深度洞察

随着国庆黄金周的临近&#xff0c;旅游市场再次迎来了一年一度的出行高峰。在这个数字化时代&#xff0c;如何利用大数据、第三方接口等先进技术进行数据采集与分析&#xff0c;以更精准地预测人流量、优化资源配置、提升旅游体验&#xff0c;成为了行业内外关注的焦点。 一、…