Redis进阶
# Redis缓存过期处理以及内存淘汰机制
相信大家对照着之前Redis的操作集合进行了相关的练习。大家在之前的操作集合中应该注意到了这个操作指令(expire key time:给某个key值设置过期时间)大家都知道用完这个指令之后,当前的那个key值会在规定的时间内失效。然而当其真正失效之后,这个值真的会立刻在内存中消失么?答案是否定的。
# 内存过期处理:
针对上述设置完过期命令的key值,其实在redis本身内部处理的时候会有两套机制:
(主动)定期删除:
定期删除主要说的是redis本身具有检测机制,在配置文件中默认为十秒进行一次扫描,如果发现相关的Key已经过期,那么程序会自动删除相关的key值已经value的信息。
具体的配置信息我们也可以看一下,具体如下:
这个配置表示一秒钟之内会检测10次(默认区间是1-500次),检测到之后就会被删除,当然我们也可以将相关的配置调大,但是这样的话虽然加快了删除内存值,但是同时也会比较多的占用cpu,内存释放较快。
(被动)惰性删除:
当被访问的时候如果发现相关的key已经过期,那么才会进行删除操作,优点就是可以降低cpu的损耗,但是相关的内存会随着时间而增加。
# 内存淘汰机制:
内存淘汰机制主要指的是linux服务器可以针对不同的应用进行相对应的内存上的管理。例如,检测到某个应用占用内存比较大的时候可以做到自动释放内存。因此redis就有一套专门配合内存淘汰机制的配置:MEMERY MANAGEMENT
当我们去配置文件进行搜索的时候,会发现这个配置存在以下几种内存淘汰机制的算法,具体如下:
- noeviction:旧缓存永不过期,新缓存设置不了,返回错误
- allkeys-lru:清除最少用的旧缓存,然后保存新的缓存(推荐使用)
- allkeys-random:在所有的缓存中随机删除(不推荐)
- volatile-lru:在那些设置了expire过期时间的缓存中,清除最少用的旧缓存,然后保存新的缓存
- volatile-random:在那些设置了expire过期时间的缓存中,随机删除缓存
- volatile-ttl:在那些设置了expire过期时间的缓存中,删除即将过期的
# Redis 的哨兵模式
Redis是存在主从同步的特性的,具体主从同步的方式也有两种,一种是基于磁盘的主从同步,主要是通过RDB的形式进行文件传输然后实现同步,还有一种是无磁盘化的同步模式,无磁盘化的同步模式主要通过网络。
这里面问题来了,当我们的redis的Master节点发生故障的时候,我们如何来保证其高可用?
# 什么是哨兵模式?
Sentinel(哨兵)是用于监控Redis集群中Master状态的工具,是Redis的高可用解决方案,哨兵可以监视一个或者多个master服务以及这些master服务的所有从服务,当某个master服务宕机之后,会把这个master的某个服务升级为master来替代已经宕机的master继续工作。
# 配置哨兵监控master
创建并且配置sentinel.conf
普通配置
port 26379 pidfile "/usr/local/redis/sentinel/redis-sentinel.pid" dir "/usr/local/redis/sentinel" daemonize yes protected-mode no logfile "/usr/local/redis/sentinel/redis-sentinel.log"
1
2
3
4
5
6核心配置
# 配置哨兵 sentinel monitor mymaster 127.0.0.1 6379 2 # 密码 sentinel auth-pass <master-name> <password> # master被sentinel认定为失效的间隔时间 sentinel down-after-milliseconds mymaster 30000 # 剩余的slaves重新和新的master做同步的并行个数 sentinel parallel-syncs mymaster 1 # 主备切换的超时时间,哨兵要去做故障转移,这个时候哨兵也是一个进程,如果他没有去执行,超过这个时间后,会由其他的哨兵来处理 sentinel failover-timeout mymaster 180000
1
2
3
4
5
6
7
8
9
10启动
redis-sentinel sentinel.conf
1测试方法:当master挂了,观察slave是否成为master,当master重新恢复之后,slave的状态。