这是我参与「第五届青训营 」伴学笔记创作活动的第16天。
缓存问题
缓存雪崩:当缓存服务器重启或者大量缓存集中在某一个时间段失效,这样在失效的时候,也会给后端系统(比如DB)带来很大压力。
解决方法:在设置过期时间时采用随机数,可以防止大量数据在同一时间过期。
缓存穿透:key对应的数据在数据源并不存在,每次针对此key的请求从缓存获取不到,请求都会到数据源,从而可能压垮数据源。比如用一个不存在的用户id获取用户信息,不论缓存还是数据库都没有,若黑客利用此漏洞进行攻击可能压垮数据库。
解决方法:采用布隆过滤,将所有可能的key值的hash存入到一个bitmap中,在请求到来时判断key是否存在于bitmap中,如果不存在就拒绝掉;采用空值返回,并且将空值储存在缓存中,可以防止查找数据库,空值的过期时间不宜过长,否则会占用内存。
缓存击穿:key对应的数据存在,但在redis中过期,此时若有大量并发请求过来,这些请求发现缓存过期一般都会从后端DB加载数据并回设到缓存,这个时候大并发的请求可能会瞬间把后端DB压垮。
解决方法:使用互斥锁,保证只有一个线程去数据库中查询,该线程查询完后将结果保存至缓存中,其他线程重试或者降级。
RDB
RDB(Redis Database) :RDB,简而言之,就是在不同的时间点,将redis存储的数据生成快照并存储到磁盘等介质上。(默认使用rdb)
可以设置数据压缩,但是会占用CPU时间,不使用的话会导致rdb文件过大。
1、RDB方式,是将redis某一时刻的数据持久化到磁盘中,是一种快照式的持久化方法。
2、redis在进行数据持久化的过程中,会先将数据写入到一个临时文件中,待持久化过程都结束了,才会用这个临时文件替换上次持久化好的文件。正是这种特性,让我们可以随时来进行备份,因为快照文件总是完整可用的。
3、对于RDB方式,redis会单独创建(fork)一个子进程来进行持久化,而主进程是不会进行任何IO操作的,这样就确保了redis极高的性能。
4、如果需要进行大规模数据的恢复,且对于数据恢复的完整性不是非常敏感,那RDB方式要比AOF方式更加的高效。
5、虽然RDB有不少优点,但它的缺点也是不容忽视的。如果你对数据的完整性非常敏感,那么RDB方式就不太适合你,因为即使你每5分钟都持久化一次,当redis故障时,仍然会有近5分钟的数据丢失。
AOF(Append Only File) :以独立日志的方式记录仪每次写命令,重启时再重新执行AOF文件中的命令达到回复数据的目的。与RDB相比可以简单描述为改记录数据为记录数据产生的过程。AOF的主要作用是解决了数据持久化的实时性,目前已经是Redis持久化的主流方式。