当前位置: 首页 > news >正文

List结构之非实时榜单实战

像京东、淘宝等电商系统一般都会有热销的商品榜单,比如热销手机榜单,热销电脑榜单,这些都是非实时的榜单。为什么是非实时的呢?因为完全实时的计算和排序对于资源消耗较大,尤其是当涉及大量交易数据时。

一般来说,热销榜单的数据并不是即时更新的,电商平台会采用定时任务或者批量处理的方式来更新榜单数据,例如每小时或每天更新一次。这样做既保证了榜单的新鲜度,又不至于给系统带来过大的负担。

因此我们实现非实时榜单,一般是通过定时调度和大数据处理,去拉取数据计算榜单,之后通过redis的list结构将数据放到redis,当用户访问时,会将榜单查询出来。

下面我们来实战一下非实时榜单!

首先我们先假设一些热销数据放入redis中:

@Test
	public void saveRank(){
		String DAILY_RANK_KEY = "video:rank:daily";

		VideoDO videoDO1 = new VideoDO(1,"Java基础","hhhh",1000);
		VideoDO videoDO2 = new VideoDO(2,"Java web","xxxxx",20000);
		VideoDO videoDO3 = new VideoDO(3,"Springboot","lllll",3000);
		VideoDO videoDO4 = new VideoDO(4,"Springclound","oooo",4000);

//插入的顺序是videoDO1,videoDO2,videoDO3,videoDO4	redisTemplate.opsForList().leftPushAll(DAILY_RANK_KEY,videoDO4,videoDO3,videoDO1,videoDO1);
	}

 接着我们将redis中所有的热销数据查询出来:

@RestController
@RequestMapping("api/v1/rank")
public class RankController {
    @Autowired
    private RedisTemplate redisTemplate;
    public static final String DAILY_RANK_KEY = "video:rank:daily";

    @RequestMapping("daily_rank")
    public JsonData videoDailyRank(){
        List<VideoDO> list = redisTemplate.opsForList().range(DAILY_RANK_KEY, 0, -1);
        return JsonData.buildSuccess(list);
    }
}

我们可以看到结果跟我们插入的顺序一样:

{
  "code": 0,
  "data": [
    {
      "id": 1,
      "title": "Java基础",
      "img": "hhhh",
      "price": 1000
    },
    {
      "id": 2,
      "title": "Java web",
      "img": "xxxxx",
      "price": 20000
    },
    {
      "id": 3,
      "title": "Springboot",
      "img": "lllll",
      "price": 3000
    },
    {
      "id": 4,
      "title": "Springclound",
      "img": "oooo",
      "price": 4000
    }
  ],
  "msg": null
}

当然如果我们需要替换掉其中某个数据也是可以哒。

假设我们要将Springboo这个视频换成面试专题的视频:

@Test
	public void replaceRank(){
		String DAILY_RANK_KEY = "video:rank:daily";
		VideoDO video = new VideoDO(10,"面试专题","yyyy",10000);
        //将DAILY_RANK_KEY的第2的索引位置的视频换成video视频
		redisTemplate.opsForList().set(DAILY_RANK_KEY,2,video);
	}

 结果如下:

{
  "code": 0,
  "data": [
    {
      "id": 1,
      "title": "Java基础",
      "img": "hhhh",
      "price": 1000
    },
    {
      "id": 2,
      "title": "Java web",
      "img": "xxxxx",
      "price": 20000
    },
    {
      "id": 10,
      "title": "面试专题",
      "img": "yyyy",
      "price": 10000
    },
    {
      "id": 4,
      "title": "Springclound",
      "img": "oooo",
      "price": 4000
    }
  ],
  "msg": null
}

 

http://www.dtcms.com/a/112353.html

相关文章:

  • Nginx配置伪静态,URL重写
  • 通过 ModelScope 下载模型,解决sentence-transformers/all-MiniLM-L6-v2无法下载问题
  • 【leetcode100】数组中的第K个最大元素
  • Scala 面向对象编程总结
  • 【虚拟机VMware】银河麒麟系统虚拟机:网络异常处理
  • FrameWork基础案例解析(四)
  • HTTPS 之fiddler抓包--jmeter请求
  • Dynamics 365 Business Central Subscription Recurring Billing 订阅和分期付款详解
  • winRAR禁止广告弹窗
  • Elixir语言的消息队列
  • 进程和线程的概念及Linux操作
  • 解释区块链技术的应用场景和优势
  • 【实战】如何基于 Python Flask 快速开发一个支持 OpenAI 流式接口的 LLM Server
  • 【MySQL】01.MySQL环境安装
  • O(1) 时间复杂度数据设计题
  • 我考研拟录取=稳了吗?
  • Element-plus弹出框popover,使用自定义的图标选择组件
  • sqlalchemy查询json
  • STM32CubeMX-H7-11-IIC读写MPU6050模块(上)-软件IIC协议的解析、封装,实现基本功能获取MPU6050的ID
  • 结肠镜3D视频数据集-C3VD论文中文版
  • 构建自己的私有 Git 服务器:基于 Gitea 的轻量化部署实战指南
  • 2025年3月 Scratch 图形化(二级)真题解析 中国电子学会全国青少年软件编程等级考试
  • 当 “原子” 遇上 “光腔”:量子计算的新舞台
  • 前端页面鼠标移动监控(鼠标运动、鼠标监控)鼠标防抖处理、mousemove、debounce()、事件停止触发、超时触发
  • 博途之S7通讯
  • 仿小红书社交源码+及时通讯聊天软件APP源码
  • Springboot面试篇
  • 三维扫描助力文化遗产数字化保护
  • [特殊字符] 使用 Handsontable 构建一个支持 Excel 公式计算的动态表格
  • 【调研】YOLO算法在FPGA/ZYNQ上的部署与加速