redis 常见问题分析

redis 使用分析

redis 使用场景:

1、配置文件,数据文件加载

2、web场景中的web页面缓存

3、业务场景中例如短信验证码等

4、可以做消息队列服务器使用,redis 5.0支持

一、redis 双写一致性分析

在数据做出修改时,应当先修改redis数据,还是先修改mysql数据?

在原有集合数据进行增减操作时,无操作顺序要求,redis和mysql的数据是一致的,在数据覆盖时,如果选择了错误的修改顺序,那么,redis和数据库mysql数据结果不一致

常见方式

1、先写数据库,后写缓存

并发,多线程下,可能存在一下问题:

1、数据覆盖操作,如果不按照顺序执行,数据结果不一致

2、数据库更新成功,缓存更新失败,数据结果不一致

可以在此键加上缓存时间,但是缓存生效期间,数据不一致

2、先写数据库,后删缓存

删除数据的原因很简单,VO|BO数据,是来自多表计算得出,属于聚合数据,无法直接更新缓存,只能删除缓存后,得到最新数据。

PO 数据库行级数据,可以直接写入redis

VO 视图对象
BO 业务对象

并发,多线程下,可能存在一下问题:

1、数据库更新成功,缓存删除失败,数据结果不一致

3、先删缓存,再写数据库

LRU(The Least Recently Used,最近最久未使用算法):如果一个数据在最近一段时间没有被访问到,那么可以认为在将来它被访问的可能性也很小。因此,当空间满时,最久没有访问的数据最先被置换(淘汰)。

LFU(Least Frequently Used ,最近最少使用算法):如果一个数据在最近一段时间很少被访问到,那么可以认为在将来它被访问的可能性也很小。因此,当空间满时,最小频率访问的数据最先被淘汰。

并发,多线程下,可能存在一下问题:

1、准备更新数据库时,缓存中的key不存在或已经被LRU和LFU淘汰,已经从旧数据中重新读取,数据结果不一致

4、延迟双删

在修改数据库数据前,需要先删除一次redis:此时是为了保证在数据库数据修改和redis数据被删除的间隔时间内,如有命中,保证此数据也不存在redis中。如果没有这一次删除,当数据库数据已经被修改了,但是还是可以从redis中读出旧数据,导致数据不一致。


第二次删除则是在修改数据库数据后,此时需要再次删除redis中对应数据一次,这一次是为了删除 第一次redis删除和数据库数据修改之间,如果有请求,那么旧数据又会重新缓存到redis中,然而数据在数据库中在接下来就会被修改,如果没有这一次删除,redis中则会存在数据库中旧的数据。


那么第二次为什么需要在数据库修改后延迟一定时间再删除redis呢?


为了等待之前的一次读取数据库,并等待其数据写入到缓存,最后删除这次脏数据,所以是一次数据从数据库中发到服务器+缓存写入的时间

二、redis 常见异常分析

一、缓存穿透

1、概念

缓存穿透的概念很简单,用户想要查询一个数据,发现redis内存数据库没有,也就是缓存没有命中,于是向持久层数据库查询。发现也没有,于是本次查询失败。当用户很多的时候,缓存都没有命中,于是都去请求了持久层数据库。这会给持久层数据库造成很大的压力,这时候就相当于出现了缓存穿透。

这里需要注意和缓存击穿的区别,缓存击穿,是指一个key非常热点,在不停的扛着大并发,大并发集中对这一个点进行访问,当这个key在失效的瞬间,持续的大并发就穿破缓存,直接请求数据库,就像在一个屏障上凿开了一个洞。

为了避免缓存穿透其实有很多种解决方案。下面介绍几种。

2、解决方案  
(1)布隆过滤器

布隆过滤器是一种数据结构,垃圾网站和正常网站加起来全世界至少也有几十亿个。网警要过滤这些垃圾网站,总不能到数据库里面一个一个去比较吧,这就可以使用布隆过滤器。假设我们存储一亿个垃圾网站地址。

可以先有一亿个二进制比特,然后网警用八个不同的随机数产生器(F1,F2, …,F8) 产生八个信息指纹(f1, f2, …, f8)。接下来用一个随机数产生器把这八个信息指纹映射到 1 到1亿中的八个自然数 g1, g2, …,g8。最后把这八个位置的二进制全部设置为一。过程如下:

有一天网警查到了一个可疑的网站,想判断一下是否是XX网站,首先将可疑网站通过哈希映射到1亿个比特数组上的8个点。如果8个点的其中有一个点不为1,则可以判断该元素一定不存在集合中。

那这个布隆过滤器是如何解决redis中的缓存穿透呢?很简单首先也是对所有可能查询的参数以hash形式存储,当用户想要查询的时候,使用布隆过滤器发现不在集合中,就直接丢弃,不再对持久层查询。

这个形式很简单。

(2)缓存空对象

当存储层不命中后,即使返回的空对象也将其缓存起来,同时会设置一个过期时间,之后再访问这个数据将会从缓存中获取,保护了后端数据源;

但是这种方法会存在两个问题:

如果空值能够被缓存起来,这就意味着缓存需要更多的空间存储更多的键,因为这当中可能会有很多的空值的键;即使对空值设置了过期时间,还是会存在缓存层和存储层的数据会有一段时间窗口的不一致,这对于需要保持一致性的业务会有影响。

二、缓存雪崩

1、概念

缓存雪崩是指,缓存层出现了错误,不能正常工作了。于是所有的请求都会达到存储层,存储层的调用量会暴增,造成存储层也会挂掉的情况。

2、解决方案
(1)redis高可用

这个思想的含义是,既然redis有可能挂掉,那我多增设几台redis,这样一台挂掉之后其他的还可以继续工作,其实就是搭建的集群。

(2)限流降级

这个解决方案的思想是,在缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量。比如对某个key只允许一个线程查询数据和写缓存,其他线程等待。

(3)数据预热

数据加热的含义就是在正式部署之前,我先把可能的数据先预先访问一遍,这样部分可能大量访问的数据就会加载到缓存中。在即将发生大并发访问前手动触发加载缓存不同的key,设置不同的过期时间,让缓存失效的时间点尽量均匀。

  • 27
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. Redis是什么?它的用途是什么? Redis是一个开源的高性能、高可用性的键值存储系统,它可以用来存储各种类型的数据,包括字符串、哈希表、列表、集合和有序集合等。Redis通常用于缓存、消息队列、实时数据分析、高速交易和排行榜等应用场景。 2. Redis的优势是什么? Redis的优势主要包括: - 高性能:Redis通过将数据存储在内存中,可以快速读写数据,同时支持各种高级数据结构的操作; - 高可用性:Redis支持主从复制、哨兵和集群等多种高可用方案; - 简单易用:Redis提供了简单灵活的命令接口,易于开发人员使用; - 可扩展性:Redis支持分布式部署,可以通过添加节点来扩展系统的性能和容量。 3. Redis支持哪些数据类型? Redis支持五种主要的数据类型: - 字符串(string):存储一个字符串,可以是文本、二进制数据等; - 哈希表(hash):存储多个键值对,类似于Python中的字典; - 列表(list):存储有序的字符串列表,支持在头部和尾部插入和删除元素; - 集合(set):存储无序字符串集合,支持对多个集合进行交、并、差操作; - 有序集合(sorted set):存储有序的字符串集合,可以为每个元素关联一个分数,支持按照分数排序和范围查询。 4. Redis的持久化机制有哪些? Redis提供了两种持久化机制: - RDB(Redis DataBase):将Redis的数据按照指定的时间间隔或指定的数据变化情况周期性地保存到磁盘上一个文件中; - AOF(Append Only File):将Redis的每次操作记录下来,保存到一个只追加的日志文件中,以保证数据的实时持久化。 5. Redis缓存淘汰策略有哪些? Redis提供了五种缓存淘汰策略: - LRU(Least Recently Used):淘汰最少被访问过的数据; - LFU(Least Frequently Used):淘汰最不频繁被访问的数据; - TTL(Time To Live):淘汰已经过期的数据; - Random(随机算法):随机淘汰一些数据; - Noeviction(不淘汰):不淘汰数据,但是当内存不足时,新写入的数据会导致写操作失败。 6. Redis支持的主从复制有哪些优缺点? Redis支持的主从复制有以下优缺点: 优点: - 提高了Redis的整体读取性能,通过添加从节点分担主节点的读取压力; - 增强了Redis的高可用性,当主节点发生故障时,可以通过从节点自动晋升为主节点继续提供服务。 缺点: - 在主从复制的过程中,主节点的写入性能只受限于主节点自身的速度; - 从节点是异步复制,可能存在读旧数据的情况,造成数据不一致。 7. Redis的集群模式有哪些? Redis的集群模式主要有两种: - 软件(客户端)分片模式:客户端使用一致性哈希算法将数据分配到多个节点上; - 硬件(Redis)分片模式:使用Redis Cluster模块实现多个节点之间的数据分片和复制,并进行故障转移和自动重新平衡。 8. Redis的事务支持有哪些? Redis提供了事务支持,通过MULTI命令开启一个事务,之后可以依次执行多个命令,并通过EXEC命令提交这些命令。Redis还提供了以下三个命令: - WATCH:监控一个或多个键,如果这些键在执行事务期间被修改,则事务执行失败; - UNWATCH:取消对所有键的监控; - DISCARD:取消事务,撤销所有未提交的命令。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值