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

news/2024/11/1 14:42:20/

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

    @Testvoid 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封装好的工具类@Testvoid testslotPipeline(){Map<String, String> map = new HashMap<>();map.put("name", "111");map.put("age", "222");map.put("gemder", "333");redisTemplate.opsForValue().multiSet(map);}

http://www.ppmy.cn/news/1543609.html

相关文章

一次明白——Vue.js组件开发!

Vue.js 是一个用于构建用户界面的渐进式框架。Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层&#xff0c;不仅易于上手&#xff0c;还适用于与其他库或已有项目整合。另一方面&#xff0c;Vue 完全有能力通过其辅助库 Vuex 和 Vue Router 构建最复杂的单页应用。…

Go 语言之搭建通用 Web 项目开发脚手架

Go 语言之搭建通用 Web 项目开发脚手架 MVC 模式 MVC 模式代表 Model-View-Controller&#xff08;模型-视图-控制器&#xff09; 模式。这种模式用于应用程序的分层开发。 Model&#xff08;模型&#xff09; - 模型代表一个存取数据的对象或 JAVA POJO。它也可以带有逻辑&…

设计模式(六)

设计模式(六) 组件构建过程中&#xff0c;某些接口之间的依赖常常会带来很多问题&#xff0c;甚至根本无法实现。采用添加一层间接稳定接口&#xff0c;来隔离本来互相紧密关联的接口是一种常见的解决方案 1.门面&#xff08;Facade&#xff09;&#xff1a;门面类知道哪些子系…

InnoDB存储引擎对MVCC实现

MVCC&#xff08;多版本并控制&#xff09; 概念&#xff1a;MVCC 是一种并发控制机制。 作用&#xff1a;多个并发事务同时读写数据库时保持数据的一致性和隔离性 实现&#xff1a;在每个数据行上维护多个版本的数据来实现的。当一个事务要对数据库中的数据进行修改时&…

一种基于机器学习的面向内生安全系统的入侵修复方式

摘要&#xff1a;本文主要是根据上课老师所提供的题目以及平时上课的学习&#xff0c;结合自己的理解按照要求设计的一种基于机器学习等方法的面向内生安全系统的入侵修复方式和系统&#xff0c;虽然大部分只是一种猜想并未实际实现&#xff0c;但是所体现的创新性等也是有可取…

Lua 函数

Lua 函数 Lua 是一种轻量级的编程语言&#xff0c;广泛用于游戏开发、脚本编写和其他应用程序中。在 Lua 中&#xff0c;函数是一等公民&#xff0c;这意味着它们可以被赋值给变量&#xff0c;作为参数传递给其他函数&#xff0c;甚至可以作为其他函数的返回值。本文将详细介绍…

Rust 力扣 - 1423. 可获得的最大点数

文章目录 题目描述题解思路题解代码题解链接 题目描述 题解思路 题目所求结果存在下述等式 可获得的最大点数 所有卡牌的点数之和 - 长度为&#xff08;卡牌数量 - k&#xff09;的窗口的点数之和的最小值 我们遍历长度为&#xff08;卡牌数量 - k&#xff09;的窗口&#…

springboot2.x使用SSE方式代理或者转发其他流式接口

文章目录 1.需求描述2.代码2.1.示例controller2.2.示例service2.3.示例impl 3.测试 1.需求描述 使用SSE的方式主要还是要跟前端建立一个EventSource的链接&#xff0c;有了这个连接&#xff0c;然后往通道里写入数据流&#xff0c;前端自然会拿到流式数据&#xff0c;写啥拿啥…