- 0.1:主从复制
- 0.2:集群
- 0.3:redis应用问题
主从复制
概念:主机数据更新后根据配置和策略,自动同步到备机的master/slaver机制,master以写为主,slave以读为主
作用
-
读写分离,性能扩展
-
容灾快速恢复
配置:
1.以一主二从为例,创建一个文件夹myredis,复制redis.conf到该文件夹
2.再创建主从服务配置文件,redis6379.conf,redis6380,redis6381.conf
3.里面内容为
#引入公共部分 include ./redis.conf pidfile /var/run/redis_6379.pid port 6379 dbfilename dump6379.rdb
另外两个类似,只需更改文件名以及端口即可
4.分别运行命令redis-server [redis6379.conf路径]
5.在从机上分别运行slaveof <主机ip> <主机端口>
即可
主从复制原理:
从服务器启动之后会主动向主服务器发送一个同步到命令
主服务器接到命令之后,启动后台存盘进程,同时收集所有接收到用于修改数据集命令,在后台进程执行完毕之后,master将整个数据文件一次性同步给从服务器
从服务器收到后,将数据库文件加载到内存当中
主服务器继续将新的收集到的修改命令依次传给从服务器
哨兵模式
当在主从服务器运行当中,会出现主机挂掉情况发生,但是又不能马上执行切换主机,可以利用哨兵模式进行监视主机运行情况,如果主机挂掉将会马上重新选择新的从机作为主机
创建配置文件:sentinel.conf
内容
sentinel monitor my master 127.0.0.1 6379 1
结尾1表示,只要有一个哨兵认为主机挂掉,那么就换新的主机
执行命令:Redis-sentinel sentinel.conf
选取主机规则:
-
优先级靠前的优先设置,在配置文件redis.conf中默认slave-priority 100,值越小,优先级越高
-
选取偏移量大的,偏移量是指获得原主机数据最全的
-
选择runid最小的从服务器,每个redis启动后会随机生成一个40位的runid
集群
集群的作用:
-
分散单台服务器的访问压力,实现负载均衡
-
分散单台服务器的存储压力,实现可扩展性
-
降低单台服务器宕机带来的业务灾难
数据存储设计
什么是slots
一个redis集群当中包含16384个插槽,数据库中的每个键都属于这16384个插槽的其中一个
-
将所有的存储空间切割成16384份,每台主机保存一部分,每份代表的是一个存储空间,不是一个key的保存空间
-
按照对key进行哈希计算的结果对16384进行取模得到的结果就是存储空间的位置,公式:CRC16(key)%16384
redis应用问题
缓存穿透
1.应用服务器压力变大
2.redis命中率降低,一直查不到缓存
3.那么服务器就会一直向数据库发起查询请求,造成数据库崩溃
出现原因:
1.redis查询不到数据库
2.出现很多非正常url访问
解决方案:
-
对空值做缓存:如果一个查询为空的值(不管数据是否存在),我们仍然将这个空结果进行缓存,设置空结果过期时间会很短
-
设置可访问名单
-
布隆过虑器
缓存击穿
1.数据库访问压力瞬间增加
2.redis中没有出现大量key过期
3.redis正常运行
原因:
redis当中某个key过期了。正好这个key正在被大量访问
解决方案:
-
预先设置热门数据,提高生命周期
-
实时监控,发现哪些热门数据频繁访问,调整该数据生命周期
-
使用锁:
1.从缓存中读数据
2.缓存中不存在数据
3.获取锁。获取成功,去数据库取数据
4.更新缓存数据
5.释放锁
缓存雪崩
数据库压力变大,导致服务器崩溃
原因:
在极短时间内,查询大量key,并且key集中过期的情况
解决方案:
-
构建多级缓存架构
-
使用锁或者队列限制读写
-
设置过期标志更新缓存:当某个key快过期时候,通知另一个线程去后台更新缓存
-
将缓存失效时间分散开,不要设置统一失效时间
分布式锁
随着业务发展,原本单机部署的系统被演化成分布式集群系统后,由于分布式系统多线程,多进程分布在不同的机器上,这使得原本单机部署的并发控制锁策略失效,为了解决这一问题就是分布式锁需要解决的
上锁:setnx
删除锁:del
为了防止上锁一直不释放,可以设置过期时间
expire test 10
为了防止过期时间无法设置情况,可以使用原子操作进行上锁
set test 10 nx ex 10 //nx表示上锁,ex表示过期时间