redis相关知识
程序员文章站
2022-06-24 22:45:57
redis的主从复制主要分为三个阶段和Mysql主从复制的原因一样,Redis虽然读取写入的速度都特别快,但是也会产生读压力特别大的情况。为了分担读压力,Redis支持主从复制,Redis的主从结构可以采用一主多从或者级联结构,Redis主从复制可以根据是否是全量分为全量同步和增量同步。下图为级联结构。主从复制主要分为三个阶段连接阶段(slave与master建立连接)同步阶段(全量同步,增量同步)命令阶段(slave向master发送同步完成命令)这里主要介绍同步阶段全量同步Red...
redis如何进行主从复制
和Mysql主从复制的原因一样,Redis虽然读取写入的速度都特别快,但是也会产生读压力特别大的情况。为了分担读压力,Redis支持主从复制,Redis的主从结构可以采用一主多从或者级联结构,Redis主从复制可以根据是否是全量分为全量同步和增量同步。下图为级联结构。
主从复制主要分为三个阶段
- 连接阶段(slave与master建立连接)
- 同步阶段(全量同步,增量同步)
- 命令阶段(slave向master发送同步完成命令)
这里主要介绍同步阶段
- 全量同步
Redis全量复制一般发生在Slave初始化阶段,这时Slave需要将Master上的所有数据都复制一份。具体步骤如下:
1 从服务器连接主服务器,发送SYNC命令;
2 主服务器接收到SYNC命名后,开始执行bgsave命令生成RDB文件并使用缓冲区记录此后执行的所有写命令;
3 主服务器bgsave执行完后,向所有从服务器发送快照文件,并在发送期间继续记录被执行的写命令;
4 从服务器收到快照文件后丢弃所有旧数据,载入收到的快照;
5 主服务器快照发送完毕后开始向从服务器发送缓冲区中的写命令;
6 从服务器完成对快照的载入,开始接收命令请求,并执行来自主服务器缓冲区的写命令;
完成上面几个步骤后就完成了从服务器数据初始化的所有操作,从服务器此时可以接收来自用户的读请求。 - 增量同步
Redis增量复制是指Slave初始化后开始正常工作时主服务器发生的写操作同步到从服务器的过程。
增量复制的过程主要是主服务器每执行一个写命令就会向从服务器发送相同的写命令,从服务器接收并执行收到的写命令,进行一个数据的同步
Redis主从同步策略
主从刚刚连接的时候,进行全量同步;全同步结束后,进行增量同步。当然,如果有需要,slave 在任何时候都可以发起全量同步。redis 策略是,无论如何,首先会尝试进行增量同步,如不成功,要求从机进行全量同步。
注意点
如果多个Slave断线了,需要重启的时候,因为只要Slave启动,就会发送sync请求和主机全量同步,当多个同时出现的时候,可能会导致Master IO剧增宕机。
redis的过期策略有哪几种? - 定时删除
当我们给一个key设置key时,这个key过期了也就自动删除了 - 惰性删除
当redis中的key过期了,这个key不会立马被删除,等到下次有人获取这个key的时候,redis首先会判断这个key是否过期,如果没有过期直接返回,如果过期redis就会把这个key删掉 - 定期删除
定期删除是指当key到期了redis不会立马进行删除,而是每隔100ms去随机抽取一些设置了过期时间的key,检查是否过期,如果过期了就删除
而redis中采取的是定期删除+惰性删除的策略。但是这样也是存在问题的,如果有key没有被定期删除所扫描到并且也没有别惰性删除,那么redis中会堆积许多过期的key没有被删除,这会加快redis的内存耗尽,那么redis将会走内存淘汰机制
- 内存淘汰机制
1 noeviction: 当内存不足以容纳新写入数据时,新写入操作会报错,这个一般没人用吧,实在是太恶心了。
2 当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的 key(这个是最常用的)
3 当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,随机移除某个 key。
4 当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,有更早过期时间的 key 优先移除。
reids哨兵
- 哨兵模式概述:
1 哨兵模式是一种特殊的模式,首先Redis提供了哨兵的命令,哨兵是一个独立的进程,作为进程,它会独立运行。其原理是哨兵通过发送命令,等待Redis服务器响应,从而监控运行的多个Redis实例。
- 哨兵的作用
1 监控:不断的监控master和slave是否正常运行
2 通知:当被监控的服务出现问题向其他的哨兵,客服端发送通知
3 自动故障转移:断开master与slave的连接,并选举新的slave作为master,并让其他的salve连上新的master,并告知客服端新的服务地址
- 注意:
1 哨兵也是一台redis服务器,只不过不提供数据服务功能
2 哨兵一般配置为单数(配出双数可能会出现master在选举的过程中打平的情况)
缓存穿透、缓存击穿、缓存雪崩区别和解决方案
- 缓存穿透
缓存穿透是指缓存和数据库中都没有的数据,而用户不断发起请求,如发起为id为“-1”的数据或id为特别大不存在的数据。这时的用户很可能是攻击者,攻击会导致数据库压力过大。
解决方案:
1 接口层增加校验,如用户鉴权校验,id做基础校验,id<=0的直接拦截;
2 从缓存取不到的数据,在数据库中也没有取到,这时也可以将key-value对写为key-null,缓存有效时间可以设置短点,如30秒(设置太长会导致正常情况也没法使用)。这样可以防止攻击用户反复用同一个id暴力攻击 - 缓存击穿
缓存击穿是指缓存中没有但数据库中有的数据(一般是缓存时间到期),这时由于并发用户特别多,同时读缓存没读到数据,又同时去数据库去取数据,引起数据库压力瞬间增大,造成过大压力
解决方案:
1 设置热点数据永远不过期
2 加 互斥锁,互斥锁参考代码如下:
- 缓存雪崩:
缓存雪崩是指缓存中数据大批量到过期时间,而查询数据量巨大,引起数据库压力过大甚至down机。和缓存击穿不同的是, 缓存击穿指并发查同一条数据,缓存雪崩是不同数据都过期了,很多数据都查不到从而查数据库。
解决方案:
1 缓存数据的过期时间设置随机,防止同一时间大量数据过期现象发生。
2 如果缓存数据库是分布式部署,将热点数据均匀分布在不同的缓存数据库中。
3 设置热点数据永远不过期
4 人工干预 对数据做定时检测,查看是否有数据超时的情况
本文地址:https://blog.csdn.net/weixin_45588345/article/details/108871654
上一篇: JAVA面试题第三阶段总结
下一篇: 真正意义上的第一篇博客