当前位置: 首页 > news >正文

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,有大厂完整面经,工作技术,架构师成长之路,等经验分享

相关文章:

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

Redis 7.0&#xff0c;这货不仅仅是一个简单的缓存工具&#xff0c;它更是一款高性能的数据结构服务器。现在&#xff0c;大家都知道缓存命中率对性能影响特别大&#xff0c;但怎么优化它呢&#xff1f; 本文&#xff0c;已收录于&#xff0c;我的技术网站 ddkk.com&#xff0…...

【深度学习每日小知识】Data Augmentation 数据增强

数据增强是通过对原始数据进行各种转换和修改来人工生成附加数据的过程&#xff0c;旨在增加机器学习模型中训练数据的大小和多样性。这对于计算机视觉领域尤为重要&#xff0c;因为图像经常被用作输入数据。 计算机视觉中的数据增强 数据增强的主要目标是解决过拟合问题&…...

网络调试 UDP1,开发板用动态地址-入门6

https://www.bilibili.com/video/BV1zx411d7eC?p11&vd_source109fb20ee1f39e5212cd7a443a0286c5 1, 开发板连接路由器 1.1&#xff0c;烧录无OS UDP例程 1.2&#xff0c;Mini USB连接电脑 1.3&#xff0c;开发板LAN接口连接路由器 2. Ping开发板与电脑之间通信* 2.1 根据…...

【Gin实战教程】快速入门

Gin是一个轻量级的Web框架&#xff0c;使用Go语言开发。它具有高性能、易用性和灵活性的特点&#xff0c;是构建可扩展的Web应用程序的理想选择。 首先&#xff0c;Gin是一个高性能的框架。它基于Go语言的原生HTTP包进行开发&#xff0c;利用了Go语言的并发特性和协程模型&…...

WPF真入门教程26--项目案例--欧姆龙PLC通讯工具

1、案例介绍 前面已经完成了25篇的文章介绍&#xff0c;概括起来就是从0开始&#xff0c;一步步熟悉了wpf的概念&#xff0c;UI布局控件&#xff0c;资源样式文件的使用&#xff0c;MVVM模式介绍&#xff0c;命令Command等内容&#xff0c;这节来完成一个实际的项目开发&#…...

C++ OpenGL 3D Game Tutorial 2: Making OpenGL 3D Engine学习笔记

视频地址https://www.youtube.com/watch?vPH5kH8h82L8&listPLv8DnRaQOs5-MR-zbP1QUdq5FL0FWqVzg&index3 一、main类 接上一篇内容&#xff0c;main.cpp的内容增加了一些代码&#xff0c;显得严谨一些&#xff1a; #include<OGL3D/Game/OGame.h> #include<i…...

Redis小计(4)

目录 1.Set和Get操作 2.mset和mget 3.mset&#xff0c;mget&#xff0c;set后加参数的优点 4.incr,incrby&#xff0c;incrbyfloat 1.Set和Get操作 flushall&#xff1a;清除所有k-v键值对。&#xff08;删库跑路小技巧&#xff09; set k v[ex | px]&#xff1a;设置超时…...

【React】常用Hook函数的梳理和总结(第二篇)

1. 前言 本篇梳理和总结React中常用的Hook函数。 欢迎大家来到Hook的世界&#xff0c;真的贼好用~ 2. 常用Hook函数 Hook说明示例useState(initialState) 功能&#xff1a;为函数组件添加状态变量&#xff0c;输入可是基本数据类型或引用数据类型&#xff0c;也可以是不带参数…...

【JaveWeb教程】(15) SpringBootWeb之 响应 详细代码示例讲解

目录 SpringBootWeb请求响应2. 响应2.1 ResponseBody2.2 统一响应结果2.3 案例2.3.1 需求说明2.3.2 准备工作2.3.3 实现步骤2.3.4 代码实现2.3.5 测试2.3.6 问题分析 SpringBootWeb请求响应 2. 响应 前面我们学习过HTTL协议的交互方式&#xff1a;请求响应模式&#xff08;有…...

「 PyMuPDF专栏 」PyMuPDF为PDF文件添加注释

文章目录 一、PyMuPDF的安装与基本使用1. 安装PyMuPDF库的方法2. 导入PyMuPDF库二、新建PDF文档1. 创建一个空白的PDF文档三、添加注释1. 导入库并打开PDF文件2. 选择要添加注释的页面3. 创建并添加注释3.1. 文本注释3.1.1. 完整代码3.1.2. 注释效果图3.2. 高亮注释3.2.1. 完整…...

5 - 视图|存储过程

视图&#xff5c;存储过程 视图视图基本使用使用视图视图进阶 存储过程创建存储过程存储过程进阶存储过程参数循环结构 视图 视图是虚拟存在的表 表头下的数据在真表里 表头下的数据存储在创建视图时 在select命令访问的真表里 优点&#xff1a; 安全数据独立简单 用户无需关…...

系统学习Python——警告信息的控制模块warnings:警告过滤器-[基础知识]

分类目录&#xff1a;《系统学习Python》总目录 警告过滤器控制着警告是否被忽略、显示或转为错误&#xff08;触发异常&#xff09;。 从概念上讲&#xff0c;警告过滤器维护着一个经过排序的过滤器类别列表&#xff1b;任何具体的警告都会依次与列表中的每种过滤器进行匹配&…...

vue中高德地图使用

1、安装 npm i amap/amap-jsapi-loader --save2、封装地图组件 <template><div id"map" ref"mapcontainer"></div> </template><script> import AMapLoader from "amap/amap-jsapi-loader"; export default {befo…...

算法训练营Day33

#Java #贪心 开源学习资料 Feeling and experiences&#xff1a; 单调递增的数字&#xff1a;力扣题目链接 当且仅当每个相邻位数上的数字 x 和 y 满足 x < y 时&#xff0c;我们称这个整数是单调递增的。 给定一个整数 n &#xff0c;返回 小于或等于 n 的最大数字&am…...

.net6解除文件上传限制。Multipart body length limit 16384 exceeded

在C#中上传文件时如果不修改默认文件的上传大小会提示Multipart body length limit 16384 exceeded这个错误提示表明你的请求中的Multipart body长度超过了16384字节的限制。这通常意味着你正在尝试发送一个太大的请求体&#xff0c;可能是因为包含了太多数据或者太大的文件。要…...

电子电器架构网络演化 —— 车载以太网TSN

电子电器架构网络演化 —— 车载以太网TSN 我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 屏蔽力是信息过载时代一个人的特殊竞争力&#xff0c;任何消…...

智能门锁触控工作原理中应用的电容式触摸芯片

智能门锁的识别技术中&#xff0c;密码几乎成为标配功能。相比机械按键的触控方式&#xff0c;电容式触控方式可以在加上一层玻璃甚至金属一体成型之后与用户进行交互&#xff0c;由于进行了物理性隔离&#xff0c;使得外壳更具完整性&#xff0c;物理上安全性更佳。电容式触控…...

Spark 中 BroadCast 导致的内存溢出(SparkFatalException)

背景 本文基于 Spark 3.1.1 open-jdk-1.8.0.352目前在排查 Spark 任务的时候&#xff0c;遇到了一个很奇怪的问题&#xff0c;在此记录一下。 现象描述 一个 Spark Application, Driver端的内存为 5GB,一直以来都是能正常调度运行&#xff0c;突然有一天&#xff0c;报…...

深度学习经典算法详细模型图

很早绘制的一些模型图&#xff0c;当时放在CSDN的草稿里&#xff0c;今天发现了&#xff0c;把它分享出来吧&#xff0c;还能更清晰的帮助理解&#xff01; 1.AlexNet(2012) 2. VGGNet(2014) 3. SqueezeNet(2016) 4. GoogleNet(2014)...

03、Kafka ------ CMAK(Kafka 图形界面管理工具) 下载、安装、启动

目录 CMAK&#xff08;Kafka 图形界面管理工具&#xff09;下载安装启动打开 cmak 图形界面 CMAK&#xff08;Kafka 图形界面管理工具&#xff09; Kafka本身并没有提供Web管理工具&#xff0c;而是推荐使用bin目录下各种工具命令来管理Kafka&#xff0c; 这些工具命令其实用起…...

KubeSphere 容器平台高可用:环境搭建与可视化操作指南

Linux_k8s篇 欢迎来到Linux的世界&#xff0c;看笔记好好学多敲多打&#xff0c;每个人都是大神&#xff01; 题目&#xff1a;KubeSphere 容器平台高可用&#xff1a;环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...

设计模式和设计原则回顾

设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...

linux之kylin系统nginx的安装

一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源&#xff08;HTML/CSS/图片等&#xff09;&#xff0c;响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址&#xff0c;提高安全性 3.负载均衡服务器 支持多种策略分发流量…...

应用升级/灾备测试时使用guarantee 闪回点迅速回退

1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间&#xff0c; 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点&#xff0c;不需要开启数据库闪回。…...

基于Uniapp开发HarmonyOS 5.0旅游应用技术实践

一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架&#xff0c;支持"一次开发&#xff0c;多端部署"&#xff0c;可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务&#xff0c;为旅游应用带来&#xf…...

定时器任务——若依源码分析

分析util包下面的工具类schedule utils&#xff1a; ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类&#xff0c;封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz&#xff0c;先构建任务的 JobD…...

el-switch文字内置

el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...

【Go】3、Go语言进阶与依赖管理

前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课&#xff0c;做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程&#xff0c;它的核心机制是 Goroutine 协程、Channel 通道&#xff0c;并基于CSP&#xff08;Communicating Sequential Processes&#xff0…...

VTK如何让部分单位不可见

最近遇到一个需求&#xff0c;需要让一个vtkDataSet中的部分单元不可见&#xff0c;查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行&#xff0c;是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示&#xff0c;主要是最后一个参数&#xff0c;透明度…...

【HTML-16】深入理解HTML中的块元素与行内元素

HTML元素根据其显示特性可以分为两大类&#xff1a;块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...