缓存使用的问题代码和改进

问题代码

线上出现的问题写法,本文通过伪代码例子代码说明,来看一个常规的获取例子代码:

 public Object getOrderInfo(int orderId, String cacheKey){
    Object orderInfo = getCache(cacheKey);
     if (null != orderInfo) {
         return orderInfo;
     }
     orderInfo = getDb(orderId);
     if(null != orderInfo){
         setCache(cacheKey, orderInfo);
     }
     return orderInfo;
 }
  public Object getCache(String cacheKey){
       try{
           Object orderInfo = new Object();
           return orderInfo;
       }catch (Exception e){
           logger.error("getCache error", e);
       }
       return null;
   }
public boolean setCache(String cacheKey, Object orderInfo) {
    redisClient.set(cacheKey, orderInfo);
    return true;
}
public Object getDb(int orderId){
    return new Object();
}

问题1 : 缓存不能影响业务逻辑

setCache如果有异常,那么直接往上层抛异常,直接导致业务获取失败了

所以需要立刻改正

public boolean setCache(String cacheKey, Object orderInfo) {
    try {
        redisClient.set(cacheKey, orderInfo);
        return true;
    } catch (Throwable e) {
        logger.error("setCche error:{}", cacheKey, e);
    }
    return false;
}

问题2 : 缓存需要过期

另外需要检查自己的过期策略配置是否正确

public boolean setCache(String cacheKey, Object orderInfo) {
    try {
        long expireTime = 60;
        redisClient.set(cacheKey, orderInfo, expireTime);
        return true;
    } catch (Throwable e) {
        logger.error("setCche error:{}", cacheKey, e);
    }
    return false;
}

问题3 : 异常情况下的永不过期,开关配置,预案

如:使用开关

 public boolean setCache(String cacheKey, Object orderInfo) {
  try {
        long expireTimeSec = AppSwitch.getOrDefault(cacheKey, 60);
        redisClient.set(cacheKey, orderInfo, expireTimeSec);
        return true;
    } catch (Throwable e) {
        logger.error("setCche error:{}", cacheKey, e);
    }
    return false;
}

效率提升:本地缓存

即多级别缓存:

  1. 先查询本地缓存
  2. 再查询第三方缓存,如redis缓存
  3. 若缓存没有,则再访问数据库
  4. 更新缓存

适合业务

  1. 读多写少
  2. 高并发访问,对rt要求高
  3. 热点数据明显的

监控改进

  1. redis集群的监控:读、写、内存、磁盘、CPU等
  2. 业务监控
  3. redis使用的读写异常量,rt波动异常
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值