Redis 的缓存、缓存击穿与缓存雪崩

411 阅读3分钟

「这是我参与11月更文挑战的第 4 天,活动详情查看:2021最后一次更文挑战

什么是缓存?为啥使用缓存?

内存缓存常见的有 Redis 和 Memcached

1、使用缓存可以缓解关系数据库的并发访问的压力(热点数据)

2、减少响应时间:内存 IO 速度比磁盘要快

3、提升吞吐量,Redis 等内存数据库单机就可以支持很大的并发

Redis 常用的数据类型和使用场景

1、String - 用来实现简单的 KV 键值对存储,比如计数器

2、List - 实现双向链表,比如用户的关注,粉丝列表

3、Hash - 用来存储彼此相关信息的键值对

4、Set - 存储不重复的元素,比如用户的关注

5、Sorted Set - 实时信息排行榜

Redis 的内置实现方式

1、String 使用的是整数或者 sds

2、List 使用 ziplist 或者 double linked list

3、Hash 使用 ziplist 或者 hashtable

4、Set 使用 intset 或者 hashtable

5、SortedSet 使用 skiplist 跳跃表

参考 Redis 设计与实现

跳跃表是什么?

Redis 有哪些持久化的方式

1、RDB

把数据快照放在磁盘二进制文件中,dump.rdb

快照的实现方式是指定时间间隔把 Redis 的数据库状态保存到一个压缩的二进制文件中

优点就是可以一段时间就给数据库打一个快照记录某一个时间的状态

缺点就是如果在两个时间间隔中宕机会丢失这个时间间隔中的数据

2、AOF

append only file

每一个写命令都会追加到 appendonly.aof 中

优点是不会丢失数据

缺点是 aof 会比较大,恢复速度慢

通过修改配置

Redis 的事务

1、Redis 的事务将多个请求打包,一次性、按序执行多条命令

2、Redis 通过 MULTI、EXEC、WATCH 等命令执行事务

3、在 Python 中使用以下命令实现事务功能

python redis-py pipline = conn.pipline(transaction=True)

Redis 实现分布式锁

使用缓存的模式

缓存和数据库的数据一致性

缓存穿透

由于大量缓存查不到就去数据库取,数据库也没有要的数据,这个时候数据库压力就很大

很多无脑的爬虫,通过以自增的形式遍历文章 ID,这样就会导致被爬取的网站压力很大

这个时候网站方,可以对于没有查到返回为 None 数据也缓存

之后有相关的数据的时候就删除相应的缓存或者设置较短的超时时间

缓存击穿

缓存击穿是由于大量热点的 key 失效导致大量请求打到数据库导致的

解决方案:

分布式锁:获取锁的线程从数据库中拉数据更新缓存,其他线程等待缓存更新后从缓存中获取

异步后台更新:后台任务针对过期的 key 进行更新

雪崩问题

缓存不可用或者大量缓存 key 同时失效大量请求直接打到数据库

1、多级缓存:不同级别的 key 设置不同的超时时间

2、设置随机超时:key 的超时时间随机设置,不要全部设置的一样,导致一下全部失效

3、提升系统可用性,完善监控和报警

思考题