字符串String实战之商品对象缓存管理之新增与获取详情
1. 新创建item表
CREATE TABLE `item` (`id` int(11) NOT NULL AUTO_INCREMENT,`code` varchar(255) DEFAULT NULL COMMENT '商品编号',`name` varchar(255) CHARACTER SET utf8mb4 DEFAULT NULL COMMENT '商品名称',`create_time` datetime DEFAULT NULL,`content` text,PRIMARY KEY (`id`),UNIQUE KEY `idx_code` (`code`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=10014 DEFAULT CHARSET=utf8 COMMENT='商品信息表';
2. 逆向工程生成mapper,entity和mapper.xml文件
3. 针对redis中的key创建一个Constant类
public class Constant {public static final String RedisStringPrefix = "SpringBootRedis:String:V1";
}
4. StringController.java
@RestController
@RequestMapping("string/item")
public class StringController {private static final Logger log = LoggerFactory.getLogger(StringController.class);@Autowiredprivate StringService stringService;//新增(表示数据提交的格式为json)@RequestMapping(value = "add", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_UTF8_VALUE)public BaseResponse add(@RequestBody @Validated Item item, BindingResult result){if(result.hasErrors()){return new BaseResponse(StatusCode.InvalidParams);}BaseResponse response = new BaseResponse(StatusCode.Success);try{response.setData(stringService.add(item));}catch (Exception e){log.error("商品对象信息的管理-缓存新增-异常信息", e);response = new BaseResponse(StatusCode.Fail.getCode(), e.getMessage());}return response;}//详情@RequestMapping(value = "info", method = RequestMethod.GET)public BaseResponse add(@RequestParam Integer id){if(id <= 0){return new BaseResponse(StatusCode.InvalidParams);}BaseResponse response = new BaseResponse(StatusCode.Success);try{response.setData(stringService.get(id));}catch (Exception e){log.error("商品对象信息的管理-缓存-详情-异常信息", e);response = new BaseResponse(StatusCode.Fail.getCode(), e.getMessage());}return response;}}
5.StringService.java
@Service
public class StringService {private static final Logger log = LoggerFactory.getLogger(StringService.class);@Autowiredprivate ItemMapper itemMapper;@Autowiredprivate RedisTemplate redisTemplate;@Autowiredprivate ObjectMapper objectMapper;@Transactional(rollbackFor = Exception.class)public Integer add(Item item) throws Exception{item.setCreateTime(new Date());item.setId(null);int res = itemMapper.insertSelective(item);//数据库写入成功,也同时往cache写一份。保证双写一致性if(res > 0){//利用ObjectMapper将结果转换成字符串格式redisTemplate.opsForValue().set(Constant.RedisStringPrefix+item.getId(), objectMapper.writeValueAsString(item));}return item.getId();}//有缓存就直接在缓存中掺查找,没有缓存的话就需要查询数据库public Item get(final Integer id) throws Exception{final String key = Constant.RedisStringPrefix + id;Item item = null;if(redisTemplate.hasKey(key)){Object obj = redisTemplate.opsForValue().get(key);if(obj != null && StringUtils.isNotBlank(obj.toString())){item = objectMapper.readValue(obj.toString(), Item.class);}}else{item = itemMapper.selectByPrimaryKey(id);//如果从数据库中查找到了结果的话,重新放置回缓存if(item != null){redisTemplate.opsForValue().set(key, objectMapper.writeValueAsString(item));}else{//防止缓存穿透redisTemplate.opsForValue().set(key, "");}}return item;}
}
字符串String实战之商品对象缓存管理之新增与获取详情相关推荐
- Redis实战(2)-数据结构之字符串String实战之存储对象
概述:本系列博文所涉及的相关内容来源于debug亲自录制的实战课程:缓存中间件Redis技术入门与应用场景实战(SpringBoot2.x + 抢红包系统设计与实战),感兴趣的小伙伴可以点击自行前往学 ...
- 22-09-20 西安 谷粒商城(04)Redisson做分布式锁、布隆过滤器、AOP赋能、自定义注解做缓存管理、秒杀测试
Redisson 1.Redisson做分布式锁 分布式锁主流的实现方案: 基于数据库实现分布式锁 基于缓存(Redis),性能最高 基于Zookeeper,可靠性最高 Redisson是一个在Re ...
- R语言unlist函数将复杂数据(list列表、dataframe、字符串String)对象处理成简单向量vector形式:将包含dataframe和字符串的向量列表转换为单个向量(删除数据名称)
R语言unlist函数将复杂数据(list列表.dataframe.字符串String)对象处理成简单向量vector形式:将包含dataframe和字符串的向量列表转换为单个向量(删除数据名称) 目 ...
- 【C++ 语言】C++字符串 ( string 类 | 创建方法 | 控制台输出 | 字符串操作 | 栈内存字符串对象 | string* )
文章目录 C++ 字符串 对象 C++ 字符串 对象 创建方法 C++ 字符串 对象 输出到控制台 C++ 字符串 拼接 C++ 字符串 方法调用 ( 栈内存对象 ) C++ 字符串 方法调用 ( 堆 ...
- js字符串string转object对象 - 方法篇
js字符串string转object对象 - 方法篇 背景: 有时候后台返回的是map类型.或者json类型: 但是前端发现接收到的数据类型是string类型: (3种)方法如下: 将字符串strin ...
- js对象(Object)和字符串(String)互转 - 代码篇
文章目录 js对象(Object)和字符串(String):相互转化 1. 利用原生JSON对象,将对象转为字符串 截图如下: 2. 从JSON字符串转为对象 相关文章:[localstorage本地 ...
- freemarker 数组转字符串_TypeScript 实战算法系列(一):实现数组栈与对象栈
本文由图雀社区认证作者 神奇的程序员 写作而成,图雀社区将连载其TypeScript 实战算法系列,点击阅读原文查看作者的掘金链接,感谢作者的优质输出,让我们的技术世界变得更加美好? 前言 栈作为一种 ...
- 冒泡排序和字符串(String)对象及处理字符串的方法
冒泡排序 第一种方法var times=0;var arr=[12,3,6,9,77,37];for(var i=0;i<arr.length-1;i++){ //控制比较的行数for (var ...
- js 字符串String转对象Object
想要传递对象object,但是一直都是字符串String,因此需要字符串String转对象Object var stt = '1.2,2,3,4,5'; // 转换成字符串类型console.log( ...
- SpringCloud Alibaba实战第八课 缓存设计、网关认证、重构策略
19 性能为王:微服务架构中的多级缓存设计 前一讲我们学习了利用 Seata 构建微服务环境的分布式事务架构,通过完整的案例也了解了 Seata 的执行过程. 本讲咱们探讨缓存这个话题,看在微服务环境 ...
最新文章
- 电脑录屏工具_屏幕录制工具有哪些?这些录屏软件须知
- TensorRT was linked against cuBLAS/cuBLAS LT 11.2.0 but loaded cuBLAS/cuBLAS
- c++ 公有继承的赋值兼容规则
- centos安装python3小白_Centos7 安装Python3
- 【人物】徐小平:既然做老大,你就得让兄弟们有肉吃
- Facebook有1万名员工在研发AR/VR设备 占员工总数近1/5
- 经典重温:FAIR提出SlowFast,用双分支非对称网络处理不同采样率的视频!代码开源!...
- linux slf4j找不到,slf4j+log4j2在tomcat8 下无日志输出
- 【重点】LeetCode 25. Reverse Nodes in k-Group
- 多线程之线程通信条件Condition二
- Introduction to Computer Networking学习笔记(十二):Retransmission Strategies重传策略
- emmagee的基本使用
- Linux内核学习(三)应用层和内核
- LaTex 常用数学公式符号速记
- 批量下载Landsat快视图,为批量下载Landsat Level1数据做准备
- 泊松分布和指数分布,包你学会
- [朴智妍][또르르][轱辘轱辘]
- Android studio安卓虚拟机无法启动
- ZCMU-1428: Bit++ (水)
- 人人车严选店成都首店开业 占地面积1.2万平米
热门文章
- vsscanf用法解析
- vcm驱动芯片原理_手机摄像头VCM音圈马达,原理、结构
- 网易邮箱大师使用排雷
- 哔哩哔哩助手:玩转B站、全速下载、夜间模式、画中画 等功能
- science图表_Science和Nature大部分图表都出自这款绘图软件,了解一下?
- 卡巴斯基 (Kaspersky) V7.0.0.43 NCT BATE 汉化免激活特别版(附2009-12-23Key)
- php递归实例,php递归经典案例
- 移动开发技术(Android)——实验1 Android开发环境搭建及简单程序实现
- 日志分析软件 Splunk
- centos中使用goaccess分析nginx日志,goaccess分析多个nginx日志