首页 > 数据库 >Redis bigkey解决方案

Redis bigkey解决方案

时间:2024-04-11 19:22:06浏览次数:24  
标签:return 解决方案 Redis bigkey key byte 节点 con

什么是大key

查询bigkey

集群模式查看bigkey

redis-cli排查

cluster模式排查大key
因为clister集群模式下查询bigkey时,因为键会分散在不同的槽(slot)和不同的节点上,因此需要分别连到各个主节点进行检查,或者在命令添加-c参数
首先需要查看cluster各个节点,连接其中任意一个节点执行以下命令

CLISTER NODES

查看集群中每个节点的信息,返回结果如下,是以空格分割的CSV格式

07c37dfeb235213a872192d90877d0cd55635b91 127.0.0.1:30004@31004,hostname4 slave e7d1eecce10fd6bb5eb35b9f99a514335d9ba9ca 0 1426238317239 4 connected
67ed2db8d677e59ec4a4cefb06858cf2a1a89fa1 127.0.0.1:30002@31002,hostname2 master - 0 1426238316232 2 connected 5461-10922
292f8b365bb7edb5e285caf0b7e6ddc7265d2f4f 127.0.0.1:30003@31003,hostname3 master - 0 1426238318243 3 connected 10923-16383
6ec23923021cf3ffec47632106199cb7f496ce01 127.0.0.1:30005@31005,hostname5 slave 67ed2db8d677e59ec4a4cefb06858cf2a1a89fa1 0 1426238316232 5 connected
824fe116063bc5fcf9f4ffd895bc17aee7731ac3 127.0.0.1:30006@31006,hostname6 slave 292f8b365bb7edb5e285caf0b7e6ddc7265d2f4f 0 1426238317741 6 connected
e7d1eecce10fd6bb5eb35b9f99a514335d9ba9ca 127.0.0.1:30001@31001,hostname1 myself,master - 0 0 1 connected 0-5460

每行格式如下:

<id> <ip:port@cport[,hostname]> <flags> <master> <ping-sent> <pong-recv> <config-epoch> <link-state> <slot> <slot> ... <slot>

其中可以区分是否主从节点
master 主节点
slave 从节点
myself 当前节点
fail 当前节点处于失恋状态
如果是从节点,展示主节点的ID,如果是主节点,则显示-,可以看出谁是谁的主节点,谁是谁的从节点
表示当前节点的hash槽
以三主三从为例可以看到当前集群的节点信息

通过以上获取到各个节点信息,可以查看每个节点的bigkey情况
执行命令

redis-cli -h 节点ip -p 端口 --bigkeys

返回的并非就是bigkey, 而是每个类型的top1,同时给出每种数据类型的键值个数和平均大小, 大致衡量大小为:string类型大于10kb,hash,zset,list,set元素个数超过5000个,
以三主三从为例,如果卡槽为0-5460、5461-10922可能会出现以下提示

意味着访问的key被移到另一卡槽了可以手动重定向到提示的MOVE节点进行尝试

除了上述方法,也可以使用下面命令查看某个key的大小

MEMORY USAGE key [SAMPLES count]

返回结果为所占字节大小,如果key不存在resps2返回nil,resp3返回null

解决方案

如何是key的名称较大,可以使用md5进行摘要算法生成固定的长度

如果是value较大,可以拆分为多个子key,比如一个大的list,拆分成多个小的list

再利用管道操作可以一定程度上保证事务

public void saveBigKey() {
        ArrayList<Object> list = new ArrayList<>();
        List<List<Object>> partList = Lists.partition(list, 100);
        String masterKey = "master_key";
        redisTemplate.executePipelined((RedisCallback<Object>) con -> {
            con.del(rawKey(masterKey));
            for (int i = 0; i < partList.size(); i++) {
                String partKey = String.format("CHILD_KEY_%s", i);
                con.set(rawKey(partKey), rawValue(JsonUtil.dumpObject(partList.get(i))));
                con.expire(rawKey(partKey), TimeUnit.DAYS.toSeconds(2));
                con.zAdd(rawKey(masterKey), i, rawValue(partKey));
            }
            con.expire(rawKey(masterKey), TimeUnit.DAYS.toSeconds(1));
            return null;
        });
    }

    RedisSerializer keySerializer() {
        return redisTemplate.getKeySerializer();
    }

    RedisSerializer valueSerializer() {
        return redisTemplate.getValueSerializer();
    }

    @SuppressWarnings("unchecked")
    byte[] rawKey(Object key) {

        Assert.notNull(key, "non null key required");

        if (keySerializer() == null && key instanceof byte[]) {
            return (byte[]) key;
        }

        return keySerializer().serialize(key);
    }

    @SuppressWarnings("unchecked")
    byte[] rawValue(Object value) {

        if (valueSerializer() == null && value instanceof byte[]) {
            return (byte[]) value;
        }

        return valueSerializer().serialize(value);
    }

标签:return,解决方案,Redis,bigkey,key,byte,节点,con
From: https://www.cnblogs.com/LiuFqiang/p/18100719

相关文章

  • Redis Stack功能介绍及redis-om-dotnet使用示例
    为了简化开发人员对较新的 Redis模块及其提供的功能的体验,同时简化支持其功能的文档和客户端。以帮助开发人员从开始使用 Redis的那一刻起,就能充分提高工作效率。RedisStack诞生了。RedisStack将较新的Redis模块整合到一个产品中。这使得我们可以轻松地开始使用我们基于......
  • 【Redis】Linux下安装Redis(二)——安装客户端
    在Linux下安装完成Redis后(详见上一篇),可以安装客户端了。这里谈到的客户端包括:命令行客户端图形化桌面客户端作为非资深玩家,好多东西还是挺喜欢图形化界面的。命令的优势是快,缺点是要先记住很多命令,入门比图形化界面慢。命令行客户端Redis安装完成后就自带了命令行客户端:red......
  • Redis--主从,哨兵,cluster模式介绍
    redis提供了三种模式来构建高性能、高可用性和可扩展性的数据存储集群,分别是主从复制模式(Master-SlaveReplication),哨兵模式(SentinelMode),集群模式(ClusterMode)。特性/配置主从哨兵cluster主要目的数据备份与读写分离高可用性与故障自动切换高并发与数据分散处理......
  • npm安装时一直idealTree:npm: sill idealTree buildDeps解决方案
    1.删除用户界面下的npmrc文件(注意一定是用户C:\Users\{账户}\下的.npmrc文件下不是nodejs里面)2.清除缓存,注意不要用npmcacheclean--force,容易出现npmWARNusing--forceIsurehopeyouknowwhatyouaredoing.要用:npmcacheverify3.设置镜像源:npmconfigsetregis......
  • redis自学(32)哨兵的作用和工作原理
    哨兵的作用Redis提供了哨兵(Sentinel)机制来实现主从集群的自动故障恢复。哨兵的结构和作用如下:    服务状态监控Sentinel基于心跳机制监测服务状态,每隔1秒想集群的每个实例发送ping命令。l 主观下线:如果某sentinel节点发现某实例未在规定时间响应,则认为该实例主观下......
  • 编程中常见的技术难题及其解决方案
    编程中常见的技术难题及其解决方案在编程过程中,我们经常会遇到各种技术难题。这些难题可能来自于语言特性、算法设计、数据结构、并发编程等多个方面。本文将介绍一些常见的编程技术难题,并给出相应的解决方案。一、语言特性相关难题内存管理:在某些编程语言中,内存管理是一......
  • 腾讯云轻量服务器月流量用尽怎么办?解决方案及优惠活动总结
    随着云计算的普及,越来越多的用户选择了腾讯云的轻量应用服务器。其中,月流量是一个重要的考量指标。那么,腾讯云轻量服务器的3500G月流量意味着什么呢?简单来说,这是指在一个月内,从您的轻量服务器流出的数据总量上限为3500GB。对于大多数用户而言,3500G的月流量是相当充裕的,正常使......
  • Redis的Lua脚本使用方法详解
    Redis的Lua脚本功能允许用户执行一段自定义的Lua代码,该代码可以访问和操作Redis的数据。这个功能对于执行复杂的操作或事务性的操作特别有用,因为它可以保证操作的原子性。下面是Redis的Lua脚本使用方法的详细解释:1.EVAL命令Redis提供了EVAL命令来执行Lua脚本。这个命令的基本......
  • docker安装运行Redis
    第一步:下拉redisdockerpullredis:7.2.4我下拉的是目前最新版本,也就是7.2.4版本dockerps查看容器运行情况第二步:挂载目录mkdir-p/home/user/lyapp/redis/conf/home/user/lyapp/redis/data第三步:新建并修改配置文件在/path/redis/conf/下新建redis.conf文件,即/home/user/l......
  • Redis Pipelining 底层原理分析及实践
    作者:vivo互联网服务器团队-WangFeiRedis是一种基于客户端-服务端模型以及请求/响应的TCP服务。在遇到批处理命令执行时,Redis提供了Pipelining(管道)来提升批处理性能。本文结合实践分析了SpringBoot框架下Redis的Lettuce客户端和Redisson客户端对Pipeline特性的支持原理,并针......