1.Redis发布订阅

是一种消息通信模式, 发布订阅(pub/sub)是一种消息通信模式,主要的目的是解耦消息发布者和消息订阅者之间的耦合,这点和设计模式中的观察者模式比较相似。pub /sub不仅仅解决发布者和订阅者直接代码级别耦合也解决两者在物理部署上的耦合

缺点以及场景

由于没有消息持久化的保证,所以导致Redis 的发布订阅功能不太可靠。这也就导致了在一些应用场景下有了一定的限制,建议用于实时与可靠性要求不高的场景。例如:消息推送,内网环境的消息通知等场景

2.Redis主从复制

主机写,从机只能读

什么是主从复制

主从复制,是指将一台 Redis 服务器的数据,复制到其他的 Redis 服务器。前者称为主节点(master),后者称为从节点(slave),数据的复制是单向的,只能由主节点到从节点。


单台redis内存不应该超过20g

info replication 查看是否是主机还是从机

认主机在想变成从机的命令里打

SLAVEOF 127.0.0.1 6379 #地址 端口号

主机断开redis,从机不受影响依然可以读到值,都是从机重启就不行了(用命令形式,改配置文件就不同)


如果主机断了话,使用slaveof no one 让自己变成主机!类似于谋朝篡位一样


3.哨兵模式

类似于主复制的自动版

简述意思就是主机下线了,哨兵就会用一个算法(差不多意思就是投票)来给其中一个从机升成主机,后续前任主机上线,自然变成新主机的从机了

###

单哨兵形式

1.配置哨兵配置文件sentinel.conf ---------基础配置

#sentinel monitor 被监控的名字 host port 1

sentinel monitor myredis 12.0.0.1 6379 1

后面的这个数字1,代表主机挂了,slave投票看让谁接替成为主机,票数最多的,就会成为主机 !(判断主机下线需要等待30左右)

2.启动哨兵

redis-sentinel kconfig/sentine7.conf

优缺点

优点:

1、哨兵集群,基于主从复制模式,所有的主从配置优点,它全有

2、主从可以切换,故障可以转移,系统的可用性就会更好

3、哨兵模式就是主从模式的升级,手动到自动,更加健壮!

缺点︰

1、Redis不好啊在线扩容的,集群容量一旦到达上限,在线扩容就十分麻烦!

2、实现哨兵模式的配置其实是很麻烦的,里面有很多选择!

4.Redis缓存穿透和雪崩(面试高配,工作必用)

缓存穿透(缓存无key,直接跳过)

打个比方:用户 缓存 数据库,一般流程是用户缓存数据库,可是缓存是使用过才会出现,像什么秒杀活动,突然来好多人,直接跳过缓存去数据库去拿值,这样会导致数据库崩溃。

解决方案

1.布隆过滤器

布隆过滤器是一种占用空间很小的数据结构,它由一个很长的二进制向量和一组Hash映射函数组成,它用于检索一个元素是否在一个集合中,空间效率和查询时间都比一般的算法要好的多,缺点是有一定的误识别率和删除困难。

2.缓存空对象

但是这种方法会存在两个问题︰

1、如果空值能够被缓存起来,这就意味着缓存需要更多的空间存储更多的键,因为这当中可能会有很多的空值的键;

2、即使对空值设置了过期时间,还是会存在缓存层和存储层的数据会有一段时间窗口的不一致,这对于需要保持一致性的业务会有影响。

缓存击穿(针对key过期的一瞬间)

就是很多请求往一个点去,类似于微博一些明星重大事件,特多人直接去搜索这一个事件,导致多条信息去请求一个点,让这个点被击穿,这就是所谓的,

与缓存穿透的区别

缓存击穿是多个请求打一个点的缓存,卡在缓存过期时间那零点一秒的时间打破裂

而缓存穿透是缓存里还没有这个数据,导致越过了缓存,直接砸向数据库

解决方案

设置热点数据永不过期

从缓存层面来看,没有设置过期时间,所以不会出现热点key过期后产生的问题。

加互斥锁 分布式锁∶

使用分布式锁,保证对于每个key同时只有一个线程去查询后端服务,其他线程没有获得分布式锁的权限,因此只需要等待即可。这种方式将高并发的压力转移到了分布式锁,因此对分布式锁的考验很大。

分布式锁差不多意思就是设置一个锁,子让一个线程通过,其他的等待

缓存雪崩(key集中过期)

打比方就是双十一的时候,程序员怕缓存穿透,于是提前加了缓存,假设缓存过期时间为5小时,那么到了那个时间还是有大批用户买东西,导致数据库奔溃!其实集中过期,倒不是非常致命,比较致命的缓存雪崩,是缓存服务器某个节点宕机或断网。因为自然形成的缓存雪崩,一定是在某个时间段集中创建缓存,这个时候,数据库也是可以顶住压力的。无非就是对数据库产生周期性的压力而已。而缓存服务节点的宕机,对数据库服务器造成的压力是不可预知的,很有可能瞬间就把数据库压垮。

解决方案

redis高可用(异地多活)

这个思想的含义是,既然redis有可能挂掉,那我多增设几台redis ,这样一台挂掉之后其他的还可以继续工作,其实就是搭建的集群。

限流降级(停掉一些服务,来帮忙)

这个解决方案的思想是,在缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量。比如对某个key只允许一个线程查询数据和写缓存,其他线程等待。

数据预热

数据加热的含义就是在正式部署之前,我先把可能的数据先预先访问一遍,这样部分可能大量访问的数据就会加载到缓存中。在即将发生大并发访问前手动触发加载缓存不同的key,设置不同的过期时间,让缓存失效的时间点尽量均匀。


以上就是我学习做的一些笔记,如果以上有疑问或者有不太好的地方可以评论评论


完结.....