1、Ehcache做一级缓存,Redis做二级缓存
    Ehcache是本地缓存,不需要走网络,而Redis是分布式缓存,需要走网络,所以使用Ehcache会减轻redis的访问压力,也可以提高访问速度;
    如果redis在高并发的情况下,宕机了,突然大量请求操作数据库,产生雪崩效应;

    2、搭建Redis集群方案
    主从复制:主要因为每个节点都要保存一份数据,数据十分冗余,浪费内存;
    客户端分片技术:不推荐,主要因为在扩容与缩容的时候需要手动调整分片程序;同时出现故障不能自动转移;
    Redis-cluster:推荐使用这种方式,这里引入了一个卡槽的概念,就像mysql中的分库分表中的表的概念,卡槽的数量是一定的0-16384;当我们向redis存放一个key-value时,先应用CRC16算法计算出key的值,然后取余卡槽的数量,在查看具体的某个卡槽存放在哪个redis服务器节点,最后做出请求;卡槽是均摊到redis服务器节点的;没有检点都会有主节点与从节点,如果新增节点或删除redis节点会自动移动卡槽;
    分布式缓存架构.docx集群环境搭建.doc上课代码.zip

    3、redis做了集群,整体是不支持事务的,但是每个节点是支持事务的 multi exec discard

    4、
    雪崩效应的问题:如果redis中的所有key在同一时刻失效的话,同时在此刻有大量的请求来访问服务器,会导致直接数据库连接异常,甚至直接瘫痪整个系统(限流、服务降级、熔断)

    redis雪崩效应解决方案:
    分布式锁(本地锁):分布式项目应用分布式锁,小项目部署在一台服务器则应用本地锁(lock/redis、 zookeeper)
    使用消息中间件的方式:如果redis查询不到,则将请求存放到MQ中,消费者端可以做一个限流,做完查询操作 将结果返回给生产者,同时将结果缓存到redis中;但是通过限流将数据库应用利用到最大;
    一级加二级缓存(Ehcache + redis)
    均摊分配redis key的失效时间设置不同
    穿透原因:
    客户端传来的key,在redis和数据库中没有响应的数据,如果客户端连续发送大量这样的请求
    穿透解决方案:
    1、网关判断客户端传入对应的key的规则,如果不符合则就不需要查询,直接返回null;
    2、如果我们的key没有做规则的一些定制,那么我们就要用雪崩效应的方案,同时加上将key对应的value设置为 null存放到redis中,不过在每次向数据库添加key的时候我们要清除redis中对应的key;
    5、
    在redis中如何设置唯一key,这里get到一点,可以借鉴一下,this.getClass().getName() + “-“ +Thread.currentThread().getStackTrace()[1].getMethodName() + “-id” + id;

    redis如果查询不到.pngredis学蹦效应解决方案.png穿透原理.png学蹦.png
    分布式缓存架构.docx

    QQ图片20200502083206.jpg
    QQ图片20200502083155.jpg
    上课代码.zipRedis基于布隆过滤器解决缓存穿透问题.docx