美文网首页程序员
Redis实现用户热词推荐

Redis实现用户热词推荐

作者: 3c69b7c624d9 | 来源:发表于2017-12-12 22:43 被阅读37次

    背景

    前一段时间实施反馈来了新的需求 用户不希望太多的品牌选择希望做个性化的推荐

    比如品牌需要根据登录用户的点击数排序

    小伙伴实现了一个版本 【基于数据库】

    但是如果换成使用Redis如何实现呢?

    首先要做的是选择合适的数据结构

    分析

    如上需求需要根据不同的用户来使用不同的推荐不同的品牌

    可以确定相同的品牌对于同一个用户应该出现一次【使用redis可以减少许多并发问题】

    我们考虑对于系统来说 需要进行排序 因此考虑使用有序集合 即zset

    我们需要先来设计对应存储的key

    我们设计如下的key:

        f6car:brand:hot:123456789:qixiaobo
    

    通常来说redis建议使用:来做为key的切分 我们以f6car:brand:hot作为前缀

    123456789为对应的idOwnOrg 祁晓波为用户名

    当用户对于carzone品牌进行点击时我们执行一个异步请求为

        ZINCRBY f6car:brand:hot:123456789:qixiaobo 1 carzone
    

    这个不需要考虑有否初始值 比如我们连续执行多次后结果如下

        127.0.0.1:6379> ZINCRBY f6car:brand:hot:123456789:qixiaobo 1 carzone
        "1"
        127.0.0.1:6379> ZINCRBY f6car:brand:hot:123456789:qixiaobo 1 carzone
        "2"
        127.0.0.1:6379> ZINCRBY f6car:brand:hot:123456789:qixiaobo 1 carzone
        "3"
        127.0.0.1:6379> ZINCRBY f6car:brand:hot:123456789:qixiaobo 1 carzone
        "4"
        127.0.0.1:6379> ZINCRBY f6car:brand:hot:123456789:qixiaobo 1 carzone
        "5"
        127.0.0.1:6379> ZINCRBY f6car:brand:hot:123456789:qixiaobo 1 carzone
        "6"
        127.0.0.1:6379> ZINCRBY f6car:brand:hot:123456789:qixiaobo 1 carzone
        "7"
    
        127.0.0.1:6379> ZINCRBY f6car:brand:hot:123456789:qixiaobo 1 f6car
        "1"
        127.0.0.1:6379> ZINCRBY f6car:brand:hot:123456789:qixiaobo 1 f6car
        "2"
        127.0.0.1:6379> ZINCRBY f6car:brand:hot:123456789:qixiaobo 1 f6car
        "3"
        127.0.0.1:6379> ZINCRBY f6car:brand:hot:123456789:qixiaobo 1 f6car
        "4"
        127.0.0.1:6379> ZINCRBY f6car:brand:hot:123456789:qixiaobo 1 f6car
        "5"
    

    而对于mysql我们需要先查询再插入很容易造成并发问题 出现两个同样的品牌

    当我们需要获取对应用户的点击情况只需要

        127.0.0.1:6379> ZREVRANGE f6car:brand:hot:123456789:qixiaobo 0 -1
        1) "carzone"
        2) "f6car"
    
    ZREVRANGE表示按照score从大到小排序
    

    其中-1 表示不限制长度【即全部数据】

    当我们需要查询个数的限制时我们可以

        127.0.0.1:6379> ZREVRANGE f6car:brand:hot:123456789:qixiaobo 0 0
        1) "carzone"
    

    如果需要返回分数我们也可以使用

        127.0.0.1:6379> ZREVRANGE f6car:brand:hot:123456789:qixiaobo 0 0 WITHSCORES
        1) "carzone"
        2) "7"
    

    如此就简单快捷的完成了品牌推荐

    相关文章

      网友评论

        本文标题:Redis实现用户热词推荐

        本文链接:https://www.haomeiwen.com/subject/tpsoixtx.html