如何高雅的使用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去获取一个值的更多相关文章
- js 从数组中随机获取一个值
// 获取随机数 var rand = Math.floor( Math.random() * this.peoples.length ); // 随机从数组中取出某值(不会改变原数组) var da ...
- 【python】Python的字典get方法:从字典中获取一个值
转自: http://blog.sina.com.cn/s/blog_6be89284010183xm.html
- C#获取一个文件的扩展名
C#获取一个文件的扩展名System.IO.Path.GetExtension( "文件名 ");ChangeExtension 更改路径字符串的扩展名. Combine ...
- Yii2 提供可以用属性的方式去获取类的一个方法
刚开始用 Yii 的小朋友可能对下面的写法非常疑惑: public function actionIndex() { $user = User::find()->where(['name'=&g ...
- Jmeter连接Redis,获取Redis数据集
Redis(REmote DIctionary Server)是一个开源的内存数据结构存储,用作数据库,缓存和消息代理. 本博文是分享jmeter怎么连接使用Redis数据库. 安装Redis数据集J ...
- openstack数据库获取一个虚机的floating_ip, fix_ip, project_name, user_name, hostname, host
转载请注明 http://www.cnblogs.com/juandx/p/5418204.html openstack有3个库,nova,neutron,keystone,我现在需要做的是跨库联表 ...
- ***Redis hash是一个string类型的field和value的映射表.它的添加、删除操作都是O(1)(平均)。hash特别适合用于存储对象
http://redis.readthedocs.org/en/latest/hash/hset.html HSET HSET key field value (存一个对象的时候key存) 将哈希 ...
- java中的反射机制,以及如何通过反射获取一个类的构造方法 ,成员变量,方法,详细。。
首先先说一下类的加载,流程.只有明确了类这个对象的存在才可以更好的理解反射的原因,以及反射的机制. 一. 类的加载 当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化三 ...
- 获取一个字符串中每一个字母出现的次数使用map集合
package 获取字符串中单字符出现次数; import java.util.Scanner; import java.util.TreeMap; /* * 需求:获取一个字符串中每一个字母出现的次 ...
随机推荐
- Java GUI 图书管理系统
01 概述 一款功能强大的图书馆管理系统,功能齐全,小白/大学生项目实训,学习的不二之选. 02 技术 此系统使用 java awt 实现.java.awt是一个软件包,包含用于创建用户界面和绘制图形 ...
- 完美解决方案-雪花算法ID到前端之后精度丢失问题
最近公司的一个项目组要把以前的单体应用进行为服务拆分,表的ID主键使用Mybatis plus默认 的雪花算法来生成. 快下班的时候,小伙伴跑过来找我,:"快给我看看这问题,卡这卡了小半天了 ...
- 5G边缘计算:开源架起5G MEC生态发展新通路
摘要:本文尝试从边缘计算的角度来阐述了为什么要把边缘计算当做一种新的生产关系来构建,以及如何用开源来构建这种新的生产关系. 5G推动新一轮工业革命 过去人类经历了三次工业革命, ...
- 终于有架构师用401页PDF+194张图表把设计模式讲明白了
十几年来,IT 界也发生了翻天覆地的变化,各种开源框架层出不穷,机器学习大兴其道.但是,在面向对象编程中,设计模式的重要性却不曾改变.与以前一样,在大规模的企业系统开发中,Java和C#仍处于主导地位 ...
- 基于laravel的有偿开源流程引擎
系统主要文档已经编写完成,具体请前往查看[系统文档](https://www.kancloud.cn/lijianlin/jishullin_workflow_engine/1894424 " ...
- ES6常用总结(一)
let,const let声明变量,const声明常量,两者均为块级作用域 let,const在块级作用域内不允许重复声明 const声明的基本数据类型不可以修改,引用数据类型可以修改.具体看我的另一 ...
- app转iap
ios打包ipa的四种实用方法(.app转.ipa) http://blog.csdn.net/oiken/article/details/49535369 手动压缩改后缀方式 这种方式与4.1的方法 ...
- P3311 [SDOI2014]数数 AC自动机+数位DP
题意 给定一个正整数N和n个模式串,问不大于N的数字中有多少个不包含任意模式串,输出对\(1e^9+7\)取模后的答案. 解题思路 把所有模式串都加入AC自动机,然后跑数位DP就好了.需要注意的是,这 ...
- 编写第一个 .NET 微服务
介绍 本文的目的是:通过创建一个返回列表的简单服务,并在 Docker 容器中运行该服务,让您熟悉使用 .NET 创建微服务的构建过程. 安装 .NET SDK 要开始构建 .NET 应用程序,首先下 ...
- 使用java8的方法引用替换硬编码
背景 想必大家在项目中都有遇到把一个列表的多个字段累加求和的情况,也就是一个列表的总计.有的童鞋问,这个不是给前端做的吗?后端不是只需要把列表返回就行了嘛...没错,我也是这样想的,但是在一场和前端的 ...