【Redis最佳实践】优雅的键值设计

原创 程序猿羊 程序猿小杨 2023-09-07 07:54 发表于湖北

收录于合集#Redis16个

程序猿小杨

分享Java相关技术、数据库、Python、职场、感悟、视频资源等干货和学习心得。 如:kettle、ES、redis\mongoDB、springboot、Zookeeper、高并发多线程、中间件、JVM、程序员攻略等。

73篇原创内容

公众号

             

图片

                 

近期热推文章:

    1、springBoot对接kafka,批量、并发、异步获取消息,并动态、批量插入库表;

    2、SpringBoot用线程池ThreadPoolTaskExecutor异步处理百万级数据;

    3、基于Redis的Geo实现附近商铺搜索(含源码)

    4、基于Redis实现关注、取关、共同关注及消息推送(含源码)

    5、SpringBoot整合多数据源,并支持动态新增与切换(详细教程)

    6、基于Redis实现点赞及排行榜功能

一、优雅的Key设计

图片

二、BigKey问题--value

2.1、什么是BIgKey?

BigKey通常以Key的大小和Key中成员的数量来综合判定,例如:

    Key本身的数据量过大:一个String类型的Key,它的值为5MB。

    Key中的成员数过多:一个ZSET类型的Key,它的成员数量为10,000个。

    Key中成员的数据量过大:一个Hash类型的Key,它的成员数量虽然只有1,000个但这些成员的Value(值)总大小为100MB。

推荐值:

    1、单个key的value小于10kb;2、对于集合类型的key,建议元素数量小于1000。

2.2、BigKey的危害?

图片

2.3、如何发现BigKey?

图片

2.4、如何删除BigKey?

图片

三、恰当的数据类型

3.1、存储对象的三种方式

图片

3.2、对于Hash类型的大key,如何优化?

图片

方案1:调整hash-max-ziplist-entries的上限

命令如下:

redis(6.2):0>config get hash-max-ziplist-entries1) "hash-max-ziplist-entries"2) "512"  --默认原来是512
redis(6.2):0>config set hash-max-ziplist-entries 1000"OK"redis(6.2):0>config get hash-max-ziplist-entries1) "hash-max-ziplist-entries"2) "1000" --调整为1000,但是不建议调整超过1000

方案2:拆分为String类型

图片

方案3:拆分为小hash

图片

操作案例:

/**     * 功能描述:测试bigHash的     * @MethodName: testBigHash     * @MethodParam: []     * @Return: void     * @Author: yyalin     * @CreateDate: 2023/8/24 9:44     */    public void testBigHash(){        Map<String,String> map = new HashMap<>();        for(int i=0;i<100000;i++){            map.put("key_"+i,"value_"+i);        }        redisUtil.hPutAll("test:big:hash",map);    }    /**     * 功能描述:测试字符串bigKey     * @MethodName: testBigString     * @MethodParam: []     * @Return: void     * @Author: yyalin     * @CreateDate: 2023/8/24 9:59     */    public void testBigString(){        for(int i=0;i<100000;i++){            redisUtil.set("test:str:key_"+i,"value_"+i);        }    }    /**     * 功能描述:测试smallHash     * @MethodName: testSmallHash     * @MethodParam: []     * @Return: void     * @Author: yyalin     * @CreateDate: 2023/8/24 10:05     */    public void testSmallHash(){        int hashSize=100;        Map<String,String> map = new HashMap<>(hashSize);        for(int i=1;i<= 100000;i++){            int key=(i-1)/hashSize;            int value=i%hashSize;            map.put("key_"+value,"value_"+value);            if(value==0){                redisUtil.hPutAll("test:small:hash_"+key,map);            }        }
    }

测试结果:

图片

四、总结

图片

图片

       如果大家对相关文章感兴趣,可以关注微信公众号"程序猿小杨",会持续更新优秀文

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值