如何高雅的使用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; /* * 需求:获取一个字符串中每一个字母出现的次 ...
随机推荐
- django学习(一)
1.django版本的选择问题 在学习django之前,我们先做一个基本问题的讨论,这个问题是关于django版本的问题.我们进入官网,可以查看django版本的情况. 关于django的版本的问题, ...
- vps的搭建
最近一直想自己搭建一款vps使用,但是苦于一直没有时间,直到今天得空,与大家一起分享下. 服务商的选择 因为自己之前在 vultr 上还留有余额(60$呢,好几百块大洋呢),所以我的服务商就选择 vu ...
- IntelliJ IDEA下git版本回退,版本还原
原文链接:https://blog.csdn.net/hehyyoulan/article/details/80005272
- py_正则表达式练习
正则表达式: #正则表达式 #键盘数字6上的符号,^表示行的开始,$ 表示行的结束 #test = "tm queal Tomorrow Moon" ''' ^tm #匹配tm开头 ...
- 《MySQL数据库》MySQL主从复制搭建与原理
前言 主从复制:两台或者更多的数据库实例,通过二进制日志,实现数据同步.为什么需要主从复制,主从复制的作用是什么,答:为了预防灾难. 搭建 第一步:准备多实例环境.如何创建多实例见: 第二步:确保每一 ...
- e3mall商城总结12之购物车的实现、以及购物车小计问题、json406报错
说在前面的话 1.本节主要讲了e3mall购物车的实现方法,我搭建的项目和系统购物车有一些区别,因此这里需要说一下.系统搭建的项目在未登陆的情况下也可以通过cookie进行加入购物车,当用户要下单的时 ...
- GreatRiver研讨会 | ARINC 818的应用及发展
想要实现ARINC 818?与旋极合作伙伴大河(Great River Technology 简称GRT)一起参加免费的网络研讨会吧!ARINC 818视频协议如今正应用在各大军工项目以及相关的核心研 ...
- Selenium 如何复用浏览器【解决扫码登录等问题】
Selenium中复用已经打开的浏览器进行自动化测试,可以辅助我们解决某些登录需要扫二维码之后,才能进行的操作 目前只支持谷歌Chrome浏览器,那需要做哪些准备操作呢?往下看 1.windows和M ...
- pybind11: C++ 工程如何提供 Python 接口
C/C++ 工程提供 Python 接口,有利于融合进 Python 的生态.现在 Python 在应用层,有其得天独厚的优势.尤其因为人工智能和大数据的推波助澜, Python 现在以及未来,将长期 ...
- ffmpeg 编译Android
环境 macOS 10.15.4 NDK 21.3.6528147 ffmpeg 4.2.3 1.执行sudo xcodebuild -license,防止编译的时候找不到一些文件报错 2. ...