基本

redis 就是一个用c语言实现的键值对形式的数据库,只不过特殊的地方是数据存储在内存上。

redis作用:整体上来说有很多,比如分布式锁,缓存,计数限流等,主要我用过的redis在视频项目中是缓存的作用,在面试项目中是做一个简易的消息队列的作用。

redis的数据类型:String,Hash,Zset,Stream 详细见概括内容。

redis的读写方式有三种,这个比较核心。
第一种:旁路缓存,这个的读写的核心都在于DB,缓存就跟计算机组成的缓存一样作为辅助。

  • 读:先从缓存中读,有的话就直接返回,没有就从DB中返回然后放回DB中
  • 写:先更新DB,然后删除缓存。
    第二种:读写穿透,这个读写的核心在于缓存本身,整体的体系是都跟缓存接触,不和DB直接接触。
  • 读:先从缓存中读,有的话直接返回,没有的话先从缓存组件从DB中加载到缓存中然后再返回
  • 写:

!!!怎么保证一致性

模拟情况:两个线程一个读一个写

先删除缓存再更新数据库

在删除缓存和更新数据库之间,读的线程来了,看到了旧数据,然后更新数据到缓存中,这样缓存一直都是旧数据,数据库一直是新数据。

解决方法:延迟双删,写线程删除缓存然后更新数据库再删除缓存,就可以了,第二次删除得选在读线程操作完之后删除。

先更新数据库再删除缓存

读的线程查询数据,但是缓存中的数据过期了,然后就得去数据库查,查完数据库和写回缓存之间,写线程干完了更新数据库然后删除缓存的步骤,这样导致了缓存一直是旧数据,数据库一直是新数据。

这种相较于上一种的发生概率很低,因为:更新数据库的操作耗时是这里面最长的,很小概率是在这个间隙就做完了。

解决方法:也是延迟双删

持久化机制

AOF机制

AOF就是记录写操作的一个日志。是先进行写操作,然后进行日志记录。
有两个风险一个就是因为写操作和写日志是两个操作并不是原子性的,所以可能宕机然后就导致丢失数据。
第二个就是阻塞,因为是都在主线程上进行的,流量高的时候就容易阻塞

重写的话是写完新的然后覆盖,是重复写不是全量写。

RDB机制

RDB就是创建一个某一个时间副本上的快照,存储的内存的数据。
只有一个问题就是因为是全量写,所以如果时间设定的太频繁了容易卡顿,所以一般是分钟级设置。