文章目录
-
- 应用场景
- 环境
- 代码实现
应用场景
基于Springboot3 集成redis实现热点数据排行榜,每点击一次数据增加一次热度,按照热度查询前十的数据,数据最高到最低排序
在Redis中,可以使用ZSet(有序集合)来存储排行榜数据,其中成员是数据的唯一标识,分数是数据的热度值。每次点击后,更新对应成员的分数即可实现热度增加。
列如微博排行榜、最火热商品等
环境
Springboot3.0.3
Redis
mybatis
MySQL
代码实现
引入依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
</dependencies>
编写配置
spring:
data:
# redis 配置
redis:
host: 127.0.0.1
port: 6379
database: 0
# password: 123456
timeout: 10s
lettuce:
pool:
# 连接池中的最小空闲连接
min-idle: 0
# 连接池中的最大空闲连接
max-idle: 8
# 连接池的最大数据库连接数
max-active: 8
# #连接池最大阻塞等待时间(使用负值表示没有限制)
max-wait: -1ms
# elasticsearch:
# repositories:
# enabled: true
redis数据预热
@Autowired
private StringRedisTemplate stringRedisTemplate;
@Autowired
private ITzBusinessGoodsService tzBusinessGoodsService;
@PostConstruct
public void redisInit() {
// 将自己的业务数据先存入Redis中完成预热
List<TzBusinessGoods> tzBusinessGoodsDtos = tzBusinessGoodsService.
selectTzBusinessGoodsList(new TzBusinessGoods());
for (TzBusinessGoods tzBusinessGoodsDto : tzBusinessGoodsDtos) {
stringRedisTemplate.opsForZSet().incrementScore("product:rank", String.valueOf(tzBusinessGoodsDto.getGoodsId()), 0);
}
}
在点击详细的方法中实现热点数据热度 +1
@GetMapping(value = "/{goodsId}")
public AjaxResult getInfo(@PathVariable("goodsId") Long goodsId) {
stringRedisTemplate.opsForZSet().incrementScore("product:rank", goodsId.toString(), 1);
return success(tzBusinessGoodsService.selectTzBusinessGoodsByGoodsId(goodsId));
}
查询总数据
@Autowired
private StringRedisTemplate stringRedisTemplate;
@GetMapping("/list")
public TableDataInfo wxList(TzBusinessGoods tzBusinessGoods) {
startPage();
Set<ZSetOperations.TypedTuple<String>> hotnessRanking = stringRedisTemplate.opsForZSet().reverseRangeWithScores("product:rank", 0, 9);
List<TzBusinessGoods> resultList = new ArrayList<>();
for (ZSetOperations.TypedTuple<String> tuple : hotnessRanking) {
String productId = tuple.getValue();
tzBusinessGoods.setGoodsId(Long.parseLong(productId));
// 根据 productId 查询 TzBusinessGoods 对象,这里假设有一个方法 getProductById 可以根据 productId 获取对应的 TzBusinessGoods 对象
TzBusinessGoods goods = tzBusinessGoodsService.selectTzBusinessGoodsByAll(tzBusinessGoods);
if (goods != null) {
// 设置商品的热度分数
resultList.add(goods);
}
}
// List<TzBusinessGoods> list = tzBusinessGoodsService.selectTzBusinessGoodsList(tzBusinessGoods);
// System.out.println("list = " + list);
return getDataTable(resultList);
}