SaaS中分布式缓存使用

美团的技术还是不错的,可以看看缓存那些事
1 ehcache
hibernate的时代就开始使用ehcache,Ehcache的超时设置主要是针对整个cache实例设置整体的超时策略,而没有较好的处理针对单独的key的个性的超时设置(有策略设置,但是比较复杂,就不描述了),因此,在使用中要注意过期失效的缓存元素无法被GC回收,时间越长缓存越多,内存占用也就越大,内存泄露的概率也越大。
2 guava cache
Caffeine与Guava对比

4 二级缓存
二级缓存设计基本有个共识,一级本地缓存,内存级访问高效,但因内存空间有限,访问高频,故而过期时间就短一些;二级缓存采用分布式缓存,存在网络请求,
Guava、Redis实现二级缓存
4.1 缓存架构
这里参考白云Jesse / l2cache,可以再这个基础上做一下二次开发。
先试用caffeine一级缓存

l2cache:
  config:
    # 是否存储空值,默认true,防止缓存穿透
#    allowNullValues: false
#    # 空值过期时间,单位秒
#    nullValueExpireTimeSeconds: 300
    # 缓存类型
    cacheType: caffeine
      # 是否构建异步Caffeine true 是 false 否
    caffeine:
      asyncCache: false
      # 是否自动刷新过期缓存 true 是 false 否
      autoRefreshExpireCache: false
      # 缓存刷新调度线程池的大小
      refreshPoolSize: 2
      # 缓存刷新的频率(秒)
      refreshPeriod: 10
      #
      defaultSpec: initialCapacity=10,maximumSize=200,refreshAfterWrite=30m,recordStats
      # 设置指定缓存名的创建缓存配置
      specs:
        # 科目缓存
        accAccountSubjectCache: initialCapacity=200,maximumSize=4000,expireAfterWrite=30s

4.2 数据结构

5 缓存问题
缓存穿透、缓存击穿、缓存雪崩区别和解决方案,既然缓存问题均是因为担心数据库的压力,故而二级缓存就是一个很好的解决方案。
5.1 缓存穿透
指缓存和数据库中都没有的数据,当用户使用不存在的id不断的攻击,接口没有校验通过,数据库的压力就比较大。

  • key-null
    这个是已经获取到权限,既然从数据库中获取不到数据,那就在缓存将对应key设置为null,然后把过期时间设置短一点,因为如果不同的key请求很多,那缓存岂不是爆炸了,故而这个过期策略就很重要了。
  • 鉴权
    用户能够访问到接口,那是不是有appId、appkey,签名认证通过呢?
    认证通过了,那么是否知道接口参数的规则呢?故而这些都可以采取的防范策略。
    5.2 缓存击穿
    击穿就是请求直接到数据库层面,因为缓存没有命中,当用户并发量大的情况,数据库压力太大,这就是缓存击穿。
    缓存没有命中,一种原因是缓存过期,另一个情况就是缓存中原本就没有数据。但因为数据库中有数据,故而缓存中没有数据,是缓存过期造成的。这里的解决思路,也比较清晰。根据不同数据的程度,设置不同的过期策略。
  • 热数据
    热数据常驻缓存,不过期。这种情况太有用了,比如总账系统科目数据确定好之后,科目基本不会变,但是它又是频繁用到的,故而可以采用这个策略。
  • 互斥锁
    这个是防止并发情况,防止重复从数据库中获取数据。
  • 过期策略
    这些是可以根据业务来判断
    5.3 缓存雪崩
    对同一个数据的请求过多,造成缓存击穿。因为缓存策略是针对一批数据,故而过期后,也会造成大量的数据库请求。解决问题是既然缓存时间是批数据,那么也可以将缓存时间设置为随机的。另外还是缓存时间,热数据就不不过期了。
    6 实际案例
    这里做了一个明细账的导出,针对一个账套而言,就有30条sql预计,其中有7条语句执行超过100次,这个导出应该是有非常大的空间
    1
    从中先选取简单的。如下图显示币别表的查询就调用了442次。
    1展开之后就可以找到对应的方法是那个
    1
    进入到代码,这里确实没有加缓存,每次都请求数据库.像币别这样基本不变的数据,可以使用缓存
    1
    配置缓存
    1
    再删除、修改、新增的时候,增加缓存清理
    2
    redis中可以看到缓存内容

1
采用jprofile跟进后,可以看到上面的sql已经没有了,变成只执行了一次,因此性能提升了4s。其他只要是不常用的都可以采用二级缓存的模式。
1

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

warrah

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值