Redis
缓存穿透
在进行查询的时候,查询一条不存在的数据,这种方式就叫做缓存穿透,也就是一直查id为-1的数据,一直访问进行恶意攻击,缓存利用不大,请求大规模的涌向数据库,容易导致数据库宕机崩溃。
缓存击穿
指的是某一个热点key突然失效,导致很多请求直接访问数据库,导致数据库压力大
缓存雪崩
缓存当中的大量失效,导致缓存雪崩,缓存雪崩时,大量请求都直接访问数据库,导致数据库压力大
AOF & RDB
- AOF
append only file
只追加日志文件,将所有的写入操作记入到日志文件当中,当服务突然宕机之后,重启时只需要在执行一遍日志文件,这样数据还是会持久化回来 - RDB
RedisDataBase
在指定的时间间隔内将内存中的数据集快照写入磁盘,实际操作过程是fork一个子进程,先将数据集写入临时文件,写入成功后,再替换之前的文件,用二进制压缩存储
Redis 过期key清除策略
- 惰性过期 访问key时,判断key是否过期,如果过期则清除,如果没过期,则不清除
- 定时过期 每隔一段时间,对所有设置了过期时间的(expires)key进行扫描,判断是否过期,如果过期则清除,如果没过期,则不清除
Redis 单线程快的原因
- 纯内存操作
- 基于非阻塞的IO多路复用模型
- 单线程反而避免了线程切换的开销
事务实现
- MULTI 命令 -> 事务开始 -> 在客户端通过
REDIS_MULTI
标记 - 开启事务后 -> 所有的命令都会加到事务队列当中
- 执行EXEC 命令 -> 执行事务队列中的所有命令
数据结构
- 字符串 String kv结构,可以用来存储用户信息
- 哈希表 Hash 存字典数据
- 列表 List 有序队列
- 集合 Set 业务场景需要唯一
- 有序集合 zSet scope分数(排行榜)
- 之前是压缩链表实现,高版本后转换成listPack
Redis & MySQL 一致性问题
- 先删除Redis缓存,再更新MySQL数据库,再在查询时,更新缓存到Redis
- 延时双删:先删除Redis缓存,再更新MySQL数据库,延时几百毫秒后再删除Redis, 这样就算其他线程读取了MysQL数据库,把旧数据更新到Redis缓存,也会被其他线程删除
分布式锁底层原理
- 利用
setnx
命令:如果key不存在才能获取到锁 - 利用lua脚本保证原子性
- 锁过期,通过定时任务监听是否需要续期
- redis节点挂掉 需要采用红锁同时向 n/2+1 个节点申请锁,都获取到锁,才认为获取成功
看门狗机制
看门狗机制是redission
提供的一种自动延期机制,这个机制使得redission
提供的分布式锁是可以自动续期的。