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"
如此就简单快捷的完成了品牌推荐