Redis高级特性及应用

news2024/11/17 7:26:25

一、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 {

    @Autowired
    private JedisPool jedisPool;

    public List<Object> plGet(List<String> keys) {
        Jedis jedis = null;
        try {
            jedis = jedisPool.getResource();
            //pipe是将所有的命令组装成pipeline
            Pipeline 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{
    //连接Redis
    Jedis jedis =  new Jedis("127.0.0.1",6379);
    getRedisScript =new  DefaultRedisScript<>();
    getRedisScript.setResultType(Long.class);//脚本执行返回值 long
    getRedisScript.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 1S
    return 1; --第一次不会进行限制
end
--不是第一次,进行判断
if afterval > tonumber(times) then
    --限制了
    return 0;
end
return 1;

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

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

相关文章

【设计模式-访问者模式】

定义 访问者模式&#xff08;Visitor Pattern&#xff09;是一种行为型设计模式&#xff0c;允许你在不修改已有类的情况下向这些类添加新的功能或行为。它通过将操作的执行逻辑从对象的类中分离出来&#xff0c;使得你可以在保持类的封闭性&#xff08;符合开闭原则&#xff…

Leetcode 740. 删除并获得点数

原题链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 给你一个整数数组 nums &#xff0c;你可以对它进行一些操作。 每次操作中&#xff0c;选择任意一个 nums[i] &#xff0c;删除它并获得 nums[i] 的点数。之后&#xff0c;你必须删除 所有 等于 nums[i] - 1 和…

LeetCode题练习与总结:搜索二维矩阵 Ⅱ--240

一、题目描述 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性&#xff1a; 每行的元素从左到右升序排列。每列的元素从上到下升序排列。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],…

详细解析msyql和消息队列数据一致性问题

目录 前言 保持系统数据同步&#xff08;双写问题&#xff09; 消息队列消息丢失的问题 总结 前言 在当今互联网飞速发展的时代&#xff0c;随着业务复杂性的不断增加&#xff0c;消息队列作为一种重要的技术手段&#xff0c;越来越多地被应用于各种场景。它们不仅能有效解…

ChatGPT-o1用来进行数据分析,对比效果很惊人!

我是娜姐 迪娜学姐 &#xff0c;一个SCI医学期刊编辑&#xff0c;探索用AI工具提效论文写作和发表。 在进行数据分析的时候&#xff0c;通常有一个场景&#xff1a;我有一批数据&#xff0c;但是不知道该怎么分析&#xff0c;才能找到写论文的突破口和角度。ChatGPT能不能给我一…

Java项目实战II基于Java+Spring Boot+MySQL的厨艺交流平台设计与实现(源码+数据库+文档)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 在美食文化…

江协科技STM32学习- P20 实验-TIM编码器接口测速

&#x1f680;write in front&#x1f680; &#x1f50e;大家好&#xff0c;我是黄桃罐头&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流 &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd;​…

游戏厅计时器ps5计算时间的软件 佳易王电玩计时计费管理系统操作教程

一、前言 游戏厅计时器ps5计算时间的软件 佳易王电玩计时计费管理系统操作教程 软件为绿色免安装版&#xff0c;解压即可使用。 二、软件程序教程 计时的时候&#xff0c;点击 开始计时按钮 开台后可设置定时语音提醒的时间 时间设置好后&#xff0c;点击 开启提醒 即可 三、…

无人机飞手入伍当兵技术优势分析

随着现代战争形态的不断演变&#xff0c;无人机技术在军事领域的应用日益广泛&#xff0c;成为提升军队作战能力的重要手段。对于无人机飞手而言&#xff0c;其专业技能和实战经验在入伍当兵后能够转化为显著的技术优势&#xff0c;为国防事业贡献重要力量。以下是从专业技能优…

“不关心⚠️Warning”的代价:http自动升级https导致免费的存储服务扣费

背景 7 月 12 日的时候我手机突然收到一条短信&#xff1a;显示我在 LeanCloud 平台的账户欠费了。虽然只是欠费 0.01 元&#xff0c;但还是有些疑惑&#xff0c;怎么免费的存储服务突然扣费了&#xff1f; 然而这只是个开始。起初我并没有很在意这扣费的 0.01 元&#xff08;…

阿里发布Qwen2.5:编程与数学的AI新革命!

阿里发布Qwen2.5&#xff1a;编程与数学的AI新革命&#xff01; 阿里发布了Qwen2.5系列模型&#x1f680;&#xff0c;带来编程和数学领域的超强升级&#x1f9b8;‍♂️。多种规格可选&#xff0c;开源模型推动创新&#x1f513;&#xff0c;让AI助手更智能&#xff01;快来体…

一阶低通滤波器Simulink仿真测试

1、低通滤波器(SMART PLC双线性变化和后向差分对比测试 低通滤波器(SMART PLC双线性变换和后向差分对比测试)_后向差分 和 双线性-CSDN博客文章浏览阅读367次。该博客详细探讨了低通滤波器的设计,对比了SMART PLC中的双线性变换和后向差分法。内容包括Tustin变换公式、后向差…

第一批学习大模型的程序员,已经碾压同事了,薪资差距都甩出一条街了...

前言 随着人工智能技术的突飞猛进&#xff0c;AI大模型已成为引领未来的核心技术。从ChatGPT的横空出世到GPT-4o的震撼发布&#xff0c;AI技术正以前所未有的速度改变着我们的生活和工作方式。 在这场AI革命中&#xff0c;企业对AIGC人才的需求正以指数级增长。据《AIGC就业趋…

基于Hive和Hadoop的病例分析系统

本项目是一个基于大数据技术的医疗病历分析系统&#xff0c;旨在为用户提供全面的病历信息和深入的医疗数据分析。系统采用 Hadoop 平台进行大规模数据存储和处理&#xff0c;利用 MapReduce 进行数据分析和处理&#xff0c;通过 Sqoop 实现数据的导入导出&#xff0c;以 Spark…

OpenAi_Moderation审核更新

更新原文档 最新openai-python版本已不可直接用 openai.Moderation.create()

芝法酱学习笔记(0.5)——使用jenkins做自动打包

前言 上节讲了SpringBoot上的打包。但这些过程都是手动的&#xff0c;在实际的开发测试时&#xff0c;自动化的打包部署&#xff0c;可以大大提升团队开发的效率 一、去官网下载 1.1 官网安装命令 对于如何安装的问题&#xff0c;我向来推荐官网 wget -O /usr/share/keyri…

论文阅读:LM-Cocktail: Resilient Tuning of Language Models via Model Merging

论文链接 代码链接 Abstract 预训练的语言模型不断进行微调&#xff0c;以更好地支持下游应用。然而&#xff0c;此操作可能会导致目标领域之外的通用任务的性能显著下降。为了克服这个问题&#xff0c;我们提出了LM Cocktail&#xff0c;它使微调后的模型在总体上保持弹性。…

解决Mac 默认设置 wps不能双面打印的问题

目录 问题描述&#xff1a; 问题解决&#xff1a; 问题描述&#xff1a; 使用mac电脑的时候&#xff0c;发现wps找不到双面打印的按钮&#xff0c;导致使用wps打开的所有文件都不能自动双面打印 问题解决&#xff1a; mac的wps也是有双面打印的选项&#xff0c;只是默认被关…

双指针算法【算法 18】

双指针算法 在算法设计与实现中&#xff0c;双指针算法是一种非常高效且常用的技术&#xff0c;尤其适用于处理数组和字符串相关的问题。通过维护两个指针&#xff08;通常称为“快指针”和“慢指针”&#xff09;&#xff0c;双指针算法能够在对数组或字符串进行单次遍历的同时…

VSCode rust文件中的api点击无法跳转问题

如果配置了vscode的setting.json windows端的话 "settings": { "typescript.tsc.autoDetect": "off","rust-analyzer.linkedProjects": [".\\gui-btn\\Cargo.toml",".\\temp\\Cargo.toml", ],其他端类似 能不…