Redis知识整理
缓存:
1.缓存的过期策略:
a.内存淘汰策略,一致性差、无维护成本
b.超时剔除策略,一致性一般、维护成本低
c.主动更新策略,一致性高、维护成本高
2.内存淘汰策略:
volatile-lru: 从设置了过期时间的数据集中,移除最近最少使用的数据。
allkeys-lru: 从所有数据集中,移除最近最少使用的数据。
volatile-lfu: 从设置了过期时间的数据集中,移除最不常使用的数据。
allkeys-lfu: 从所有数据集中,移除最不常使用的数据。
volatile-random: 从设置了过期时间的数据集中,随机移除数据。
allkeys-random: 从所有数据集中,随机移除数据。
volatile-ttl: 从设置了过期时间的数据集中,移除即将过期的数据。
noeviction: 不移除任何数据,当内存满时,返回错误。该策略通常不建议使用,因为它可能导致无法写入新数据。
3.常用的缓存策略有以下五种:
Cache-Aside Pattern:旁路缓存模式
a.程序读取缓存信息,若缓存不存在,则去数据库读取缓存,读到数据后写入缓存,然后在返回;
b.程序修改数据,则先修改数据库,再删除缓存;
Read Through Cache Pattern:读穿透模式
a.程序直接从缓存系统中读取数据,不关心数据来源(是从缓存中还是数据库中来的数据),
若缓存系统中没有数据,则缓存系统负责去读取数据,然后写入缓存系统,进行返回;
Write Through Cache Pattern:写穿透模式
a.程序更新数据都是通过缓存系统,缓存系统需要维护两份数据,一份是缓存,一份是数据库,
缓存系统在一个事务里面保证缓存和数据库都写入成功,才算正真的成功。
b.写穿透模式通常伴随着读穿透模式
c.适用场景:需要频繁读取相同数据、不能忍受数据丢失(相对Write-Behind而言)和数据不一致
Write Behind Pattern:又叫Write Back,异步缓存写入模式
a.与写穿透模式很像,不同点在于写数据库是异步的,有可能是定时任务触发,也有可能是一个异步请求进行操作。
4.先更新数据,在删除缓存,避免数据不一致性问题;
5.缓存穿透:
a.往缓存中写入空值,并且设置过期时间,避免缓存穿透
b.布隆过滤器:
原理:通过三个hash函数对其进行计算,比如分别得到 2, 3, 7,增设置对应的下标为1,当查询时,先查询布隆过滤器,若不存在,
则数据库一定不存在,若存在,则数据库可能不存在
其他方案:
ID设置复杂点,避免被猜到ID
做好数据格式的校验,剔除非法数据
加强用户权限校验,根据用户权限,对用户进行合理限流
做好热点数据限流,对短期类发送大量请求的用户进行限流
6.缓存击穿:
互斥锁:
优点:没有额外的内存消耗、保证了一致性、实现简单
缺点:线程需要等待,性能受到了影响、可能导致死锁
逻辑过期:
优点:线程无需等待,性能较好
缺点:不保证一致性、有额外的内存消耗、实现复杂