Springboot集成redis实现热点数据排行榜(每点击一次增加一次热度,按照热度查询排名前十的数据)

文章目录

    • 应用场景
    • 环境
    • 代码实现

应用场景

基于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);
    }
  • 22
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Spring Boot项目中使用Redis实现博客热度排行榜,可以使用Spring Data Redis提供的RedisTemplate来操作Redis。具体实现步骤如下: 1. 添加Redis依赖 在pom.xml文件中添加Spring Data Redis依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> ``` 2. 配置Redis连接信息 在application.properties中配置Redis连接信息: ```properties spring.redis.host=127.0.0.1 spring.redis.port=6379 spring.redis.password= ``` 3. 实现博客热度计算逻辑 在业务逻辑中,根据阅读数、点赞数、评论数等指标计算博客的热度值,使用RedisTemplate的opsForZSet()方法将博客ID和热度值存储到有序集合中,并使用ZINCRBY命令更新热度值。例如: ```java @Autowired private RedisTemplate<String, Object> redisTemplate; public void updateBlogScore(String blogId, int readCount, int likeCount, int commentCount) { // 计算博客热度值 double score = readCount * 0.1 + likeCount * 0.3 + commentCount * 0.5; // 将博客ID和热度值存储到有序集合中 redisTemplate.opsForZSet().add("blog_scores", blogId, score); // 使用ZINCRBY命令更新热度redisTemplate.opsForZSet().incrementScore("blog_scores", blogId, score); } ``` 4. 实现博客热度排行榜查询逻辑 在业务逻辑中,可以使用RedisTemplate的opsForZSet()方法按照热度值从高到低获取博客ID列表,并使用Java Stream API按照热度值排序。例如: ```java public List<String> getBlogRankList() { Set<String> blogIds = redisTemplate.opsForZSet().reverseRange("blog_scores", 0, -1); return blogIds.stream().collect(Collectors.toList()); } ``` 5. 设置博客热度排行榜过期时间 在Redis中设置博客热度排行榜的过期时间,可以使用RedisTemplate的opsForZSet()方法设置Sorted Set的过期时间。例如: ```java redisTemplate.expire("blog_scores", 3600, TimeUnit.SECONDS); // 设置排行榜数据1小时过期 ``` 这样就可以在Spring Boot项目中使用Redis实现博客热度排行榜啦!
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值