Redis 7.0性能大揭秘:如何优化缓存命中率?

Redis 7.0,这货不仅仅是一个简单的缓存工具,它更是一款高性能的数据结构服务器。现在,大家都知道缓存命中率对性能影响特别大,但怎么优化它呢?

本文,已收录于,我的技术网站 ddkk.com,有大厂完整面经,工作技术,架构师成长之路,等经验分享

1、合理设计键值结构

Redis的数据结构和键的设计方式对性能有直接影响。比如,咱们可以用哈希表存储共同前缀的键,这样既节省了内存,又提高了查找效率。看这个例子:

Jedis jedis = new Jedis("localhost");
// 存储哈希表
jedis.hset("user:1000", "name", "张三");
jedis.hset("user:1000", "age", "30");
// 获取数据
String userName = jedis.hget("user:1000", "name");
System.out.println("用户名:" + userName);

2、使用LRU算法淘汰旧键

选择合适的键淘汰策略也很重要。Redis支持多种淘汰策略,LRU(最近最少使用)算法能帮你淘汰那些不常用的键,保留热门数据。

Jedis jedis = new Jedis("localhost");
jedis.configSet("maxmemory-policy", "allkeys-lru");
// 接下来就是正常的读写操作

3、优化查询模式

避免大键和大量小键的情况,保持键的大小和数量的平衡。同时,避免使用"KEYS"命令,尤其在数据量大的时候,会很慢。

Jedis jedis = new Jedis("localhost");
// 使用scan代替keys
String cursor = "0";
do {ScanResult<String> scanResult = jedis.scan(cursor);cursor = scanResult.getCursor();scanResult.getResult().forEach(key -> System.out.println("Key: " + key));
} while (!cursor.equals("0"));

4、合理设置过期时间

对那些可能很快就不再需要的数据,设置一个过期时间。这样可以自动清理不再使用的数据,减轻内存的压力。

最近无意间获得一份阿里大佬写的刷题笔记,一下子打通了我的任督二脉,进大厂原来没那么难。

这是大佬写的, 7701页的BAT大佬写的刷题笔记,让我offer拿到手软

Jedis jedis = new Jedis("localhost");
// 设置键值对,同时设置过期时间
jedis.setex("tempKey", 3600, "temporaryValue");

5、监控和调整

定期监控Redis的性能和状态,比如缓存命中率和内存使用情况。根据这些信息调整策略。

Jedis jedis = new Jedis("localhost");
// 获取Redis的状态信息
String info = jedis.info();
System.out.println(info);

6、合理利用数据类型

Redis提供了多种数据类型,合理使用这些数据类型可以提升性能。比如说,使用列表、集合或有序集合来存储多值数据,而不是用多个键。

Jedis jedis = new Jedis("localhost");
// 使用列表存储多个值
jedis.lpush("userList", "user1", "user2", "user3");
// 获取列表中的所有值
List<String> users = jedis.lrange("userList", 0, -1);
users.forEach(user -> System.out.println("用户:" + user));

7、使用Pipeline减少网络延迟

如果需要执行多个命令,使用Pipeline可以一次性发送这些命令,减少网络往返次数。

Jedis jedis = new Jedis("localhost");
Pipeline pipeline = jedis.pipelined();
pipeline.set("key1", "value1");
pipeline.set("key2", "value2");
pipeline.set("key3", "value3");
pipeline.sync(); // 执行所有命令

8、避免大范围的键扫描

大范围的键扫描会影响性能,应该尽量避免。比如使用模式匹配来限制扫描的范围。

Jedis jedis = new Jedis("localhost");
String cursor = "0";
ScanParams scanParams = new ScanParams();
scanParams.match("user:*"); // 只扫描以"user:"开头的键
scanParams.count(10); // 每次扫描10个
do {ScanResult<String> scanResult = jedis.scan(cursor, scanParams);cursor = scanResult.getCursor();scanResult.getResult().forEach(key -> System.out.println("Key: " + key));
} while (!cursor.equals("0"));

9、优化Lua脚本

Lua脚本可以在Redis服务器端执行,减少网络往返。但要确保脚本高效,避免长时间运行的脚本。

Jedis jedis = new Jedis("localhost");
String luaScript = "return redis.call('set',KEYS[1],ARGV[1])";
jedis.eval(luaScript, 1, "luaKey", "luaValue"); // 执行Lua脚本

10、合理配置Redis

根据实际使用场景合理配置Redis,比如设置合适的内存大小,选择合适的持久化方式等。

Jedis jedis = new Jedis("localhost");
// 设置最大内存
jedis.configSet("maxmemory", "100mb");
// 选择持久化方式
jedis.configSet("save", "60 10000");

通过这些实际的例子,我们能更好地理解如何优化Redis的缓存命中率。记住,每个场景下的最佳实践可能有所不同,关键是要根据自己的需求和环境来做调整。

总结

Redis 7.0性能优化其实就是个细活儿,需要我们在实际应用中不断调整和优化。从合理设计键值结构到选择合适的淘汰策略,每一步都至关重要。当然,定期监控和及时调整也是不可或缺的。记住,优化缓存命中率,就是在优化整个系统的性能。

项目文档&视频:

开源:项目文档 & 视频 Github-Doc

求一键三连:点赞、分享、收藏

点赞对我真的非常重要!在线求赞,加个关注我会非常感激!

本文,已收录于,我的技术网站 ddkk.com,有大厂完整面经,工作技术,架构师成长之路,等经验分享

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

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

相关文章

vue3 img图片怎么渲染

在 Vue3 中加载图片&#xff08;img&#xff09;src地址时&#xff0c;出现无法加载问题。网上很多都建议使用 require 加载相对路径&#xff0c;如下&#xff1a; <img :src"require(../assets/img/icon.jpg)"/>但是按照这种方式加载又会报错如下&#xff1a;…

商城小程序(7.加入购物车)

目录 一、配置vuex二、创建购物车的store模块三、在商品详情页中使用store模块四、实现购加入购物车功能五、动态统计购物车中商品的总数量六、持久化存储购物车的商品七、优化商品详情页的total侦听器八、动态为tabBar页面设置数据徽标九、将设置tabBar徽标的代码抽离为mixins…

tcp/ip协议2实现的插图,数据结构6 (24 - 章)

(142) 142 二四1 TCP传输控制协议 tcpstat统计量与tcp 函数调用链 (143) 143 二四2 TCP传输控制协议 宏定义与常量值–上 (144) 144 二四3 TCP传输控制协议 宏定义与常量值–下 (145) 145 二四4 TCP传输控制协议 结构tcphdr,tcpiphdr (146) 146 二四5 TCP传输控制协议 结构 tcp…

05、Kafka ------ 各个功能的作用解释(主题和分区 详解,用命令行和图形界面创建主题和查看主题)

目录 CMAK 各个功能的作用解释&#xff08;主题&#xff09;★ 主题★ 分区★ 创建主题&#xff1a;★ 列出和查看主题 CMAK 各个功能的作用解释&#xff08;主题&#xff09; ★ 主题 Kafka 主题虽然也叫 topic&#xff0c;但它和 Pub-Sub 消息模型中 topic 主题及 AMQP 的 t…

考研个人经验总结【心理向】

客官你好 首先&#xff0c;不管你是以何种原因来到这篇博客&#xff0c;以下内容或多或少可能带给你一些启发。如果你还是大二or大三学生&#xff0c;有考研的打算&#xff0c;不妨提前了解一些考研必备的心理战术&#xff0c;有时候并不是你知识学得不好&#xff0c;而是思维…

SQL DML

# DML—添加数据 1.给指定字段添加数据 INSERT INTO表名(字段名1,字段名2,...)VALUES(值1&#xff0c;值2...); 2.给全部字段添加数据 INSERT INTO表名VALUES(值1&#xff0c;值2,...); 3.批量添加数据 INSERT INTO表名(字段名1,字段名2,...)VALUES(值1&#xff0c;值2..…

供应链安全-镜像 Trivy kubesec

开头语 写在前面&#xff1a;如有问题&#xff0c;以你为准&#xff0c; 目前24年应届生&#xff0c;各位大佬轻喷&#xff0c;部分资料与图片来自网络 内容较长&#xff0c;页面右上角目录方便跳转 Dockerfile 文件优化 减少镜像层&#xff1a;一次RUN指令形成新的一层&a…

华纳云:Ubuntu上如何增加Swap分区?

在Ubuntu上增加Swap分区有几种常见的方式&#xff0c;以下是其中两种&#xff1a; 1. 创建Swap文件&#xff1a; 这是一种在已有系统上扩展Swap空间的简便方法。 创建一个Swap文件&#xff0c;假设为2GB&#xff08;根据需要进行调整&#xff09;&#xff1a; sudo fallocate -…

人工智能图像生成的道德利弊

目录 一、我们应该关注人工智能图像吗&#xff1f;二、利用人工智能增强创造力的积极作用三、版权和剽窃问题四、对就业和劳动力动态的影响五、无意识的偏见和影响六、负责任地前行 人工智能&#xff08;AI&#xff09;发展迅速&#xff0c;尤其是近年来。据估计&#xff0c;超…

Flutter 监听前台和后台切换的状态

一 前后台的切换状态监听 混入 WidgetsBindingObserver 这个类&#xff0c;这里提供提供了程序状态的一些监听 二 添加监听和销毁监听 overridevoid initState() {super.initState();//2.页面初始化的时候&#xff0c;添加一个状态的监听者WidgetsBinding.instance.addObserver…

服务器宕机怎么办?怎么预防宕机?

相信不少用户会听到或者在文章中提到电脑宕机或者服务器宕机&#xff0c;不少用户对宕机的意思不太理解。那么服务器宕机是什么意思&#xff1f; 宕机属于计算机的术语&#xff0c;指电脑或者服务器不能正常工作。口语中我们简单的把停掉机器叫做down机&#xff0c;转换为汉字是…

【conda】conda 版本控制和环境迁移/安装conda加速工具mamba /conda常用指令/Anaconda配置

【conda】安装conda加速工具mamba /conda常用指令/Anaconda配置 0. conda 版本控制和环境迁移1. 安装conda加速工具mamba2. conda install version3. [Anaconda 镜像](https://mirrors.tuna.tsinghua.edu.cn/help/anaconda/)使用帮助4. error deal 0. conda 版本控制和环境迁移…

抖去推账号矩阵+无人直播+文案引流系统开发搭建--开源

核心技术 1. AI自动直播&#xff1a; 智能系统通过丰富可定制的文案库&#xff0c; 拥有有料有趣的灵魂。不仅能自动语音讲解内容&#xff0c;还可以在直播中和用户灵活互动。直播中可将团购商品同话术自动上下架。 2. AI剪辑 可一键智能批量成片&#xff0c;也可跟着模板剪…

「PyMuPDF 专栏 」PyMuPDF创建PDF、拆分PDF

文章目录 一、本章前言二、使用PyMuPDF创建PDF文档1、实例代码2、过程详解①. 安装PyMuPDF②. 导入PyMuPDF模块③. 创建一个新的PDF文档④. 添加页面和内容⑤. 保存文档 三、使用PyMuPDF拆分PDF文档1、实例代码2、过程解析①. 导入模块②. 定义函数③. 打开源PDF文件④. 遍历页…

大数据Doris(五十二):SQL函数之数学函数

文章目录 SQL函数之数学函数 一、abs(double a)

owasp top10 | 十大常见漏洞详解

A1 注入漏洞 在 2013、2017 的版本中都是第一名&#xff0c;可见此漏洞的引入是多么的容易&#xff0c;同时也证明此漏洞的危害有多么严重。 攻击方式 利用应用程序弱点&#xff0c;通过恶意字符将恶意代码写入数据库&#xff0c;获取敏感数据或进一步在服务器执行命令。 漏洞原…

windows允许无密码远程设置

在 Windows 系统上启用无密码远程访问涉及一些风险&#xff0c;因为这可能会使您的系统更容易受到未经授权访问的攻击。然而&#xff0c;如果你了解这些风险并且仍然需要这样做&#xff0c;以下是一些步骤来配置 Windows 以允许无密码远程访问&#xff1a; 打开远程桌面: 首先&…

LeetCode 2723. 两个 Promise 对象相加

给定两个 promise 对象 promise1 和 promise2&#xff0c;返回一个新的 promise。promise1 和 promise2 都会被解析为一个数字。返回的 Promise 应该解析为这两个数字的和。 示例 1&#xff1a; 输入&#xff1a; promise1 new Promise(resolve > setTimeout(() > res…

解决hbuilderx打包网址成为5+app,点击返回按钮直接退出app的BUG

直接上代码 <!DOCTYPE html> <html><head><meta charset"UTF-8"><meta name"viewport" content"viewport-fitcover,widthdevice-width,initial-scale1,minimum-scale1,maximum-scale1,user-scalableno" /><ti…

深度学习知识点总结

关于bn层 mean,std 第i个元素就是第i个通道上全部batch张输出特征图所有元素的平均值和方差,所shape就是特征图shape 可学习参数 weight和bias分别对应 γ&#xff0c;β.有bn时cov可以不用bia 在训练过程中,mean和std是统计得到的,然后在迭代过程中动态累加,m*si-1(1-m)*si,m…