赞
踩
名称 | 英文名 | 作用域 |
---|---|---|
字符串 | String | 缓存、计数器、分布式Session |
哈希 | Hash | 存放对象 |
列表 | list | 消息队列、文章列表 |
集合 | set | 标签、随机数、社交图谱 |
有序集合 | ZSET | 排行榜 |
Redis作为一个内存数据库,在内存空间不足的时候,为了保证命中率,就会和操作系统页面置换算法类似,选择一定的淘汰策略。
LFU(Least Frequently Used)算法根据数据的历史访问频率来淘汰数据,其核心思想是“如果数据过去被访问多次,那么将来被访问的频率也更高”。
LRU(Least recently used,最近最少使用)算法根据数据的历史访问记录来进行淘汰数据,其核心思想是“如果数据最近被访问过,那么将来被访问的几率也更高”。
Redis中同时使用了惰性过期和定期过期两种过期策略。
在Redis中,一个字符串类型最大可以到512MB,一个二级数据结构(比如hash、list、set、zset等)可以存储大约40亿个(2^32-1)个元素,但实际上不会达到这么大的值,一般情况下如果达到下面的情况,就可以认为它是Bigkey了。
【字符串类型】: 单个string类型的value值超过1MB,就可以认为是Bigkey。
【非字符串类型】:哈希、列表、集合、有序集合等, 它们的元素个数超过2000个,就可以认为是Bigkey。
Bigkey拆分
优化Bigkey的原则就是string减少字符串长度,list、hash、set、zset等减少元素数量。当我们知道哪些key是Bigkey时,可以把单个key拆分成多个key,比如以下拆分方式可以参考。
- big list:list1、list2、...listN
- big hash:可以做二次的hash,例如hash%100
- 按照日期拆分多个:key20220310、key20220311、key202203212
对于缓存操作分成两种:删除缓存和更新缓存(一般不考虑)
先删缓存后更新DB(延时双删解决问题)
先更新DB后删缓存(问题出现率相对较少)
Redis Cluster 中,Sharding 采用 slot (槽) 的概念,一共分成 16384 个槽,这有点儿类似 pre sharding 思路。对于每个进入 Redis 的键值对,根据 key 进行散列,分配到这 16384 个 slot 中的某一个中。使用的 hash 算法也比较简单,就是 CRC16 后 16384 取模 [crc16(key)%16384]。
假设现在我们是三个主节点分别是:A, B, C 三个节点,它们可以是一台机器上的三个端口,也可以是三台不同的服务器。那么,采用哈希槽 (hash slot) 的方式来分配 16384 个 slot 的话,它们三个节点分别承担的 slot 区间是:
这时,如果节点 B 出现故障,整个集群就会出现缺少 5001 到 10000 的哈希槽范围而不可用。
数据key不是与节点绑定,而是与插槽绑定。redis会根据key的有效部分计算插槽值,分两种情况:
使这类数据使用相同的有效部分,例如key都以{typeId}为前缀即可保存在同一个Redis实例上
1、紧急处理方案,扩容
2、生产环境查看Redis内存使用率,分析一定时间段内key数量变化分析是否是大量数据未设置过期时间,或者是因为新版本迭代引起
3、清除bigkey,优化生成bigkey的代码块,调整未设置过期时间的代码块
4、根据业务场景调整淘汰策略
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。