网站首页 > java教程 正文
背景
在我的项目中,会存在一个DG下拥有10w+的学生,每个学生在进入直播之前,都需要通过校验,查询是否是这个直播所关联DG下的学生;为了提高并发,我们把大纲和学生的关系存入Redis中,使用set存储,那么一个DG的key会存储过多的元素(学生ID),形成Redis大key的情况。
在阿里云 Redis 的开发规范, 对value设计有以下建议:
- 1)【强制】:拒绝 bigkey(防止网卡流量、慢查询) string 类型控制在 10KB 以内,hash、list、set、zset 元素个数不要超过 5000。
反例:一个包含 200 万个元素的 list。
非字符串的 bigkey,不要使用 del 删除,使用 hscan、sscan、zscan 方式渐进式删除,同时要注意防止 bigkey 过期时间自动删除问题 (例如一个 200 万的 zset 设置 1 小时过期,会触发 del 操作,造成阻塞,而且该操作不会不出现在慢查询中 (latency 可查)),查找方法和删除方法
value中存储过多的元素拆分方案
类似这种场景,可以将这些元素分拆。
现在,固定一个桶(bucket)的数量,比如 5000, 每次存取的时候,先在本地计算field的hash值,模除 5000, 确定了该field落在哪个key上。
以上的DG学生场景,我们根据学生ID模除5000,确定该学生落在哪个key上;
为了方便获取大纲下所有的学生ID,那么维护一个key来存储大纲学生key的集合(学生ID模除 5000的值)
下图简要说明我们是怎么设计实现的:
- 我们定义每个key为一个桶,那么这个桶 bucket=学生ID模除5000
- 为了快速查询所有桶,把桶的序号存储在 her:sy:{syllabusId}:b key的set集合中
- 其中 syllabusId 为DG
不适合的场景
如果要保证 SPOP 的数据的确是集合中的一个随机元素,这个就需要一些附加的属性,或者是在key的拼接上做一些工作
猜你喜欢
- 2025-03-29 Rust 学习笔记-6 有趣的字符串(rust 例子)
- 2025-03-29 挑战刷leetcode第17天(分割回文串)
- 2025-03-29 LeetCode-131-分割回文串(分割段式回文串)
- 2025-03-29 Java程序员,一周Python入门:数据类型、变量、字符串和字符编码
- 2025-03-29 线上系统性能太差,我手写了字符串切割函数,性能提升10倍以上
- 2025-03-29 java中常用第三方类库(java第三方类库放在哪个目录)
- 2025-03-29 没想到字符串分割还能这样玩(字符串切割的方法)
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)