redis的基本数据类型?过期策略?淘汰策略?

redis的基本类型及用途

  • 字符串String
    • 缓存、存用户凭证(分布式会话 )、分布式锁(setnx)、存验证码、存json串,数字(点赞、计数器)
  • 列表List
    • 队列和栈 双向链表 做秒杀抢购、只允许用户登录几台设备 分布式ID
  • 集合Set
    • 无序 唯一 只能抢购一件商品 求集合的差集 并集 交集
  • 有序集合Zset
    • 可排序 分数 数值,定点提醒,排行榜
  • Hash
    • value是键值对,更适合存对象 可以快速定位存储信息且频繁修改的信息 如购物车
  • 位图(Bitmaps)
    • 虽然位图不是 Redis 的一种独立数据类型,但它通过字符串类型实现,用于处理大量的开关状态信息。例如,可以使用位图来跟踪用户是否访问过某个页面。通过 SETBIT、GETBIT、BITCOUNT 等命令操作。
  • HyperLogLog
    • HyperLogLog 是一种用于基数估计的算法,它可以在非常小的内存空间内,实现对大量唯一数据的统计。它非常适合用于统计网站的 UV(独立访客)数量。通过 PFADD、PFCOUNT 等命令操作。
  • 地理空间(Geo)
    • Redis 的地理空间类型用于存储地理位置信息,可以轻松地实现诸如附近位置查询等功能。通过 GEOADD、GEOPOS、GEORADIUS 等命令操作。
  • 流(Streams)
    • Redis Streams 是 Redis 5.0 引入的一种新的数据类型,用于消息队列。它支持多播消息、消费者组、消息持久化等特性。通过 XADD、XREAD、XGROUP 等命令操作。

内存管理策略 回收策略 淘汰策略

设置有效期,到期不是立马回收,仍占据着内存。
expire key ttl:将 key 值的过期时间设置为 ttl 秒 。
ttl key 返回 key 剩余过期秒数。

如何回收?过期策略?

  • 定时删除 :为每个key设置一个定时器,一旦到期就删除。对CPU不友好,每个定时器都占用CPU资源。
  • 惰性删除:不管是否过期都不主动删除,每次查询时如果过期才删除。对内存不友好,浪费内存
  • 定期扫描:每隔一定的时间,会扫描一定数量的数据库的expires字典中一定数量的key(是随机的),并清除其中已过期的key。该策略是定时过期和惰性过期的折中方案。通过调整定时扫描的时间间隔和每次扫描的限定耗时,可以在不同情况下使得CPU和内存资源达到最优的平衡效果。
    看源码得知:
    在 Redis 当中,其选择的是策略 2 和策略 3 的综合使用不过 Redis的定期扫描只会扫描设置了过期时间的键,因为设置了过期时间的键Redis会单独存储,所以不会出现扫描所有键的情况。
    分桶策略定期过期的优化,将过期时间点相近的key放在一起,按时间扫描分桶。

淘汰策略 8种

  • volatile-lru 根据 LRU 算法删除设置了过期时间的键,直到腾出可用空间。如果没有可删除的键对象,且内存还是不够用时,则报错
  • allkeys-lru 根据 LRU 算法删除所有的键,直到腾出可用空间。如果没有可删除的键对象,且内存还是不够用时,则报错
  • volatile-lfu 根据 LFU 算法删除设置了过期时间的键,直到腾出可用空间。如果没有可删除的键对象,且内存还是不够用时,则报错
  • allkeys-lfu 根据 LFU 算法删除所有的键,直到腾出可用空间。如果没有可删除的键对象,且内存还是不够用时,则报错
  • volatile-random 随机删除设置了过期时间的键,直到腾出可用空间。如果没有可删除的键对象,且内存还是不够用时,则报错
  • allkeys-random 随机删除所有键,直到腾出可用空间。如果没有可删除的键对象,且内存还是不够用时,则报错
  • volatile-ttl 根据键值对象的 ttl 属性, 删除最近将要过期数据。如果没有,则直接报错
  • noeviction 默认策略,不作任何处理,直接报错

具体算法,主要的两种思路,LRU和LFU
TTL 根据过期时间
LRU 最少最近使用 提高缓存的命中率 主要针对的是时间
LFU 最近最少频率使用 针对的是使用频率。

不回收 满了以后只能读,不能写

推荐 :LRU,从精确度和性能考虑。使用采样的方式来筛选

淘汰策略也可以直接使用命令 config set maxmemory-policy <策略>来进行动态配置。

Redis中的LRU和LFU算法都是用于缓存淘汰的,但是它们适用的场景略有不同。
LRU算法适用于缓存访问模式比较集中的场景,即缓存中的某些数据被频繁访问,而其他数据很少被访问。在这种情况下,LRU算法可以很好地保留经常访问的数据,而淘汰不常用的数据,从而提高缓存的命中率。

LFU算法适用于缓存访问模式比较平均的场景,即缓存中的数据被访问的频率比较均匀。在这种情况下,LFU算法可以很好地保留访问频率高的数据,而淘汰访问频率低的数据,从而提高缓存的命中率。

因此,如果你的应用程序中存在一些热点数据,可以使用LRU算法
如果你的应用程序中的数据访问比较平均,可以使用LFU算法。当然,也可以根据实际情况结合使用这两种算法,以达到更好的缓存效果。

LRU算法适合:较大的文件 比如游戏客户端(最近加载的地图文件);
LFU算法适合:较小的文件和零碎的文件 比如系统文件、应用程序文件 ;
LRU消耗CPU资源较少,LFU消耗CPU资源较多。

RedisCluster的理解
RedisCluster3.0之后提供的特征
特定:

  1. 没有中间层,客户端直接跟RedisCluster的节点进行连接
  2. 每个节点都支持读写功能,分担了写的压力,后续增加新的主机,做hash迁移,新主机就可以分担压力
  3. 因为每个节点负责的区域不同,所以往里面存数据的时候,需要根据key做crc16算法,从而得到一个数值,数值%16384 =(0-18383),从而确认存储到哪个节点
  4. 为了保证每个节点的高可用,每个节点都是主从节点
  5. 还支持后续增加主节点或从节点,需要做数据迁移时,会从之前的主节点移动部分数据到新的主节点。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值