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

步骤: 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. Sublime Text3 个人使用安装设置

    1 安装Package Control 自动安装: 点击 View > Show Console 输入以下代码并运行 import urllib.request,os,hashlib; h = ...

  2. IDEA下Maven项目搭建踩坑记----2.项目编译之后 在service层运行时找不到 com.dao.CarDao

    项目写的差不多 想运行一下,然后发现运行到Service层的时候报错说找不到Dao层文件 ,纠结半天之后看了下编译好的项目文件,发现mapper文件下边是空的, 于是就百度找一下原因,结果说是IDEA ...

  3. antd-vue中table行高亮效果实现

    [方式一]:通过设置customRow达到目的,点击时遍历所有行设置为正常颜色,把当前行设置为特殊颜色(高亮色) HTML: <a-table ref="table" siz ...

  4. swagger的导出

    swagger-export是一个提供swagger文档导出功能的服务,不依赖于具体的API接口服务实现,你可以很方便地导出html和pdf两种格式的静态文档.源码来自swagger导出静态API文档 ...

  5. dlopen代码详解——从ELF格式到mmap

    最近一个月的时间大部分在研究glibc中dlopen的代码,基本上对整个流程建立了一个基本的了解.由于网上相关资料比较少,走了不少弯路,故在此记录一二,希望后人能够站在我这个矮子的肩上做出精彩的成果. ...

  6. 超简单集成华为HMS ML Kit文本识别SDK,一键实现账单号自动录入

    前言   在之前的文章<超简单集成华为HMS Core MLKit通用卡证识别SDK,一键实现各种卡绑定>中我们给大家介绍了华为HMS ML Kit通用卡证识别技术是如何通过拍照自动识别卡 ...

  7. .net core 返回业务错误(不抛异常)

    在开始之前你需要知道: 1.通过抛异常--全局捕获异常的方式返回业务错误信息性能是非常差的(不知道为什么的可以百度一下) 2.如何将错误信息绑定到mvc模型验证中 自定义返回内容 //返回内容接口 p ...

  8. A little something to get you started(Hacker101 CTF)

    打开题目的页面发现只有”Welcome to level 0. Enjoy your stay.“这么一行普通的文字,然后习惯性的打开浏览器的开发者工具的“network”模块,按下F5发现网页在请求 ...

  9. 面向嵌入式的JavaScript引擎

    https://jerryscript.net/ https://duktape.org/ https://github.com/ialex32x/duktape-unity https://gith ...

  10. html中实现倒计时功能(setInterval,clearInterval)

    倒计时主要用到的知识点:1.设置时间间隔的setInterval可以被clearInterval取消 2.毫秒转换为时分格式 这个是效果图 下面是js中的函数 var shijian=3600; va ...