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

Posted yangxiaohui227

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何高雅的使用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));}

 

 

 

 

 

以上是关于如何高雅的使用redis去获取一个值的主要内容,如果未能解决你的问题,请参考以下文章

一旦单击带有 in 片段的回收器列表项,如何将片段意向活动,以及如何获取回收器项目值?

如何将微调器的值放入不同的片段中?

如何删除redis中list的某个值

从片段中获取意图值后,我如何在 recyclerview 项目中实现单击

如何运用领域驱动设计 - 值对象

OnItemClick 如何从列表视图中获取单击项目的文本值