Redis优化笔记

Redis优化

一:Key:

1.1.Key的规范:

image-20240519214240615
测试如下:
image-20240519214354630

1.2.拒绝BigKey:

image-20240519214511678
我们可以用:
MEMORY USAGE name
命令来看它的大小。

在这里插入图片描述

image-20240519214823088

注意,这里的第二种之所以不使用Keys *,因为在实际生产时,会阻塞线程,而scan就不会。使用举例:
import com.heima.jedis.util.JedisConnectionFactory;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.ScanResult;import java.util.HashMap;
import java.util.List;
import java.util.Map;public class JedisTest {private Jedis jedis;@BeforeEachvoid setUp() {// 1.建立连接// jedis = new Jedis("192.168.150.101", 6379);jedis = JedisConnectionFactory.getJedis();// 2.设置密码jedis.auth("123321");// 3.选择库jedis.select(0);}final static int STR_MAX_LEN = 10 * 1024;final static int HASH_MAX_LEN = 500;@Testvoid testScan() {int maxLen = 0;long len = 0;String cursor = "0";do {// 扫描并获取一部分keyScanResult<String> result = jedis.scan(cursor);// 记录cursorcursor = result.getCursor();List<String> list = result.getResult();if (list == null || list.isEmpty()) {break;}// 遍历for (String key : list) {// 判断key的类型String type = jedis.type(key);switch (type) {case "string":len = jedis.strlen(key);maxLen = STR_MAX_LEN;break;case "hash":len = jedis.hlen(key);maxLen = HASH_MAX_LEN;break;case "list":len = jedis.llen(key);maxLen = HASH_MAX_LEN;break;case "set":len = jedis.scard(key);maxLen = HASH_MAX_LEN;break;case "zset":len = jedis.zcard(key);maxLen = HASH_MAX_LEN;break;default:break;}if (len >= maxLen) {System.out.printf("Found big key : %s, type: %s, length or size: %d %n", key, type, len);}}} while (!cursor.equals("0"));}@AfterEachvoid tearDown() {if (jedis != null) {jedis.close();}}}
建议放在从节点进行。

在这里插入图片描述

1.3.合适的结构:

在这里插入图片描述

用Hash存储:

在这里插入图片描述

用string:

在这里插入图片描述

用多级Hash:

在这里插入图片描述

二:批处理优化:

2.1.MSET与Pipeline:

导入大量数据,一次导入与多次导入谁时间更优秀呢:

先来看看多次导入:

在这里插入图片描述

通过测试,导入时间主要是花在了网络传输上面了。因此,这明显不如第二种:

在这里插入图片描述

下面我们来看看基于mset的批处理:

在这里插入图片描述

但是,有很多的命令具有局限性,其他的数据结构未必有批处理,就算是集合,它的sadd也只是针对同一个key而已。所以我们使用Pipeline:

当然,在spring-redis中,也有批处理,举例如下:
import org.springframework.beans.factory.annotation.Autowired;  
import org.springframework.data.redis.core.RedisCallback;  
import org.springframework.data.redis.core.RedisTemplate;  
import org.springframework.data.redis.connection.RedisConnection;  
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;  
import io.lettuce.core.api.StatefulRedisConnection;  
import io.lettuce.core.api.sync.RedisCommands;  @Service  
public class RedisPipelinedService {  @Autowired  private RedisTemplate<String, String> redisTemplate;  public void executePipelinedCommands() {  redisTemplate.executePipelined((RedisCallback<Object>) connection -> {  RedisCommands<String, String> commands = connection.sync();  // 添加多个命令到 pipeline  commands.set("key1", "value1");  commands.set("key2", "value2");  // ... 可以添加更多命令  // 注意:不需要在这里调用任何返回结果的方法,因为 pipelined 命令是异步的  return null; // RedisCallback 需要返回 Object,但在这里我们不需要它  });  // 注意:上面的 executePipelined 方法是异步的,但会返回一个 List,其中包含每个命令的响应  // 你可以在这里处理这些响应,但在这个例子中我们忽略了它们  }  // 如果你需要更底层的访问(例如,直接使用 Lettuce 的 StatefulRedisConnection),  // 你可以从 LettuceConnectionFactory 获取它,但通常不建议这样做,除非你有特殊需求。  
}
小细节:mset快于Pipeline。

2.2.集群下的批处理:

在这里插入图片描述

在这里插入图片描述

串行:

在这里插入图片描述

并行:
我们还可以使用Spring的方法来实现并行:

在这里插入图片描述

三:服务端优化:

3.1.持久化配置:

在这里插入图片描述

关于第五点:为什么要有这样一个配置:

在这里插入图片描述

这是AOF的刷盘机制,我们可以看到,当刷盘时间大于2s,会导致主节点阻塞,而如果我们在进行刷盘时,磁盘也在进行大量的IO,比如AOF的重写,或者RDB的fork,就会很容易导致主线程等待时间过长。当然,如果设置为yes,可能会丢失一段数据。

3.2.慢查询:

在这里插入图片描述

在这里插入图片描述

当我们执行了一个keys *后,比如我们用慢查询日志来查看一下:

在这里插入图片描述

当然,在redis客户端,可以直接看到慢查询日志:

在这里插入图片描述

这是一些其他的命令;

在这里插入图片描述

3.3.命令与安全配置:

在这里插入图片描述

举例:

在这里插入图片描述

设置为“”表示不允许使用,而第一种表示要用它来替代改命令,其他人就不可能破解。

3.4.内存配置:

在这里插入图片描述

定期重启可以清除数据内存,而进程问题影响也不是很大,所以我们主要是缓冲区问题。

在这里插入图片描述

在这里插入图片描述

四:集群与主从:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

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

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

相关文章

强化学习算法

从上图看出&#xff0c;强化学习可以分成价值/策略、随机策略/确定策略、在线策略/离线策略、蒙特卡洛/时间差分这四个维度。这里分析了基础算法中除了在线策略/离线策略以外的其他维度。 &#xff08;一&#xff09;基础知识 一、基础概念 重点概念&#xff1a;状态S、动作A、…

leetcode题目16

最接近的三数之和 中等 给你一个长度为 n 的整数数组 nums 和 一个目标值 target。请你从 nums 中选出三个整数&#xff0c;使它们的和与 target 最接近。 返回这三个数的和。 假定每组输入只存在恰好一个解。 示例 1&#xff1a; 输入&#xff1a;nums [-1,2,1,-4], targ…

Android:使用Kotlin搭建MVC架构模式

一、简介Android MVC架构模式 M 层 model &#xff0c;负责处理数据&#xff0c;例如网络请求、数据变化 V 层 对应的是布局 C 层 Controller&#xff0c; 对应的是Activity&#xff0c;处理业务逻辑&#xff0c;包含V层的事情&#xff0c;还会做其他的事情&#xff0c;导致 ac…

切换分支报错:Untracked Files Prevent Checkout

切换分支报错&#xff1a;Untracked Files Prevent Checkout 分支切换 Untracked Files Prevent Checkout 新起的项目在切换master分支到工作分支时&#xff0c;出现下图的问题&#xff1a; Untracked Files Prevent Checkout Move or commit them before checkout 网上的解决…

回溯算法05(leetcode491/46/47)

参考资料&#xff1a; https://programmercarl.com/0491.%E9%80%92%E5%A2%9E%E5%AD%90%E5%BA%8F%E5%88%97.html 491. 非递减子序列 题目描述&#xff1a; 给你一个整数数组 nums &#xff0c;找出并返回所有该数组中不同的递增子序列&#xff0c;递增子序列中 至少有两个元素…

大数据智慧消防解决方案(24页PPT)

方案介绍&#xff1a; 大数据智慧消防解决方案是提升消防安全管理水平、保障人民群众生命财产安全的重要手段。通过集成物联网、云计算、大数据、人工智能等先进技术&#xff0c;构建集监测、预警、指挥、救援于一体的智慧消防系统&#xff0c;将为消防安全事业注入新的活力。…

工业级3D开发引擎HOOPS:创新与效率的融合!

在当今这个技术日新月异的时代&#xff0c;3D技术已成为推动各行各业发展的重要力量。从工程设计到游戏开发&#xff0c;从虚拟现实到增强现实&#xff0c;3D技术的应用无处不在&#xff0c;它极大地丰富了我们的生活和工作。而在这样的背景下&#xff0c;HOOPS作为一个强大的3…

vue watch深度监听数组每一项的变化

在 Vue 中&#xff0c;watch 选项默认只能监听对象的属性变化&#xff0c;无法直接监听数组的变化 监听数组变化 一般情况下我们监听数组变化&#xff0c;可以监听长度的变化 watch(() > list.value.length, (now, old) > {// 会在数组长度变化时触发 })上面的写法不能…

面试被问到sizeof的概念

面试被问到sizeof的概念 问题1: 定义一个空的类型 ,里面没有任何成员函数,和成员变量,对该类型求sizeof ,得到的结果是多少? 问题2: 如果在该类型中添加一个构造函数和析构函数呢? 问题3:如果将析构函数标记为虚函数呢? 解答: struct student{}; struct student stu; s…

爬虫技术升级:如何结合DrissionPage和Auth代理插件实现数据采集

背景/引言 在大数据时代&#xff0c;网络爬虫技术已经成为数据收集的重要手段之一。爬虫技术可以自动化地从互联网上收集数据&#xff0c;节省大量人力和时间成本。然而&#xff0c;当使用需要身份验证的代理服务器时&#xff0c;许多现有的爬虫框架并不直接支持代理认证。这就…

CSS动画技术(css-animation)

掌握CSS动画技术 一、CSS动画基础 1. 什么是CSS动画&#xff1f; CSS动画是一种在网页上创建动态效果的技术&#xff0c;通过CSS样式规则来实现元素的平滑过渡和变换。CSS动画通过改变属性值来控制元素的动态外观&#xff0c;如位置、大小、颜色、透明度等。 2. CSS动画与传…

mongoDB初体验

概念 NOSQL not only SQL 文档型数据库&#xff0c;按列存储&#xff0c;分布式架构&#xff0c;批量写入性能好 教程学习札记 db.getCollection("111").find({"name":"Jane"}) 关联关系设计 Example1 引用关系 {"_id":ObjectId(&q…

测试自动生成目录

目录 1&#xff0c;标题一 2&#xff0c;标题二 3&#xff0c;标题三 4&#xff0c;怎么做到的 1&#xff0c;标题一 内容11111111111111111111 2&#xff0c;标题二 内容22222222222222222 3&#xff0c;标题三 内容3333333333333333333 4&#xff0c;怎么做到的

递增链表去重

题目描述&#xff1a; 题目思路&#xff1a; 1.链表内的val是递增的&#xff0c;所以相同的值只会连续重复地出现。 2.设置三个指针&#xff1a; ①指向头结点指针&#xff0c;用于返回链表 ②指向返回链表链尾的指针&#xff0c;用于在新链表添加结点 ③遍历旧链表结点的…

C++ | Leetcode C++题解之第107题二叉树的层序遍历II

题目&#xff1a; 题解&#xff1a; class Solution { public:vector<vector<int>> levelOrderBottom(TreeNode* root) {auto levelOrder vector<vector<int>>();if (!root) {return levelOrder;}queue<TreeNode*> q;q.push(root);while (!q.e…

Redis实践—全国地址信息缓存

一、背景 在涉及全国地址的应用中&#xff0c;地址信息通常被频繁地查询和使用&#xff0c;例如电商平台、物流系统等。为了提高系统性能和减少对数据库的访问压力&#xff0c;可以使用缓存来存储常用的地址信息&#xff0c;其中 Redis 是一个非常流行的选择。 本次在一个企业入…

tomcat关不掉解决方案

改造tomcat的脚本,增加强制关闭tomcat进程. 找到tomcat安装目录&#xff08;如&#xff1a;/data/b2b/b2b_erp02/apache-tomcat-8.5.82/bin&#xff09;&#xff0c;在该目录下有个catalina.sh脚本&#xff0c;在脚本的上面添加一行 CATALINA_PID/data/b2b/b2b_erp02/apache-t…

Redis的下载、安装、启动和初尝试【超级简单】

redis最好是在Linux系统中使用&#xff0c;这是最接近生产实际的环境。 不过&#xff0c;我们初学者&#xff0c;目的是学习Redis的使用、原理&#xff0c;如果在Linux下直接学习Redis&#xff0c;很可能会因为命令不熟悉而劝退&#xff0c;这是不好的。 因此&#xff0c;我主张…

linux命令中arj使用

arj 用于创建和管理.arj压缩包 补充说明 arj命令 是 .arj 格式的压缩文件的管理器&#xff0c;用于创建和管理 .arj 压缩包。 语法 arj(参数)参数 操作指令&#xff1a;对 .arj 压缩包执行的操作指令&#xff1b;压缩包名称&#xff1a;指定要操作的arj压缩包名称。 更多…

.NET Core Web Api Swagger运行异常

遇到的问题 因为新增了一个控制器方法&#xff0c;从而导致在运行Swagger的时候直接报错&#xff0c;异常如下&#xff1a; SwaggerGeneratorException: Conflicting method/path combination "POST api/UserOperationExample" for actions - WebApi.Controllers.Us…