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实战之商品对象缓存管理之新增与获取详情相关推荐

  1. Redis实战(2)-数据结构之字符串String实战之存储对象

    概述:本系列博文所涉及的相关内容来源于debug亲自录制的实战课程:缓存中间件Redis技术入门与应用场景实战(SpringBoot2.x + 抢红包系统设计与实战),感兴趣的小伙伴可以点击自行前往学 ...

  2. 22-09-20 西安 谷粒商城(04)Redisson做分布式锁、布隆过滤器、AOP赋能、自定义注解做缓存管理、秒杀测试

    Redisson 1.Redisson做分布式锁  分布式锁主流的实现方案: 基于数据库实现分布式锁 基于缓存(Redis),性能最高 基于Zookeeper,可靠性最高 Redisson是一个在Re ...

  3. R语言unlist函数将复杂数据(list列表、dataframe、字符串String)对象处理成简单向量vector形式:将包含dataframe和字符串的向量列表转换为单个向量(删除数据名称)

    R语言unlist函数将复杂数据(list列表.dataframe.字符串String)对象处理成简单向量vector形式:将包含dataframe和字符串的向量列表转换为单个向量(删除数据名称) 目 ...

  4. 【C++ 语言】C++字符串 ( string 类 | 创建方法 | 控制台输出 | 字符串操作 | 栈内存字符串对象 | string* )

    文章目录 C++ 字符串 对象 C++ 字符串 对象 创建方法 C++ 字符串 对象 输出到控制台 C++ 字符串 拼接 C++ 字符串 方法调用 ( 栈内存对象 ) C++ 字符串 方法调用 ( 堆 ...

  5. js字符串string转object对象 - 方法篇

    js字符串string转object对象 - 方法篇 背景: 有时候后台返回的是map类型.或者json类型: 但是前端发现接收到的数据类型是string类型: (3种)方法如下: 将字符串strin ...

  6. js对象(Object)和字符串(String)互转 - 代码篇

    文章目录 js对象(Object)和字符串(String):相互转化 1. 利用原生JSON对象,将对象转为字符串 截图如下: 2. 从JSON字符串转为对象 相关文章:[localstorage本地 ...

  7. freemarker 数组转字符串_TypeScript 实战算法系列(一):实现数组栈与对象栈

    本文由图雀社区认证作者 神奇的程序员 写作而成,图雀社区将连载其TypeScript 实战算法系列,点击阅读原文查看作者的掘金链接,感谢作者的优质输出,让我们的技术世界变得更加美好? 前言 栈作为一种 ...

  8. 冒泡排序和字符串(String)对象及处理字符串的方法

    冒泡排序 第一种方法var times=0;var arr=[12,3,6,9,77,37];for(var i=0;i<arr.length-1;i++){ //控制比较的行数for (var ...

  9. js 字符串String转对象Object

    想要传递对象object,但是一直都是字符串String,因此需要字符串String转对象Object var stt = '1.2,2,3,4,5'; // 转换成字符串类型console.log( ...

  10. SpringCloud Alibaba实战第八课 缓存设计、网关认证、重构策略

    19 性能为王:微服务架构中的多级缓存设计 前一讲我们学习了利用 Seata 构建微服务环境的分布式事务架构,通过完整的案例也了解了 Seata 的执行过程. 本讲咱们探讨缓存这个话题,看在微服务环境 ...

最新文章

  1. 电脑录屏工具_屏幕录制工具有哪些?这些录屏软件须知
  2. TensorRT was linked against cuBLAS/cuBLAS LT 11.2.0 but loaded cuBLAS/cuBLAS
  3. c++ 公有继承的赋值兼容规则
  4. centos安装python3小白_Centos7 安装Python3
  5. 【人物】徐小平:既然做老大,你就得让兄弟们有肉吃
  6. Facebook有1万名员工在研发AR/VR设备 占员工总数近1/5
  7. 经典重温:FAIR提出SlowFast,用双分支非对称网络处理不同采样率的视频!代码开源!...
  8. linux slf4j找不到,slf4j+log4j2在tomcat8 下无日志输出
  9. 【重点】LeetCode 25. Reverse Nodes in k-Group
  10. 多线程之线程通信条件Condition二
  11. Introduction to Computer Networking学习笔记(十二):Retransmission Strategies重传策略
  12. emmagee的基本使用
  13. Linux内核学习(三)应用层和内核
  14. LaTex 常用数学公式符号速记
  15. 批量下载Landsat快视图,为批量下载Landsat Level1数据做准备
  16. 泊松分布和指数分布,包你学会
  17. [朴智妍][또르르][轱辘轱辘]
  18. Android studio安卓虚拟机无法启动
  19. ZCMU-1428: Bit++ (水)
  20. 人人车严选店成都首店开业 占地面积1.2万平米

热门文章

  1. vsscanf用法解析
  2. vcm驱动芯片原理_手机摄像头VCM音圈马达,原理、结构
  3. 网易邮箱大师使用排雷
  4. 哔哩哔哩助手:玩转B站、全速下载、夜间模式、画中画 等功能
  5. science图表_Science和Nature大部分图表都出自这款绘图软件,了解一下?
  6. 卡巴斯基 (Kaspersky) V7.0.0.43 NCT BATE 汉化免激活特别版(附2009-12-23Key)
  7. php递归实例,php递归经典案例
  8. 移动开发技术(Android)——实验1 Android开发环境搭建及简单程序实现
  9. 日志分析软件 Splunk
  10. centos中使用goaccess分析nginx日志,goaccess分析多个nginx日志