项目理解(七)多级缓存优化性能

目录

1、多级缓存

(一)集成Caffeine

(二)Caffeine驱逐策略

2、Redis分布式缓存

(一)Redis过期与淘汰策略

(二)Redis分布式锁

(三)Redis缓存穿透、缓存雪崩、缓存击穿


1、多级缓存

本地缓存:性能最好;本地缓存大小一般较小;分布式缓存:有一些数据是不适合存放在本地缓存的,比如登录凭证,这个数据和用户有直接的关联,如一个请求访问A服务器凭证存放在A服务器,下一次请求访问B服务器,B缓存中没有凭证,影响登录状态;比本地缓存性能略低一些,主要是因为有网络开销;

多级缓存:一级缓存(本地缓存) -> 二级缓存(分布式缓存)-> DB :

可以避免缓存雪崩(缓存失效,大量请求直达DB),提高系统的可用性:

假设只有一级缓存和数据库:如果一个请求被分派到了服务器1,应用程序首先访问一级缓存(本地缓存),如果没有找到数据,应用程序就访问数据库DB,得到数据,并将数据更新到本地缓存  ;如果又来了一个和用户相关的请求,被分配到了服务器2,由于访问和用户相关的数据,且应用程序在一级缓存中没有找到数据,这个时候仅有一级缓存就出现了问题;如果一个没有和服务器强关联的请求,比如访问热门帖子,则不会有影响,因为先在一级缓存中没有找到数据的话,再到DB中查找;(由于之前使用redis存储登录凭证和用户信息)。使用二级缓存Redis,应用程序首先访问二级缓存,如果没有找到数据,应用程序就访问数据库DB,得到数据,并将数据更新到Redis,再访问服务器2,先从Redis找数据,可以找到,就直接得到数据了。

一级缓存(本地缓存),如果缓存命中,就可以直接返回;如果一级缓存没有,就会去Redis查找,再不行就走传统业务逻辑。这种缓存比单一的缓存工具比起来有如下特点:

1、适应集群环境

2、比单一Redis缓存性能高

3、设计三级数据层分摊了请求量,降低数据库压力

与所有缓存框架一样,缓存只适合非关键数据,因为缓存更新多少具有延时。

缓存中存的是频繁调用但不经常变化的数据:按照热门程度排的帖子存到缓存中;

不建议用Spring整合本地缓存的工具:Spring整合是用一个缓存管理器cache maneger去管理所有的缓存,程序中可能有很多缓存:A缓存帖子,B缓存其他的数据,每个缓存的大小,淘汰策略应该有所不同,可能需要多个缓存管理器,使用多个缓存管理器反而麻烦了;

缓存的更新:

1、当以及缓存失效时,得益于Caffeine本身提供的功能,可以指定方法去Redis获取并更新到缓存中。

2、当业务数据发生变化,调用delete方法直接清除一/二级缓存

3、当新建缓存时,先Redis存入缓存,再通过Redis的消息订阅机制 让本地每台机器接收最新的cache

(一)集成Caffeine

Spring集成流程:
1、导入包
2、在配置文件中配置缓存中最大的数量和过期时间(存到缓存中过多长时间就自动清理掉)
3、主要优化Service层中的方法:增加init方法(并使用@PostConstruct)查找热门帖子及数量:同步加载,如果缓存中没有,则加载到缓存;重构查找帖子方法(先在缓存中找,没有就到数据库中找)和得到帖子行数的方法;
4、压测:有缓存和没有缓存进行性能对比;

   //  ________________________________________________________
    //++++++++++++++++查询帖子列表及帖子数的方法重构+++++++++++++++++++++
    // Caffeine核心接口: Cache, LoadingCache:同步的, AsyncLoadingCache:异步的
    //都是按照key缓存value

    @Value("${caffeine.posts.max-size}")
    private int maxSize;

    @Value("${caffeine.posts.expire-seconds}")
    private int expireSeconds;


    //帖子列表缓存
    private LoadingCache<String,List<DiscussPost>> postListCache;
    //帖子数的缓存
    private LoadingCache<Integer,Integer> postRowsCache;

    //这两个缓存:应用程序在调用Service方法
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值