Redis杂谈

Redis持久化

redis持久化有两种,快照和日志,快照也就是RDB,原理是根据用户配置的信息fork一个子进程对内存数据写到rdb文件,
Linux的fork系统调用是读写分离的,具有时刻性,当fork系统调用的时候,内存就会形成一个快照,
后续父进程对内存进行修改操作会对相应内存复制一份出来单独进行修改,不会影响子进程,读操作的内存和子进程的相同,
快照RDB也可以通过save命令和bgsave命令来执行,bgsave是异步执行,不会阻塞客户端
日志AOF是redis每操作一条写的命令就把这条命令写到aof文件里面去,默认是不开启的,需要配置appendonly参数为yes才能开启,
写日志是先写到文件缓冲区,文件缓冲区在操作系统内核,是否刷盘是通过配置appendfsync参数,有三种:
always代表每写一条日志就刷盘,这样容易造成客户端响应时间变长,everysec代表每秒刷盘一次,发生突发情况时,最多会损失这一秒内的数据,
no代表让操作系统自己决定如何刷盘
RDB和AOF可以同时开启,redis进程启动的时候会通过AOF来恢复数据,AOF文件有一个缺点,就是长时间写日志可能导致aof文件过大,这样恢复时间就会很长,所以
redis4.0以前可以通过配置aof相关参数当aof文件达到配置的大小时,自动重写aof文件,原理是开启一个子进程来扫描内存来生成新的aof日志文件,
再把这期间的日志增量追加到aof文件,实现重写。redis4.0以后对aof重写做了改进,同样是开启子进程,但是扫描内存生成是当前的内存快照,再加上期间的日志增量一起写到aof文件里面,
覆盖旧的aof文件

Redis高级应用

1、布隆过滤器
redis4.0之前基于位图实现、redis4.0的redislabs/rebloom
单机布隆过滤器 guava hutool
分布式布隆过滤器 redislabs/rebloom

2、限流
算法:固定窗口与滑动窗口算法、漏桶与令牌桶算法
滑动窗口算法实现:redis的zset(value与score)
单机限流:guava令牌桶
分布式限流 redis4.0的redis-cel模块(漏桶算法)

Redis主从复制的原理

redis2.8以前的复制通过sync命令实现,包括同步和命令传播两个步骤,
当从节点启动时,向主节点发送sync命令,表示需要同步数据,然后主节点通过bgsaveof生成RDB文件,并用一个缓冲区记录期间的所有写操作,
生成文件后通过网络传输把文件发送给从节点,从节点接收文件后载入到内存,最后将缓冲区的所有写命令发送给从节点,两者数据此时达到一致

sync
生成RDB,发送RDB
接收RDB,载入RDB,sync ok

redis2.8以后PSYNC代替SYNC,有完整重同步和部分重同步两个模式,使用复制偏移量、复制缓冲区、服务器运行id和心跳机制确报数据一致

sync指令是应用层协议

Redis缓存与数据库的一致性

缓存与数据库一致性方案中,最佳方案是采用先淘汰缓存后更新库表策略,
通过缓存过期机制、双删可以满足绝大部分场景需求,但在高并发、对于数据一致性时延要求较高的场景中,可采用分布式读写锁策略。

https://mp.weixin.qq.com/s?__biz=MjM5ODYxMDA5OQ==&mid=404087915&idx=1&sn=075664193f334874a3fc87fd4f712ebc&scene=21#wechat_redirect

https://blog.csdn.net/ljyhust/article/details/108649249

canal:
插入、删除、修改都直接操作数据库,不操作缓存,
有canal消费mysql的binlog,消费canal消息更新缓存,查询数据只操作缓存,不操作数据库

内存淘汰策略

内存满了会触发内存淘汰策略
1)针对过期key:删除过期时间最早的;随机删除过期key;LRU算法删除过期key;LFU算法删除过期key;
2)针对所有key:随机删除key;LRU算法删除key;LFU算法删除key;
3)不删除,拒绝客户端写命令;

LRU算法:最近最少使用,参考最近使用时间;
LFU算法:最不经常使用,参考次数;

默认是第3种内存淘汰策略
如果不设置最大内存,当内存满后数据会与磁盘交换,导致效率下降
redis从节点不会触发内存淘汰策略

Redis异步线程

被动删除key:
key过期
内存淘汰策略

主动删除key:
del命令 阻塞客户端
unlink命令 把key的引用去掉,交给后台线程慢慢销毁,不阻塞客户端

flushdb async
flushall async

AOF sync操作

你可能感兴趣的:(Redis,redis)