这是我参与「第五届青训营 」伴学笔记创作活动的第 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以读为主,
从机中不可以做写操作
搭建一主多从
-
创建/myredis文件
-
复制redis.conf配置文件到文件夹
cp redis.conf /myredis/redis.conf -
配置一主两从,创建三个配置 文件
redis6379.conf redis6380.conf redis6381.conf -
在三个配置文件写入内容
include /mybatis/redis.conf pidfile /var/run/redis_6379.pid port 6379 dbfilename dump6379.rdb -
启动三个redis服务
查看redis服务器状态 info replication -
配从不配主
主机IP地址和端口号 slaveof <ip> <port>
一主两仆
- 从服务区关机后重启,自动独立变为主服务器
- 主服务器关机后,从服务器不会改变,主服务器重启后还是从服务器的主服务器
问题
缓存穿透
解释
-
应用服务器压力变大,大量访问导致redis命中率降低,大量查询数据库
大量非正常的url访问
解决
- 对数据库返回的数据为空值做缓存
- 设置可以访问的名单,使用bitmaps类型定义一个可以访问的名单
- 布隆过滤器,底层是bitmaps
- 进行实时监控,设置黑名单
布隆过滤器(Bloom Filter)
-
用于检索一个元素是否在一个集合中,优点是空间效率和查询时间都比一般的算法要好的多,缺点是有一定的误识别率和删除困难
-
布隆过滤器实际上是一个 bit 向量或者说 bit 数组,使用多个不同的哈希函数生成多个哈希值,并对每个生成的哈希值对应的 bit 位置 1
-
核心思想
- 使用多个哈希函数,增大随机性,减少 hash 碰撞的概率
- 扩大数组范围,使 hash 值均匀分布,进一步减少 hash 碰撞的概率
缓存击穿
现象
数据库访问压力瞬间增大,redis里面没有出现大量的key过期,redis正常运行
解释
redist某个key过期了,大量访问使用这个key
解决
- 预先设置热门数据到key里,加大这些热门数据的时长
- 实时监控key的过期时间
- 使用锁,当查询为空时,让它之后再查询
缓存雪崩
现象
数据库压力变大,服务器崩溃
解释
极少的时间段里,查询大量的key集中过期情况
解决
- 构建多级缓存架构,nginx缓存+redis缓存+其他缓存(ehcahe等)
- 使用锁或队列(降低效率)
- 设置过期标志更新缓存,触发另外的线程后台去更新key的缓存
- 将缓存失效时间分散开