删除策略
1、数据删除策略
- 定时删除
- 惰性删除
- 定期删除
时效性数据的存储结构
- Redis 中的数据,在 expire 中以哈希的方式保存在其中。其 value 是数据在内存中的地址,filed 是对应的生命周期
数据删除策略的目标
在内存占用与 CPU 占用之间寻找一种平衡,顾此失彼都会造成整体 redis 性能的下降,甚至引发服务器宕机或内存泄露
2、三种删除策略
定时删除
- 创建一个定时器,当 key 设置有过期时间,且过期时间到达时,由定时器任务立即执行对键的删除操作
- 优点:节约内存,到时就删除,快速释放掉不必要的内存占用
- 缺点:CPU 压力很大,无论 CPU 此时负载量多高,均占用 CPU,会影响 redis 服务器响应时间和指令吞吐量
- 总结:用处理器性能换取存储空间 (拿时间换空间)
惰性删除
- 数据到达过期时间,不做处理。等下次访问该数据时
- 如果未过期,返回数据
- 发现已过期,删除,返回不存在
- 优点:节约 CPU 性能,发现必须删除的时候才删除
- 缺点:内存压力很大,出现长期占用内存的数据
- 总结:用存储空间换取处理器性能 (拿空间换时间)
定期删除
- 周期性轮询 redis 库中的时效性数据,采用随机抽取的策略,利用过期数据占比的方式控制删除频度
- 特点 1:CPU 性能占用设置有峰值,检测频度可自定义设置
- 特点 2:内存压力不是很大,长期占用内存的冷数据会被持续清理
- 总结:周期性抽查存储空间 (随机抽查,重点抽查)
3、逐出算法
**当新数据进入 redis 时,如果内存不足怎么办? **
- Redis 使用内存存储数据,在执行每一个命令前,会调用 freeMemoryIfNeeded()检测内存是否充足。如果内存不满足新加入数据的最低存储要求,redis 要临时删除一些数据为当前指令清理存储空间。清理数据的策略称为逐出算法
- 注意:逐出数据的过程不是 100% 能够清理出足够的可使用的内存空间,如果不成功则反复执行。当对所有数据尝试完毕后,如果不能达到内存清理的要求,将出现错误信息。
影响数据逐出的相关配置
-
最大可使用内存
maxmemoryCopy
占用物理内存的比例,默认值为 0,表示不限制。生产环境中根据需求设定,通常设置在 50% 以上。
-
每次选取待删除数据的个数
maxmemory-samplesCopy
选取数据时并不会全库扫描,导致严重的性能消耗,降低读写性能。因此采用随机获取数据的方式作为待检测删除数据
-
删除策略
maxmemory-policyCopy
达到最大内存后的,对被挑选出来的数据进行删除的策略
影响数据逐出的相关配置
LRU:最长时间没被使用的数据
LFU:一段时间内使用次数最少的数据
数据逐出策略配置依据
- 使用 INFO 命令输出监控信息,查询缓存 hit 和 miss 的次数,根据业务需求调优 Redis 配置
高级数据类型
1、Bitmaps
基础操作
- 获取指定 key 对应偏移量上的 bit 值
getbit key offsetCopy
- 设置指定 key 对应偏移量上的 bit 值,value 只能是 1 或 0
setbit key offset valueCopy
扩展操作
-
对指定 key 按位进行交、并、非、异或操作,并将结果保存到 destKey 中
bitop op destKey key1 [key2...]Copy
- and:交
- or:并
- not:非
- xor:异或
-
统计指定 key 中 1 的数量
bitcount key [start end]Copy
2、HyperLogLog
基数
- 基数是数据集去重后元素个数
- HyperLogLog 是用来做基数统计的,运用了 LogLog 的算法
基本操作
- 添加数据
pfadd key element1, element2...Copy
- 统计数据
pfcount key1 key2....Copy
- 合并数据
pfmerge destkey sourcekey [sourcekey...]Copy
相关说明
- 用于进行基数统计,不是集合,不保存数据,只记录数量而不是具体数据
- 核心是基数估算算法,最终数值存在一定误差
- 误差范围:基数估计的结果是一个带有 0.81% 标准错误的近似值
- 耗空间极小,每个 hyperloglog key 占用了 12K 的内存用于标记基数
- pfadd 命令不是一次性分配 12K 内存使用,会随着基数的增加内存逐渐增大
- Pfmerge 命令合并后占用的存储空间为 12K,无论合并之前数据量多少
3、GEO
基本操作
- 添加坐标点
geoadd key longitude latitude member [longitude latitude member ...] georadius key longitude latitude radius m|km|ft|mi [withcoord] [withdist] [withhash] [count count]Copy
- 获取坐标点
geopos key member [member ...] georadiusbymember key member radius m|km|ft|mi [withcoord] [withdist] [withhash] [count count]Copy
- 计算坐标点距离
geodist key member1 member2 [unit] geohash key member [member ...]
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于