「这是我参与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、提升系统可用性,完善监控和报警