Redis学习二--常见问题及处理

基本概念

Redis基本概念数据结构

机制

持久化机制:

RDB(内存快照):某一时刻的内存快照以二进制的方式写入磁盘,可以手动触发和自动触发。

优点:生成文件小,恢复速度快,适用于灾难恢复。

缺点:redis发生意外停机时,服务器会丢失还未保存到快照中的数据。

RDB详解

AOF(增量日志):将redis执行的每一条命令追加到一个文件的末尾,redis重启时,会重新执行这些命令来恢复数据。

优点:不容易丢失数据,更为安全

缺点:文件体积大,恢复速度慢

混合持久化(RDB+AOF):redis会优先加载AOF文件恢复数据,因为AOF更为安全

内存淘汰策略

noeviction(不淘汰策略):当内存不足以容纳新写入数据时,Redis 将新写入的命令返回错误。这个策略确保数据的完整性,但会导致写入操作失败。
volatile-lru(最近最少使用):从设置了过期时间的键中选择最少使用的键进行删除。该策略优先删除最久未被访问的键,保留最常用的键。
volatile-ttl(根据过期时间优先):从设置了过期时间的键中选择剩余时间最短的键进行删除。该策略优先删除剩余时间较短的键,以尽量保留剩余时间更长的键。
volatile-random(随机删除):从设置了过期时间的键中随机选择一个键进行删除。
allkeys-lru(全局最近最少使用):从所有键中选择最少使用的键进行删除。无论键是否设置了过期时间,都将参与淘汰。
allkeys-random(全局随机删除):从所有键中随机选择一个键进行删除。

redis的哨兵机制

redis的哨兵,集群详解

应用

使用场景                

1.app首页流量高峰

2.不需要持久化存储的操作(验证码,点赞数)

3.分布式锁

4.分布式缓存

问题

如何解决Hash冲突

Hash冲突:用哈希表存储数据时,两个或多个不同的键被哈希函数映射到一个位置。

redis通过链式哈希解决冲突,也就是同一个桶里面的元素使用链表保存。

但是当链表过长就会导致查找性能变差可能。所以redis为了追求块,使用了两个全局哈希表。用于rehash操作,增加现有的哈希桶数量,减少哈希冲突。

如何处理过期的数据(过期策略)

惰性删除:客户端尝试访问某个键时,redis检查是否过期,如果过期就会删掉。

优点:节省CPU资源,只有访问时才会判断是否过期

缺点:key过期了却没有删掉,占用内存

定期删除:每隔一段时间就会通过循环遍历去随机抽查一部分设置过期时间的key,过期了就删掉。

优点:调整定时扫描的时间间隔和每次扫描的限定耗时,保证CPU和内存资源的利用最大化。

如何保证数据库和redis的一致性

双删策略:

  • 第一次删除:在更新数据库之前,先删除Redis缓存中的数据。这样,即使在更新数据库的过程中,如果有请求查询该数据,也会从数据库中读取最新数据,而不是从缓存中读取过期的旧数据。

  • 第二次删除:在更新数据库之后,再次删除Redis缓存中的数据。这样可以处理在第一次删除和更新数据库之间,有其他请求将旧数据重新写入缓存的情况。这次删除确保了即使这种情况发生,缓存中的数据也会被最新的数据库数据替换。

需要注意的是,双删策略可能会在某些情况下导致数据不一致的问题,比如在分布式系统中,如果第二次删除操作失败,可能会导致缓存中的数据和数据库中的数据不一致。因此,实际应用中可能需要结合其他一致性保证机制,如使用事务、延迟删除策略、订阅数据库变更事件等,来确保数据的一致性。

如何解决热key问题

热Key问题:某些特定的缓存key受到高频访问,导致对这些热门数据的读取/写入操作集中在少数几个缓存节点上,使得这些节点的负载过高,而其他节点负载较轻甚至空闲。这会造成系统性能不均衡,可能导致部分请求响应变慢或服务不可用。

解决:

1. 缓存预热:在系统启动或业务低峰期,通过批量加载或预先访问热门数据,将这些热门数据提前加载到缓存中。这样可以避免大量请求同时涌入导致的热点问题,提高系统的稳定性和性能。
2. 动态散列:将缓存节点组织成一个哈希环,根据缓存键的哈希值将数据分散存储在多个节点上。通过增加缓存节点的数量,让请求更均匀地分布在各个节点上,减轻热 Key 对单个节点的压力。当节点数量发生变化时,可以通过一致性哈希算法进行平滑迁移,避免数据大规模迁移带来的负载过高。
3. 数据分片:将数据按特定规则(如数据范围、业务维度等)分成多个片段,分别存储在不同的缓存节点上。这样可以使热 Key 所在的数据尽量均匀地分布在多个节点上,减轻单个节点的压力。

缓存击穿

指当一个缓存键(key)对应的数据在缓存中不存在,同时又有大量并发请求访问该缓存键时,这些请求会直接绕过缓存,查询数据库或其他存储系统,导致数据库压力增大。缓存击穿通常在缓存过期后发生。

缓存穿透

指当一个查询请求访问一个不存在于缓存中且也不存在于数据库中的数据时,这个请求会无效地继续访问数据库,而不会被缓存。如果黑客故意发送大量非法请求,则缓存层无法起到过滤作用,可能导致数据库负载过大。

缓存雪崩

指当缓存集中在某个时间点失效或由于某个原因发生故障,导致大量的请求直接打到后端数据库,造成数据库瞬时压力过大,甚至引起数据库崩溃。在缓存雪崩期间,系统性能急剧下降,无法正常提供服务。

解决

1. 对热点数据采用永不过期策略,避免缓存击穿。
2. 在缓存层进行空值缓存,即将查询结果为空的数据也缓存一段时间,避免缓存穿透。
3. 设置合理的缓存过期时间,并使用分布式缓存的多节点部署,避免缓存雪崩。
4. 引入限流、熔断等机制,控制并发访问量,保护后端系统。
5. 对重要数据做冷备份,确保即使缓存失效或故障,仍能从其他系统中恢复数据。

  • 15
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值