码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 【Redis优化——如何优雅的设计key,优化BigKey,Pipeline批处理Key】


    Redis优化——如何优雅的设计key,优化BigKey,Pipeline批处理Key

    • 一、Key的设计
      • 1. 命名规范
      • 2. 长度限制在44字节以内
    • 二、BigKey优化
      • 1. 查找bigkey
      • 2. 删除BigKey
      • 3. 优化BigKey
    • 三、Pipeline批处理Key
      • 1. 单节点的Pipeline
      • 2. 集群下的Pipeline

    一、Key的设计

    1. 命名规范

    业务名+数据名+id
    例如存储用户登录信息:login:user:id
    

    2. 长度限制在44字节以内

    如果使用的时Redis6.0版本以上,Key的编码规则有三个,int, enbstr, raw 44字节内的Key会用int或身体乳mb编码,内存占用小

    二、BigKey优化

    1. 查找bigkey

    • 可以使用scan 0 扫描所有的Key,然后使用strlen查出大Key,这里不要使用keys *命令,会阻塞主线程
    • 可以是使用Redis的第三方工具进行检测

    2. 删除BigKey

    • 使用unlink key 命令删除,不要使用Del key 这也会阻塞

    3. 优化BigKey

    • 对于大的JSON对象可以使用Hash数据结构存储,因为Hash的底层用到了ZipList,节约内存
    • 对于大的Hash呢,比如一个Hash表有100万条数据,key从0-100万,此时我们可以打散Hash,就是让每100个key存储到一个hash表,让key/100,value%100,类似于分片了

    三、Pipeline批处理Key

    原理:建立一次网络连接,执行多条Redis命令
    

    1. 单节点的Pipeline

        @Test
        void testPipleLine(){
            Jedis jedis = new Jedis("host", 6379);
            jedis.auth("xxx");
            Pipeline pipeline = jedis.pipelined();
    
            for (int i = 0; i < 1000; i++) {
                pipeline.set("nb:key" + i, "value" + i);
                if (i % 100 == 0){ // 每次放入100行命令
                    pipeline.sync();
                }
            }
        }
    

    2. 集群下的Pipeline

    • 集群部署Redis,插入Key,每一个Key又有一个 slot插槽,这个插槽分布在所有Redis节点中,所以如果批量插入的key的插槽不在同一个节点,那么还是会有多次网络请求,最坏又变成了每次连接执行一条命令
    • 解决方案采用并行slot方式
      并行Slot
    	//使用springredistemplate封装好的工具类
        @Test
        void testslotPipeline(){
            Map<String, String> map = new HashMap<>();
            map.put("name", "111");
            map.put("age", "222");
            map.put("gemder", "333");
            redisTemplate.opsForValue().multiSet(map);
    
        }
    
  • 相关阅读:
    探究MySQL中SQL查询的成本
    minio使用案例(Springboot)
    不用 Spring 居然连最基本的接口都不会写了
    通过js动态改变style样式的方法
    02-vue_hello小案例
    全面理解DID-Web3.0身份账户
    frp内网穿透并实现开机自启动
    快速修复“找不到xinput1_3.dll无法继续执行此代码的”问题的5个方法
    链表oj题2(Leetcode)(牛客)——合并两个有序链表;判断回文链表;链表分割
    解决报错之org.aspectj.lang不存在
  • 原文地址:https://blog.csdn.net/Panci_/article/details/143376191
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号