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、…

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…

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

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

测试自动生成目录

目录 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 是一个非常流行的选择。 本次在一个企业入…

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…

HTML+CSS+JS 扩散登录表单动画

效果演示 Code <!DOCTYPE html> <html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"><meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1,us…

光明于心,自理成翼:盲人生活自理能力训练探索

在探索未知的旅途中&#xff0c;盲人朋友同样怀揣着对自由与独立的向往。随着科技的不断进步&#xff0c;一款名为“蝙蝠避障”的辅助软件以其独特的实时避障与拍照识别功能&#xff0c;成为了盲人朋友提升生活自理能力的有力工具。本文将深入探讨盲人生活自理能力训练&#xf…

代码随想录--哈希表--有效的字母异位词

题目 给定两个字符串 s 和 t &#xff0c;编写一个函数来判断 t 是否是 s 的字母异位词。 示例 1: 输入: s “anagram”, t “nagaram” 输出: true 示例 2: 输入: s “rat”, t “car” 输出: false 说明: 你可以假设字符串只包含小写字母。 思路 先看暴力的解法&am…

低功耗 DC/DC 转换器的复杂设计原理分析介绍

DC/DC 转换解决方案都是低噪声线性设计&#xff0c;易于使用&#xff0c;但有两个主要缺点。首先&#xff0c;输出电压必须始终低于输入电压&#xff1b;然而&#xff0c;线性稳压器的效率非常低&#xff0c;并且将大部分供电功率以热量的形式耗散。其次&#xff0c;根据输入和…

ZISUOJ 数据结构--图及其应用

说明 主要考察建图&#xff0c;图的遍历以及求最小生成树。都还是比较简单的&#xff0c;后面就直接上代码了。 最小生成树采用prim还是kruskal算法要看题目怎么给出数据&#xff0c;如果以邻接矩阵的形式给出&#xff0c;采用prim算法比较合适&#xff0c;如果以边和边的权重的…

盲人社会适应性训练:打开生活的新篇章

在现代社会的快节奏中&#xff0c;每一位成员都在寻求更好的方式来适应环境&#xff0c;对于盲人群体而言&#xff0c;这种适应性尤为关键。盲人社会适应性训练作为一个旨在提升盲人生活质量和独立性的系统性过程&#xff0c;正逐步受到广泛关注。在这一过程中&#xff0c;一款…