百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

Redis实战(3)-数据结构List实战一之商品信息的有序存储

toyiye 2024-05-25 20:11 18 浏览 0 评论

摘要

电商平台的管理后端一般有两大角色的用户可以使用,一个是系统管理员,一个是平台的卖家/商家,对于商家而言,管理自个儿的商品是日常工作中再为普通不过的事情了,本文我们将以"有序存储并展示电商平台中商家上传的各式各样的商品列表",这里的关键词是"有序存储与展示",我们将借助缓存中间件Redis的数据结构~列表List进行实战实现!


内容

对于Redis的数据结构~列表List,在实际的项目开发实战中,也算是其中一种比较常见、应用也比较广泛的数据结构吧!

其底层数据存储结构跟JavaSE集合体系的List有极其相似之处,即数据在底层是有序、排好顺序的,在将列表的数据获取出来的时候,会发现其中的数据确实是已经排好顺序的了,给大家绘制了一个简单的List的存储和获取流程图,如下所示:


从该图中,可以看出,当我们往Redis的列表List中添加数据时,具有"先进先出"的特性,即所谓的"FIFO"(有点队列Queue的特性!),而且数据是紧凑、一个挨着一个存储的!

即当我们在往缓存Redis的列表List添加数据时,可以采用"LPush 即从左边的方向添加"的方式往缓存Redis的List中添加,然后再采用"LPop 即从左边的方向弹出数据"或者"RPop 即从右边的方向弹出数据"的方式获取这一有序存储的列表数据!

知道了列表List的数据存储和读取流程,其实我们也就几乎知晓了在实际的项目实战开发中的代码实现了。

下面我们以"电商平台~商家添加/下架商品时如何将其商品列表有序存储至缓存Redis的List中,每次获取商家当前的商品列表时可以直接从缓存中读取,减少每个商家在每次登陆之后都需要走数据库DB频繁查询 所带来的压力!"

(1)首先,当然是需要来个"产品信息表"啦,其完整的DDL(即数据定义语言)如下所示:

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相关技术栈以及实际应用场景实战感兴趣的小伙伴可以前往Debug搭建的技术社区的课程中心进行学习观看: !

其他相关的技术,感兴趣的小伙伴可以关注底部Debug的技术公众号,或者加Debug的微信,拉你进"微信版"的真正技术交流群!一起学习、共同成长!

相关推荐

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

什么是 JSON:详解 JSON 及其优势(什么叫json)

现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

PostgreSQL JSON 类型:处理结构化数据

PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

JavaScript:JSON、三种包装类(javascript 包)

JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

Python数据分析 只要1分钟 教你玩转JSON 全程干货

Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

比较一下JSON与XML两种数据格式?(json和xml哪个好)

JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码