概述:本系列博文所涉及的相关内容来源于debug亲自录制的实战课程:缓存中间件Redis技术入门与应用场景实战(SpringBoot2.x + 抢红包系统设计与实战),感兴趣的小伙伴能够点击自行前往学习(毕竟以视频的形式来掌握技术 会更快!) ,文章所属专栏:缓存中间件Redis技术入门与实战html
摘要:电商平台的管理后端通常有两大角色的用户能够使用,一个是系统管理员,一个是平台的卖家/商家,对于商家而言,管理自个儿的商品是平常工做中再为普通不过的事情了,本文咱们将以“有序存储并展现电商平台中商家上传的各式各样的商品列表”,这里的关键词是“有序存储与展现”,咱们将借助缓存中间件Redis的数据结构~列表List进行实战实现!java
内容:对于Redis的数据结构~列表List,在实际的项目开发实战中,也算是其中一种比较常见、应用也比较普遍的数据结构吧!其底层数据存储结构跟JavaSE集合体系的List有极其类似之处,即数据在底层是有序、排好顺序的,在将列表的数据获取出来的时候,会发现其中的数据确实是已经排好顺序的了,给你们绘制了一个简单的List的存储和获取流程图,以下所示:git
从该图中,能够看出,当咱们往Redis的列表List中添加数据时,具备“先进先出”的特性,即所谓的“FIFO”(有点队列Queue的特性!),并且数据是紧凑、一个挨着一个存储的!即当咱们在往缓存Redis的列表List添加数据时,能够采用“LPush 即从左边的方向添加”的方式往缓存Redis的List中添加,而后再采用“LPop 即从左边的方向弹出数据”或者“RPop 即从右边的方向弹出数据”的方式获取这一有序存储的列表数据!web
知道了列表List的数据存储和读取流程,其实咱们也就几乎知晓了在实际的项目实战开发中的代码实现了。下面咱们以“电商平台~商家添加/下架商品时如何将其商品列表有序存储至缓存Redis的List中,每次获取商家当前的商品列表时能够直接从缓存中读取,减小每一个商家在每次登录以后都须要走数据库DB频繁查询 所带来的压力!”redis
(1)首先,固然是须要来个“产品信息表”啦,其完整的DDL(即数据定义语言)以下所示:sql
CREATE TABLE `product` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) CHARACTER SET utf8mb4 NOT NULL COMMENT '商品名称', `user_id` int(11) NOT NULL COMMENT '所属商户id', `scan_total` int(255) DEFAULT NULL COMMENT '浏览量', `is_active` tinyint(255) DEFAULT '1' COMMENT '是否有效', PRIMARY KEY (`id`), KEY `indx_scan_total` (`scan_total`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='商户商品表';
(2)而后,固然是须要开发一个Controller啦,在该Controller中咱们须要开设两个请求方法,一个是给商户使用的“添加商品”(进DB,并塞入Redis),另一个是获取当前商户已添加的“商品列表”,其完整的源代码以下所示: 数据库
/** * 列表List实战-商户商品列表存储 * @Author:debug (SteadyJack) * @Link: weixin-> debug0868 qq-> 1948831260 * @Date: 2019/10/30 20:58 **/ @RestController @RequestMapping("list") public class ListController extends AbstractController{ @Autowired private ListService listService; //添加 @RequestMapping(value = "put",method = RequestMethod.POST,consumes = MediaType.APPLICATION_JSON_UTF8_VALUE) public BaseResponse put(@RequestBody Product product,BindingResult result){ BaseResponse response=new BaseResponse(StatusCode.Success); try { log.info("--商户商品信息:{}",product); response.setData(listService.addProduct(product)); }catch (Exception e){ log.error("--List实战-商户商品-添加-发生异常:",e.fillInStackTrace()); response=new BaseResponse(StatusCode.Fail.getCode(),e.getMessage()); } return response; } //获取列表详情 @RequestMapping(value = "get",method = RequestMethod.GET) public BaseResponse get(@RequestParam("userId") final Integer userId){ BaseResponse response=new BaseResponse(StatusCode.Success); try { response.setData(listService.getHistoryProducts(userId)); }catch (Exception e){ log.error("--List实战-商户商品-获取列表-发生异常:",e.fillInStackTrace()); response=new BaseResponse(StatusCode.Fail.getCode(),e.getMessage()); } return response; } }
(3)紧接着,咱们须要开发Controller对应的Service,其职责固然是用来处理真正的业务逻辑,“添加商品”时,它负责将该商品信息添加进DB数据库,并添加进缓存Redis中;“获取商品”时,天然而然是从缓存Redis获取出List列表数据,其完整的源代码以下所示: 后端
/** * 列表List服务 * @Author:debug (SteadyJack) * @Link: weixin-> debug0868 qq-> 1948831260 * @Date: 2019/10/30 9:48 **/ @Service public class ListService { public static final Logger log= LoggerFactory.getLogger(ListService.class); @Autowired private ProductMapper productMapper; @Autowired private RedisTemplate redisTemplate; //添加商品 @Transactional(rollbackFor = Exception.class) public Integer addProduct(Product product) throws Exception{ if (product!=null){ product.setId(null); //将该商品塞入数据库DB中 productMapper.insertSelective(product); Integer id=product.getId(); if (id>0){ //将该商品塞入缓存Redis中 this.pushRedisService(product); } return id; } return -1; } //TODO:往缓存中塞信息-能够抽取到ListRedisService private void pushRedisService(final Product product) throws Exception{ ListOperations<String,Product> listOperations=redisTemplate.opsForList(); listOperations.leftPush(Constant.RedisListPrefix+product.getUserId(),product); } //获取历史发布的商品列表 public List<Product> getHistoryProducts(final Integer userId) throws Exception{ List<Product> list= Lists.newLinkedList(); ListOperations<String,Product> listOperations=redisTemplate.opsForList(); final String key=Constant.RedisListPrefix+userId; //TODO:倒序->userID=10010 ->Rabbitmq入门与实战,Redis入门与实战,SpringBoot项目实战 list=listOperations.range(key,0,listOperations.size(key)); log.info("--倒序:{}",list); //TODO:顺序->userID=10010 ->SpringBoot项目实战,Redis入门与实战,Rabbitmq入门与实战 //Collections.reverse(list); //log.info("--顺序:{}",list); //TODO:弹出来移除的方式 //Product entity=listOperations.rightPop(key); //while (entity!=null){ //list.add(entity); //entity=listOperations.rightPop(key); //} return list; } }
(4)至此,咱们的代码实战就完毕了,最后咱们就基于Postman进入测试环节吧,咱们给商户10010添加两个商品吧,以下所示:缓存
完成以后还能够前往数据库Mysql中查看刚刚已经添加完成的商品列表,以下图所示:数据结构
最后,咱们再在Postman发起“获取当前商户已经添加完成的商品列表-有序展现”(能够经过修改代码的方式,实现“顺序”、“倒序”等功效),以下所示:
好了,本篇文章咱们就介绍到这里了,建议各位小伙伴必定要照着文章提供的样例代码撸一撸,只有撸过才能知道这玩意是咋用的,不然就成了“空谈者”!对Redis相关技术栈以及实际应用场景实战感兴趣的小伙伴能够我们51cto学院 debug亲自录制的课程进行学习:缓存中间件Redis技术入门与应用场景实战(SpringBoot2.x + 抢红包系统设计与实战)
补充:
一、本文涉及到的相关的源代码能够到此地址,check出来进行查看学习:https://gitee.com/steadyjack/SpringBootRedis
二、目前debug已将本文所涉及的内容整理录制成视频教程,感兴趣的小伙伴能够前往观看学习:https://edu.51cto.com/course/20384.html