Redis存储商品热度

项目中有一个需求,就是可以根据商品的热度进行排序

  • 起初想着使用string类型来存储如:
    sku:hotscore:商品的ID
    但是这回有个问题,当商品数量多了那k-v岂不是得炸了,维护起来也非常不方便

  • 推荐做法:使用Redis的ZSET类型

/**
     * 给商品添加热度
     *
     * @param skuId
     */
    @Override
    public void incrHotScore(Long skuId) {
        // 点击一次redis热度就+1
        Double score = stringRedisTemplate.opsForZSet().incrementScore(RedisConstants.SKU_HOTSCORE,
                skuId.toString(), 1);
        if (score % 100 == 0) {
            // 分数达到了100就保存到es一次,避免每次都连接es存储,浪费性能
            searchFeignClient.updateHotScore(skuId, score.longValue());
        }
    }
/**
     * 更新商品热度分
     *
     * @param skuId
     * @param score
     */
    @Override
    public void updateHotScore(Long skuId, Long score) {

        Optional<Goods> optional = goodsMapper.findById(skuId);
        Goods goods = optional.get();
        goods.setHotScore(score);
        // 修改
        goodsMapper.save(goods);
        log.info("热度分已更新:{}", score);
    }

image

结果

image

posted @   我也有梦想呀  阅读(202)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示