如何高雅的使用redis去获取一个值

//场景,给定一个订单号来从缓存中查询一个订单信息;

 步骤: 1从redis中直接获取,有数据就返回

          2.如果redis中没有值,就查数据库

          3.数据库查到的数据不为空,就刷到redis中

         4.返回查到的数据

  一般的代码写法:

 public ShopOrderMast get(String orderId){
       // 1从redis中直接获取,有数据就返回
        String orderStr = redisUtil.string_get(orderId);
        if(StringUtils.isNotBlank(orderStr)){
            return JSON.parseObject(orderStr,ShopOrderMast.class);
        }
        // 2.如果redis中没有值,就查数据库
         ShopOrderMast orderMast = shopOrderMastMapper.selectOrderByCodOrderId(orderId);

        // 3.数据库查到的数据不为空,就刷到redis中
        if(null!=orderMast){
            redisUtil.string_set(orderId,JSON.toJSONString(orderMast),1000);
        }
       // 4.返回查到的数据
        return orderMast;
    }

//优雅的做法
public abstract class RedisCacheUtil {

    //从redis中获取
    public interface CacheFactory<K,V>{

        V get(K key);
    }
    //从数据库获取
    public interface RealObjectFactory<K,V>{

        V get(K key);
    }
    //刷到缓存
    public interface FlushCaheFactory<K,V>{

        void flush(K key,V v);
    }
    //获取缓存key的值
    public  static <K,V> V get(K key,CacheFactory<K,V> cacheFactory,RealObjectFactory<K,V> realFactory,FlushCaheFactory<K,V> flushCaheFactory){
        //先从缓存获取
        V v = cacheFactory.get(key);
        if(null!=v){
            return v;
        }
        //缓存不存在,就从数据库获取
        v = realFactory.get(key);
        if(null!=v){
            //重新刷到缓存
            flushCaheFactory.flush(key,v);
        }
        return v;
    }
}

//根据上面的工具类,改造获取订单的缓存方法,可以使用lambda表达式
 public ShopOrderMast getByRedis(String orderId){
      return RedisCacheUtil.get(orderId, key -> {
          String orderStr = redisUtil.string_get(orderId);
          if(StringUtils.isNotBlank(orderStr)){
              return JSON.parseObject(orderStr,ShopOrderMast.class);
          }
          return null;
      }, key -> shopOrderMastMapper.selectOrderByCodOrderId(orderId),
              (key, orderMast) -> redisUtil.string_set(orderId,JSON.toJSONString(orderMast),1000));}


 


 
原文地址:https://www.cnblogs.com/yangxiaohui227/p/11770459.html