婊ㄥ窞璁哄潧:Redis学习笔记(高级部分)
5. Redis其它配置及集群5.1 Redis的AUTH5.2 Redis的事务5.3Redis持久化机制5.3.1 RDB持久化机制5.3.2 AOF持久化机制
5.4 Redis主从架构5.5 Redis哨兵5.6 Redis集群5.7 Java连接Redis集群
6.Redis常见问题6.1 key的生存时间到期,Redis会立即删除吗6.2 Redis的淘汰机制6.3 缓存问题
修改yml(创建的配置文件)文件,方便以后修改Redis配置
设置通过密码连接,为了更加安全,之前的相关代码与操作都需增加密码操作
方式1:修改配置文件,实现密码校验
三种客户端连接方式:
1.redis-cli:输入正常命令之前,输入auth密码
2.图形化界面:连接时添加密码信息
3.Jedis客户端:
(1)每次获取Jedis对象时通过jedis.auth(password)方法设置,繁琐不推荐
(2)在创建JedisPool时通过带参构造方法设置password
方式2:不修改redis.conf 文鍦ㄧ嚎鍚瓕璇嗘洸件,第一次连接Redis时,输入命令Config set requirepass [password],之后一样需要上述操作验证
区别于SQL中支持的事务
Redis事务:一次事务,该成功则成功,该失败则失败
开启事务,执行一系列命令,但命令不会立即执行,而是放在一个队列中,如果执行事务,那么这个队列中的命令全部执行,如果取消事务,队列中命令全部作废
开启事务命令:
事务操作流程:
1.开启事务:multi
2.依次输入命令,命令会放到一个队列中
3.执行事务:exec
4.取消事务:discard
但Redis的事务要发挥实际业务功能,需要和watch监听机制配合使用
即开启事务之前,先通过watch命令监听一个或多个key,开启事务后,若有其他客户端修改了监听的key,事务自动取消
事务执行或取消之后,watch监听自动取消
RDB时Redis默认的持久化机制
1.RDB持久化文件,速度很快,存储二进制文件,传输方便
2.RDB定义了默认的持久化时机,可根据实际使用环境做修改
3.RDB无法保证数据的绝对安全(主要为持久化时间机制原因)
官网下载或安装包找到配置文件可查看相关配置信息
以下为RDB持久化时机机制的相关配置说明
AOF默认为关闭状态,Redis允许同时开启RDB与AOF,官方也推荐同时开启,更加安全,避免数据丢失
1.AOF持久化的速度,相对RDB较慢,存储文本文件,后期文件较大,传输不方便
2.AOF持久化时机
3.相对于RDB,更安全
相关配置
备注:若同时开启RDB与AOF,在Redis重启之后,需要加载一个持久化文件,会优先选择AOF文件
如果先开启RDB,后开启AOF,如果EDB执行了持久化,那么RDB中的内容会被覆盖掉,会造成数据丢失,要注意开启顺序,要么先开AOF,要么同时开启
单机Redis尽管读取数非常快,但还是存在读取瓶颈问题,写大约8W/S,读11W/s,若只有一台Redis,请求量非常大时,还是会崩溃
主从架构,可以很好的解决问题,至少需要三台Redis,需要进行相关配置,但避免不了单点故障,master挂掉,“群龙无首”,主从架构土崩瓦解。
哨兵用来解决单点故障问题
实现方式:准备哨兵的配置文件,启动
故障前架构图,master故障,群龙无首
故障后架构图,新一个master出现,新一代master挺身而出,力挽狂澜
2017年5月13号星座运势
Redis集群能保证主从加哨兵的基本功能外,还能够提升Redis存储数据的能力,主从架构只有master能写,集群不存在这种限制,因为集群上的节点都是平等的,都可以读写
特点:
1.Redis集群无中心
2.有ping-pang机制(两两发送消息必须有问有答,不然会被认为已经失去连接,进入投票机制,判断失去连接的节点是否还可用)
3.投票机制(Redis集群的节点数量必须是2n+1)
4.Redis集群中默认分配了16384个hash槽,存储数据时,对key进行crc16算法,并对16384取余,根据最终结果将key-value存放在执行的Redis节点中,每个节点都维护着相应的hash槽
5.为保证数据的安全性,每一个集群的节点,至少有一个从节点(备份与备胎的身份)
6.单独针对Redis集群中的某一个节点(请求量很大)搭建主从,分担压力
7.集群中超过半数的节点宕机后,集群瘫痪
架构图
2018和星座大师看运势
搭建集群,准备相关配置文件,略
配置好集群后,Java连接访问比较简单,以下为示例代码
不会立即删除
删除机制
1.定期删除:
Redis每隔一端时间会查看设置乐生存时间的key,会在100ms得时间间隔默认查看3个key,比较随机,有些key会长期存在没有被删除
2.惰性删除:
如果查询一个已经过了生存时间的key,Redis会查看当前key的生存时间,若已经到了生存时间,直接删除key,并返回一个空值
在Redis内存不足,要添加新的数据,执行淘汰机制,有8种策略
1.volatile-lru:在设置过了生存时间的key中删除最近最少使用的key
2.allkeys-lru:在全部key中删除最近最少使用的key
3.volatile-lfu:在设置过了生存时间的key中删除最近最少频次使用的key
4.allkeys-lfu:在设置过了生存时间的key中删除最近最少频次使用的key
5.volatile-random:在设置过了生存时间的key中随机删除key(比较危险)
6.allkeys-random:在全部key中随机删除key(危险)
7.volatile-ttl:在设置过了生存时间的key中删除剩余生存时间最少的key
8.noeviction:啥也不做,直接报错(不推荐,但为默认的)
指定淘汰机制:maxmemory-policy 10月3日星座运势 具体策略
设置最大内存:maxmemory
官方配置文档说明,以供参考
简单架构图:
鑺遍噹鐪熻。缇庤剼
缓存穿透:
问题原因:查询的数据,Redis中没有,数据库中也没有,而请求量又特别大时(有部分可能是恶意攻击),就会造成数据库宕机
解决方案
1.根据id查询时,如果id是自增的,将id的最大值放到Redis中,直接先比较一下id范围是否合理
2.如果id不是整型,可以将id放到set中,在用户查询之前,查看是否有这样的id
3.获取客户的ip地址,对其添加访问限制
缓存击穿:
问题原因:缓存中得热点数据突然到期了,造成大量请求访问数据库,造成数据库宕机
解决方案:
1.访问缓存中没有的数据时,添加锁,限制访问数据库请求的个数
2.将热点数据的生存时间去掉
缓存雪崩:
问题原因:大量缓存同时到期,大量请求同时访问数据库,造成数据库宕机
解决方案:
将缓存中的数据的生存时间,设置一个范围的随机数,以避免同时到期
缓存倾斜:
问题原因:热点数据放在鑺卞埡浠g悊鍒烽捇了一个Redis节点上,Redis节点无法承受大量的请求,最终Redis宕机
星座2020年5月9日运势 解决方案:
1.扩展主从架构,搭建大量的从节点,缓解Redis的压力
2.在Tomcat中做缓存,在查询Redis之前,先查询Tomcat得缓存