Skip to content

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提供的分布式锁是可以自动续期的。

By Modify.