上一篇写了 Redis 的 hash 实现购物车,Redis 其他的数据类型也很好用。比如说 zset,zset 每个元素都会关联一个score,由于 score 这个特殊的存在,它可以用在任何与排序有关的场景,如 排行榜、热搜商品等等
[TOC]
zset
介绍
zset 类似 set,但它的每一个元素都关联一个叫 score 的浮点数值; zset 可以通过 score 进行排序(包括正序和倒序)。我们可以通过对指定元素的score 进行修改来改变该元素的排名。zset 的成员是唯一的,但 score(分数)可以重复。
zset 的命令很多,这篇用到了两个 zincrby、zrevrange。
Redis 命令 |
Spring Data Redis | 描述 |
|---|---|---|
zincrby key increment member |
Double incrementScore(K key, V value, double delta) |
给指定元素的 score 加delta |
zrevrange key max min [WITHSCORES] [LIMIT offset count] |
Set<V> reverseRangeByScore(K key, double min, double max, long offset, long count) |
从表头到表尾遍历 ziplist 或 skiplist,返回给定索引范围内的元素 |
编码
zset 的底层编码是ziplist 或 skiplist
当有序集合对象可以同时满足以下两个条件时,对象使用 ziplist 编码:
- 有序集合保存的元素数量小于 128 个;
- 有序集合保存的所有元素成员的长度都小于 64 位。
不能同时满足上面两个条件则使用 skiplist 编码。当 zset 使用 skiplist 编码时,zset 对象包含一个字典(dict)和一个跳跃表(skiplist)。
环境/版本一览:
- 开发工具:Intellij IDEA 2019.1.3
- springboot: 2.1.7.RELEASE
- jdk:1.8.0_171
- maven:3.3.9
- mybatis-plus:3.1.2
- mysql-connector-java:5.1.47
1、pom.xml
1 | <dependencies> |
2、application.yml
1 | spring: |
3、sql
1 | CREATE DATABASE /*!32312 IF NOT EXISTS*/`chapter30` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_bin */; |
4、common
constants
1 | package com.fatal.common.constants; |
enums
1 | package com.fatal.common.enums; |
5、config
1 | package com.fatal.config; |
6、entity
1 | package com.fatal.entity; |
7、dto
1 | package com.fatal.dto; |
8、mapper
1 | package com.fatal.mapper; |
9、service
IGoodsService.java
1 | package com.fatal.service; |
IHotSearchService.java
1 | package com.fatal.service; |
GoodsServiceImpl.java
1 | package com.fatal.service.impl; |
HotSearchServiceImpl.java
1 | package com.fatal.service.impl; |
10、Test
GoodsMapperTest.java
1 | package com.fatal.mapper; |
IGoodsServiceTest.java
1 | package com.fatal.service; |
IHotSearchServiceTest.java
1 | package com.fatal.service; |
11、测试
测试整合 MP
运行 IGoodsServiceTest.selectListTest()

测试查看商品详情
初始化数据
运行 IHotSearchServiceTest.init()

查看商品详情,商品热搜度 +1
运行 IGoodsServiceTest.getDetails()
控制台正常

Redis 视图化界面

测试查看热搜商品列表
由于测试数据较少,所以我设置了 TOP 数量为 4
不带 score
运行 IHotSearchServiceTest.hotSearchListTest()
控制台

带 score
运行 IHotSearchServiceTest.hotSearchWithScoreListTest()
控制台

参考资料
总结
SpringBoot的知识已经有前辈在我们之前探索了。比较喜欢的博主有:唐亚峰 | Battcn、方志朋的专栏、程序猿DD、纯洁的微笑。对这门技术感兴趣的可以去他们的博客逛逛。谢谢他们的分享~~
以上文章是我用来学习的Demo,都是基于 SpringBoot2.x 版本。
源码地址: https://github.com/ynfatal/springboot2-learning/tree/master/chapter30