程序员

Redis实现用户热词推荐

2017-12-12  本文已影响37人  3c69b7c624d9

背景

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

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

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

但是如果换成使用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"

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

上一篇下一篇

猜你喜欢

热点阅读