Redis|青训营笔记

45 阅读4分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 17 天

持久化

RDB(Redis DataBase)

在指定的时间间隔内将内存中的数据集快照写入磁盘,也就是行话讲的Snapshot快照,它恢复时是将快文件直接卖到内存里

如何进行(底层执行)

Reds会单独创建(fork)一个子进程来进行持久化,会先将数据写入到一个临时文件中,待持久化过程都结束了,再用这个临时文件替换上次持久化好的文件。整个过程中,主进程是不进行任何I0操角的,这就确保了极高的性能如果需要进行大规模数据的恢复,且对于数据恢复的完整性不是非常敏感,那RDB方式要比AOF方式更加的高效。RDB的缺点是最后一次持久化后的数据可能丢失。

Fork
  • Fork的作用是复制一个与当前进程一样的进程。新进程的所有数据(变量、环境变量、程序计数器等)数值都和原进程一致,但是是一个全新的进程,并作为原进程的子进程
  • 在Liux程序中,fork会产生一个和父程完全相同的子进程,但子进程在此后多会exec系统调用,出于效率考虑,Linx中引入了“写时复制技术
  • 一般情况父进程和子进程会共用同一段物理内存,只有进程空间的各段的内容要发生变化时,才会将父进程的内容复制一份给子进程。
RDB持久化流程
dump.rdb文件

redis.conf

主从复制

主机数据更新后根据配置和策略,自动同步到备机的master/slaver机制,Master以写为主,Slaver以读为主,

从机中不可以做写操作

搭建一主多从

  1. 创建/myredis文件

  2. 复制redis.conf配置文件到文件夹

    cp redis.conf /myredis/redis.conf
    
  3. 配置一主两从,创建三个配置 文件

    redis6379.conf
    redis6380.conf
    redis6381.conf
    
  4. 在三个配置文件写入内容

    include /mybatis/redis.conf
    pidfile /var/run/redis_6379.pid
    port 6379
    dbfilename dump6379.rdb
    
  5. 启动三个redis服务

    查看redis服务器状态
    info replication
    
  6. 配从不配主

    主机IP地址和端口号
    slaveof <ip> <port>
    

一主两仆

  1. 从服务区关机后重启,自动独立变为主服务器
  2. 主服务器关机后,从服务器不会改变,主服务器重启后还是从服务器的主服务器

问题

缓存穿透

解释

  1. 应用服务器压力变大,大量访问导致redis命中率降低,大量查询数据库

    大量非正常的url访问

解决

  1. 对数据库返回的数据为空值做缓存
  2. 设置可以访问的名单,使用bitmaps类型定义一个可以访问的名单
  3. 布隆过滤器,底层是bitmaps
  4. 进行实时监控,设置黑名单
布隆过滤器(Bloom Filter)
  • 用于检索一个元素是否在一个集合中,优点是空间效率和查询时间都比一般的算法要好的多,缺点是有一定的误识别率和删除困难

  • 布隆过滤器实际上是一个 bit 向量或者说 bit 数组,使用多个不同的哈希函数生成多个哈希值,并对每个生成的哈希值对应的 bit 位置 1

  • 核心思想

    • 使用多个哈希函数,增大随机性,减少 hash 碰撞的概率
    • 扩大数组范围,使 hash 值均匀分布,进一步减少 hash 碰撞的概率

缓存击穿

现象

数据库访问压力瞬间增大,redis里面没有出现大量的key过期,redis正常运行

解释

redist某个key过期了,大量访问使用这个key

解决

  1. 预先设置热门数据到key里,加大这些热门数据的时长
  2. 实时监控key的过期时间
  3. 使用锁,当查询为空时,让它之后再查询

缓存雪崩

现象

数据库压力变大,服务器崩溃

解释

极少的时间段里,查询大量的key集中过期情况

解决

  1. 构建多级缓存架构,nginx缓存+redis缓存+其他缓存(ehcahe等)
  2. 使用锁或队列(降低效率)
  3. 设置过期标志更新缓存,触发另外的线程后台去更新key的缓存
  4. 将缓存失效时间分散开