Redis-键值设计

news2024/10/6 1:15:43

Redis-键值设计

1.设置key的规范

  1. 遵循基本格式:【业务名称】:【数据名】:【id】 可读性强,在客户端的情况下使用:如果前缀相同会分目录层级
  2. 长度不超过44字节 string数据结构的三种类型,在44字节之内是embstring 内存占用小
  3. 不包含特殊字符

优点

  • 可读性强
  • 避免key冲突
  • 方便估计案例
  • 更节省内存

2.BigKey

什么是BigKey

在redis中存储的value空间大,导致效率变低。

BigKey的危害
  1. 网络阻塞
    对BigKey执行读请求时,少量的QPS就可能导致带宽使用率被占满,网络速度变慢

  2. 数据倾斜
    BigKey所在的Redis示例内存使用率远超其他示例

  3. Redis阻塞

    对元素较多的hash,list,zset,set做运算会耗时

  4. CPU压力
    对BigKey的数据序列化和反序列化会导致cpu的使用飙升

如何排查BigKey
  1. redis-cli-bigkeys

  2. scan扫描 Java代码示例
    引入pom

    <dependency>
                <groupId>redis.clients</groupId>
                <artifactId>jedis</artifactId>
                <version>3.8.0</version> <!-- 替换为最新的稳定版本 -->
            </dependency>
    
    /**
     * 排查大key
     *
     */
    @SpringBootTest
    public class RedisScanBigKey {
    
        /**
         * 字符串的大key
         */
        final static int STR_MAX_LEN = 10 * 1024;
        /**
         * 集合的大key
         */
        final static int HASH_MAX_LEN = 500;
    
        @Test
        public void scanBigKey() {
            Jedis jedis = new Jedis("localhost", 6379);
            int maxLen = 0;
            long len = 0;
            // 开始游标,首次调用传入0
            String cursor = "0";
    
            do {
                // 执行SCAN命令,传入游标、匹配模式(可选)和COUNT(可选)
                ScanResult<String> scanResult = jedis.scan(cursor);
    
                cursor = scanResult.getCursor();
                // 处理本次扫描返回的元素
                List<String> list = scanResult.getResult();
                if (CollectionUtil.isEmpty(list)) {
                    break;
                }
                // 遍历
                for (String key : list) {
                    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("大Key的值 : %s, type: %s, length or size: %d %n", key, type, len);
                    }
                    // 检查是否已遍历完所有元素
                }
            }
                while (!"0".equals(cursor));
        }
    }
    
  3. 第三方工具

  4. 网络监控

如何删除大BigKey

bigkey内存占用较多,即使删除也需要占用非常多的时间,导致redis主线程阻塞

  • redis3.0以下版本:如果是集合类型则遍历bigkey的元素,逐个删除.建议使用scan扫描然后以此删除
  • redis4.0以后:提供了异步删除命令:unlink

3.使用恰当的数据类型

在这里插入图片描述

在这里插入图片描述

/**
     * 给大key瘦身 拆分成小hash
     */
    @Test
    void smallHash(){
        Jedis jedis = new Jedis("localhost", 6379);

        int hashSize = 100;
        Map<String, String> map = new HashMap<>(hashSize);
        for (int i = 0; i < 100000; i++) {
            int k = (i -1) / hashSize;
            int v = i % hashSize;
            map.put("key_" + v , "value_" + v);
            if (v == 0){
                jedis.hmset("test:small:hash_" + k, map);
            }
        }
    }


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

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

相关文章

1.5MHz,1.2A COT 架构同步降压变换器只要0.16元,型号:LN3435

推荐原因 1.5MHZ的开关频率&#xff0c;可以使用小电感&#xff0c;1.2A满足多数应用&#xff0c;价格感人&#xff0c;只要0.16元 产品概述 LN3435是一款电流模COT架构同步降压开关稳压器。 输入范围为 2.7V-6.0V&#xff0c;可提供 1.2A 的连续输出电流。 内部集成了低内阻…

【Excel2LaTeX】复杂表格制作的解决方案

刚开始用LaTeX写论文&#xff0c;遇到的第一道坎就是绘制表格&#xff0c;较小的普通表格可以通过简单的语法实现&#xff0c;但是较大的复杂的表格却让我无从下手。 Excel2LaTeX插件 这里介绍一种我用到非常顺手的工具&#xff1a;Excel2LaTeX插件&#xff0c;下载地址&#x…

SQL系统函数知识点梳理(Oracle)

这里写目录标题 函数系统函数转换函数to_date()to_char()将数值转换成字符格式 添加货币符号将日期转换成字符 其他不常用的转换函数 字符型函数连接函数大小写转换函数大写转换小写转换首字母大写&#xff0c;其余的小写 替换函数去除空格函数截取函数填充函数获取字符长度函数…

35、链表-LRU缓存

思路&#xff1a; 首先要了解LRU缓存的原理&#xff0c;首先定下容量&#xff0c;每次get请求和put请求都会把当前元素放最前/后面&#xff0c;如果超过容量那么头部/尾部元素就被移除&#xff0c;所以最近最少使用的元素会被优先移除&#xff0c;保证热点数据持续存在。 不管放…

宿州市水环境投资 | 邀您参加2024全国水科技大会暨技术装备成果展览会

嘉宾简介 田 云 宿州市水环境投资建设有限公司 董事长兼总经理 报告题目&#xff1a;宿州市主城区水环境智慧水务建设交流 男&#xff0c;回族&#xff0c;1976年6月生&#xff0c;新疆克拉玛依人&#xff0c;2007年4月加入中国共产党&#xff0c;1999年7月参加工作&a…

docker安装clickhouse数据库

1.创建目录 mkdir -p /data/clickhouse/data mkdir -p /data/clickhouse/conf mkdir -p /data/clickhouse/log2.拉取镜像 docker pull clickhouse/clickhouse-server3.创建临时容器 docker run -d --rm --name clickhouse-server --ulimit nofile262144:262144 clickhouse/c…

ELK日志分析系统之Kafka

目录 一、消息队列基本介绍 1、为什么需要消息队列(MQ) 2、使用消息队列的好处 1.解耦 2.可恢复性 3.缓冲 4.灵活性 & 峰值处理能力 5.异步通信 3、Kafka消息队列的两种模式 1.点对点模式 2.发布/订阅模式 二、Kafka基本介绍 1、Kafka定义 2、Kafka概念 3、…

IO流高级流

前言 缓冲区能够提升输入输出的效率 虽然FileReader和FileWriter中也有缓冲区 但是BufferedReader和BufferWriter有两个非常好用的方法. 缓冲流 字节缓冲流 import java.io.*;public class BufferedStreamDemo {public static void main(String[] args) throws IOExceptio…

网工基础协议——TCP/UDP协议

TCP和UDP的不同点&#xff1a; TCP(Transmission Control Protocol&#xff0c;传输控制协议)&#xff1b; UDP(User Data Protocol&#xff0c;用户数据报协议)&#xff1b; TCP&#xff1a;传输控制协议&#xff0c;面向连接可靠的协议&#xff0c;只能适用于单播通信&…

Remote Desktop Web修改密码,自动填写域前缀

C:\Windows\Web\RDWeb\Pages\zh-CN\password.aspx 内 添加 value“ITinfra” CMD或者powershell 重启IIS服务&#xff1b; iisreset

【漏洞复现】飞企互联-FE企业运营管理平台 ProxyServletUti接口处存在任意文件读取漏洞

免责声明&#xff1a;文章来源互联网收集整理&#xff0c;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;所产生的一切不良后果与文章作者无关。该…

设备全生命周期管理平台:各领域的关键手段

在当今的各个领域中&#xff0c;设备全生命周期管理平台正逐渐崭露头角&#xff0c;成为提高设备管理水平的关键手段。 数字化转型已成为众多企业的重要发展方向&#xff0c;将设备管理数字化可显著提高效率与准确性。同时&#xff0c;智能化应用&#xff0c;如利用人工智能和机…

Java——代码块

目录 一.代码块概念以及分类 二.普通代码块 三.构造代码块 四.静态代码块 一.代码块概念以及分类 使用 {} 定义的一段代码称为代码块。根据代码块定义的位置以及关键字&#xff0c;又可分为以下四种&#xff1a; 普通代码块构造块静态块同步代码块&#xff08;后续讲解多…

【vue3】插件@tsparticles/vue3、tsparticles实现粒子特效

文章目录 一、安装依赖二、全局引入三、使用 一、安装依赖 npm i tsparticles/vue3 npm i tsparticles二、全局引入 // main.js import Particles from tsparticles/vue3 import { loadFull } from tsparticlesconst app createApp(App) app.use(Particles, {init: async (e…

远程连接服务器ubuntu系统的PyCharm打不开

问题&#xff1a;远程连接服务器ubuntu系统&#xff0c;PyCharm打不开 尝试杀死服务器进程&#xff0c;重新连接服务器&#xff1a;pkill -u 用户名XShell远程连接&#xff0c;都打不开 解决方案&#xff1a;

python复制文件夹内容

参考博客 https://blog.csdn.net/itfans123/article/details/133710731 案例1 import os import shutildef copy_folder(source_folder, destination_folder):# 创建目标文件夹os.makedirs(destination_folder, exist_okTrue)# 遍历源文件夹中的所有文件和文件夹for item in …

刷穿力扣006-剑指offer一数组——02寻找目标值-二维数组

刷穿力扣006-剑指offer<一>数组——02寻找目标值-二维数组 基本面试题都是我带大家刷的力扣热题100和剑指offer的75道题&#xff0c;建议刷两遍&#xff01;&#xff08;ps:想找工作实习的同学&#xff0c;文末有面试八股和简历模板&#xff09; 题目&#xff1a; 语言…

Python爬虫入门教程!

什么是爬虫? 爬虫就是自动获取网页内容的程序&#xff0c;例如搜索引擎&#xff0c;Google&#xff0c;Baidu 等&#xff0c;每天都运行着庞大的爬虫系统&#xff0c;从全世界的网站中爬虫数据&#xff0c;供用户检索时使用。 爬虫流程 其实把网络爬虫抽象开来看&#xff0c;它…

【智能算法】能量谷优化算法(EVO)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献 1.背景 2023年&#xff0c;M Azizi等人受到物理理论粒子稳定性与衰变性启发&#xff0c;提出了能量谷优化算法&#xff08;Energy Valley Optimizer, DVO&#xff09;。 2.算法原理 2.1算法思想 EVO基于…

数据结构速成--栈

由于是速成专题&#xff0c;因此内容不会十分全面&#xff0c;只会涵盖考试重点&#xff0c;各学校课程要求不同 &#xff0c;大家可以按照考纲复习&#xff0c;不全面的内容&#xff0c;可以看一下小编主页数据结构初阶的内容&#xff0c;找到对应专题详细学习一下。 目录 一…