redis(二)完结

文章目录[x]
  1. 0.1:主从复制
  2. 0.2:集群
  3. 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表示过期时间
点赞

发表评论

昵称和uid可以选填一个,填邮箱必填(留言回复后将会发邮件给你)
tips:输入uid可以快速获得你的昵称和头像