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之后提供的特征
特定:
- 没有中间层,客户端直接跟RedisCluster的节点进行连接
- 每个节点都支持读写功能,分担了写的压力,后续增加新的主机,做hash迁移,新主机就可以分担压力
- 因为每个节点负责的区域不同,所以往里面存数据的时候,需要根据key做crc16算法,从而得到一个数值,数值%16384 =(0-18383),从而确认存储到哪个节点
- 为了保证每个节点的高可用,每个节点都是主从节点
- 还支持后续增加主节点或从节点,需要做数据迁移时,会从之前的主节点移动部分数据到新的主节点。