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

步骤: 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去获取一个值的更多相关文章

  1. js 从数组中随机获取一个值

    // 获取随机数 var rand = Math.floor( Math.random() * this.peoples.length ); // 随机从数组中取出某值(不会改变原数组) var da ...

  2. 【python】Python的字典get方法:从字典中获取一个值

    转自: http://blog.sina.com.cn/s/blog_6be89284010183xm.html

  3. C#获取一个文件的扩展名

    C#获取一个文件的扩展名System.IO.Path.GetExtension( "文件名 ");ChangeExtension   更改路径字符串的扩展名. Combine   ...

  4. Yii2 提供可以用属性的方式去获取类的一个方法

    刚开始用 Yii 的小朋友可能对下面的写法非常疑惑: public function actionIndex() { $user = User::find()->where(['name'=&g ...

  5. Jmeter连接Redis,获取Redis数据集

    Redis(REmote DIctionary Server)是一个开源的内存数据结构存储,用作数据库,缓存和消息代理. 本博文是分享jmeter怎么连接使用Redis数据库. 安装Redis数据集J ...

  6. openstack数据库获取一个虚机的floating_ip, fix_ip, project_name, user_name, hostname, host

     转载请注明 http://www.cnblogs.com/juandx/p/5418204.html openstack有3个库,nova,neutron,keystone,我现在需要做的是跨库联表 ...

  7. ***Redis hash是一个string类型的field和value的映射表.它的添加、删除操作都是O(1)(平均)。hash特别适合用于存储对象

    http://redis.readthedocs.org/en/latest/hash/hset.html HSET HSET key field value   (存一个对象的时候key存) 将哈希 ...

  8. java中的反射机制,以及如何通过反射获取一个类的构造方法 ,成员变量,方法,详细。。

    首先先说一下类的加载,流程.只有明确了类这个对象的存在才可以更好的理解反射的原因,以及反射的机制. 一.  类的加载 当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化三 ...

  9. 获取一个字符串中每一个字母出现的次数使用map集合

    package 获取字符串中单字符出现次数; import java.util.Scanner; import java.util.TreeMap; /* * 需求:获取一个字符串中每一个字母出现的次 ...

随机推荐

  1. 淘宝ios端弹窗-2020年3月25日

  2. Cortex-M4的快速memcpy,根据数据对齐情况自动优化,速度为普通memcpy的1.3到5.2倍

    代码:https://github.com/gamesun/memcpy_fast memcpy_fast与memcpy速度比较 测试方法 memcpy_fast(dest + a, src + b, ...

  3. 【转】LeakCanary

    LeakCanary:检测所有的内存泄漏 http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0509/2854.html 原文: L ...

  4. 程序员你的maven多模块项目如何对外输出为一个构件?

    上图为常见的台式机,程序员,你看了有啥启发? 台式机生产线 我的maven代码工程 xxx 显示器 xxx-web 主机 xxx-app 键盘 xxx-domian 鼠标 xxx-infrastrat ...

  5. SQL连接(内连接、外连接、交叉连接)

    SQL连接(内连接.外连接.交叉连接) 假设现在有两个表:table1 , table2 table1:                                table2 :  id     ...

  6. ASP.NET Uploadify 上传文件过大 报错(http error)借鉴,以防忘记

    Uploadify上传文件原来很早之前用过,没发现什么问题.今天再使用过程中,当文件大于30M的时候就会报错404.查看错误消息提示配置最大上传太小了.需要修改. 记得原来配置上传文件大小在这里:&l ...

  7. 小程序开发-微信小程序开发入门

    分享一个微信小程序开发的基本流程,仅供参考. 第一步:注册微信小程序公众号,注册成功后,登录微信公众号管理后台,等待下一步操作. 第二步:进入微信小程序的后台后,下载微信内置的微信小程序开发者工具,以 ...

  8. Cassandra使用的各种策略

    1. 背景介绍 Cassandra 使用分布式哈希表(DHT)来确定存储某一个数据对象的节点.在 DHT 里面,负责存储的节点以及数据对象都被分配一个 token.token 只能在一定的范围内取值, ...

  9. vue父子组件状态同步的最佳方式

    哈喽!大家好!我是木瓜太香,一位老牌儿前端工程师,平时我们在使用 vue 开发的时候,可能会遇到需要父组件与子组件某个状态需要同步的情况,通常这个是因为我们封装组件的时候有一个相同的状态外面要用,里面 ...

  10. pwnable.kr之leg

    查看原题代码: #include <stdio.h> #include <fcntl.h> int key1(){ asm("mov r3, pc\n"); ...