淘汰策略
Redis的内存淘汰策略的大流程如下:
Redis的淘汰策略有六种
名称 | 描述 |
---|---|
noeviction | 内存满了会返回错误,不淘汰 |
allkeys-lru | 所有键中,选最近最少使用的数据删除 (时间上来说) |
volatile-lru | 在设置过期的键中,选最近最少使用的数据删除 |
allkeys-random | 所有键中,随机抛弃 |
volatile-random | 在设计过期的所有键中,随即抛弃 |
volatile-ttl | 在设置过期的键中,抛弃存活时间最短的数据 |
allkeys-lfu (redis4.0) | 所有键中,最不常被访问的数据删除 (频率上来说) |
volatile-lfu (redis4.0) | 在设置过期的键中,最不常被访问的数据删除 |
持久化
RDB:快照形式是直接把内存中的数据保存到一个 dump 的文件中,定时保存,保存策略。
AOF:把所有的对 Redis 的服务器进行修改的命令都存到一个文件里,命令的集合。
Redis 默认是快照 RDB 的持久化方式。
RDB: 比较适合灾难恢复,定期以快照的形式保存数据,利于拷贝,但是不利于数据丢失的恢复。
AOF: 记录每一条命令,以秒计,所以基本保存所有操作,但是文件较大。
Redis支持同时开启RDB和AOF。
主从机制
基本流程如下:
① 从节点执行 slaveof masterIP masterPort,保存主节点信息
② 主从建立socket连接
③ 从节点发送ping,主节点回应pong
④ 权限认证通过后,主节点将所有数据发送到从节点,进行数据同步
⑤ 主节点持续的将写指令发送到从节点,保证主从数据一致
在一定程度上,减少了主节点读的压力,但是没有减少写的压力。
此外,redis2.8 之后,在断线重连后,主数据库只需要将断线期间执行的命令传送给从数据库。
哨兵机制
哨兵的主要作用是:监视redis各节点的运行情况
哨兵会监控所有的主从节点,以及另外的哨兵节点,哨兵的工作流程如下:
① 每隔10s,向所有节点发送info(确保明白各位的变化情况)
② 每隔2s,向所有哨兵发送hello(让各位哨兵明白我还活着,或者我有啥变化没)
③ 每隔1s,向所有节点和哨兵发送ping(看看你们还活着吗)
那如果哨兵监视的主节点挂了,该如何处理呢?
是一个从主观下线到客观下线的流程
主观下线:超过时间了,这个哨兵会认为节点主观下线,哨兵会询问别的哨兵,是不是它真的挂了,需不需要恢复。如果别的哨兵也认为该节点主观下线,那么一定数量后,就会执行客观下线的主从切换
客观下线的流程:
① 选出领头哨兵
② 领头哨兵从在线的从数据库中,选择优先级最高的从数据库。优先级可以通过slave-priority选项设置。
③ 如果优先级相同,则从复制的命令偏移量越大(即同步数据越多,数据越新),越优先。
如果以上条件都一样,则选择run ID较小的从数据库。
Raft算法
通过Raft算法,进行领头人的选取
① 发送主数据库客观下线的哨兵向每个哨兵命令,要求对方选择自己为领头。
如果没有选择过其他哨兵,则会同意请求
如果发现有超过半数,且超过quorum的哨兵同意自己的请求,则自己就是哨兵领头。
可能会失败(1、选民不占大多数;2、多个同时当选):失败后是没有heart-beat的,所以会重新开选。
其余琐碎知识
1、哈希槽:每个 key 通过 CRC16 校验后对 16384 取模来决定放置哪个槽,集群的每个节点负责一部分 hash 槽。
2、Redis事务:单独的隔离操作,其中的所有命令都会被序列化,同时执行过程中无法被打断是一个原子操作
3、Redis一致性:读的时候,先读缓存,缓存没有的话,那么就读数据库,然后取出数据后放入缓存,同时返回响应;更新的时候,先删除缓存,然后再更新数据库
4、ACID:
原子性:事务要么全部完成,要么全部不完成
一致性:事务开始前后,数据库完整性不变
隔离性:允许多个并发事务同时对其数据进行读写和修改的能力
持久性:事务提交之后,对数据库的修改就是永久的
5、Redis 与 memcached 相比有哪些优势?
memcached 所有的值均是简单的字符串,redis 作为其替代者,支持更为丰富的数据类型
redis 的速度比 memcached 快很多 redis 的速度比 memcached 快很多
redis 可以持久化其数据 redis 可以持久化其数据
参考:
1、https://my.oschina.net/u/3906190/blog/3024790
2、面了BAT,我总结了他们会问的Redis基础知识