利用Redis的有序集合做购物车商品相关性分析

标签: 利用 redis 有序集合 | 发表时间:2016-03-03 18:41 | 作者:
出处:http://m635674608.iteye.com

本文所指的“商品的相关性”,就是依据与某个商品同时出现在购物车中次数最多的商品。

实际应用场景有:
1. 在某一商品的detail页面,推荐给用户与该商品相关的N个商品;
2. 在添加购物车成功页面,当用户把一个商品添加到购物车,推荐给用户N个与之相关的商品;
3. 在货架上将相关性比较高的几个商品摆放在一起;

利用Redis的有序集合做法如下:

每种商品构建一个有序集合,集合的成员为和该商品同时出现在购物车中的商品,成员的 score 为同时出现的次数。

每次 P_A 和 P_B 商品同时出现在购物车中时候,分别更新 Redis 中 P_A 和 P_B 对应的有序集合,

zincrby shopcart:product:P_A 1 P_B
zincrby shopcart:product:P_B 1 P_A

使它们同时出现在购物车中的次数 +1 。

假设实际场景如下步骤:

第一步: milk 和 egg 同时出现在购物车中,那么更新这两个商品对应的有序集合:

redis127.0.0.1:6379> zincrby shopcart:product:milk 1 egg
"1"
redis127.0.0.1:6379> zincrby shopcart:product:egg 1 milk
"1"

此时,这两个产品的有序集合为:

redis127.0.0.1:6379> zrevrange shopcart:product:milk 0 -1
1)"egg"
redis127.0.0.1:6379> zrevrange shopcart:product:egg 0 -1
1) "milk"

第二步: milk 和 bread 同时出现在购物车中,那么更新这两个商品对应的有序集合:

redis127.0.0.1:6379> zincrby shopcart:product:milk 1 bread
"1"
redis127.0.0.1:6379> zincrby shopcart:product:bread 1 milk
"1"
redis127.0.0.1:6379>

此时,这两个产品的有序集合为:

redis127.0.0.1:6379> zrevrange shopcart:product:milk 0 -1
1)"egg"
2)"bread"
redis127.0.0.1:6379> zrevrange shopcart:product:bread 0 -1
1)"milk"

第三步: milk 和 bread 又一次同时出现在购物车中:

redis127.0.0.1:6379> zincrby shopcart:product:milk 1 bread
"2"
redis127.0.0.1:6379> zincrby shopcart:product:bread 1 milk
"2"

此时,这两个产品的有序集合为:

redis127.0.0.1:6379> zrevrange shopcart:product:milk 0 -1
1)"bread"
2)"egg"
redis127.0.0.1:6379> zrevrange shopcart:product:bread 0 -1
1)"milk"

此时可以看到,与 milk 同时出现在购物车中次数最多的商品为 bread;

第四步:。。。。

实际使用的场景:根据一个商品 P_A 从 Redis 中该商品的有序集合 shopcart:product:P_A 中根据 SCORE 值降序排列,获取到与之最相关的 N 个商品,在货架上将这 N 个商品与 P_A 同时摆放,或者,在用户购买 P_A 时,将这 N 个商品推荐给用户。

zrevrange shopcart:product:P_A 0 N-1

 

http://www.tuicool.com/articles/eueyi2



已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [利用 redis 有序集合] 推荐:

利用Redis的有序集合做购物车商品相关性分析

- - zzm
本文所指的“商品的相关性”,就是依据与某个商品同时出现在购物车中次数最多的商品. 在某一商品的detail页面,推荐给用户与该商品相关的N个商品;. 在添加购物车成功页面,当用户把一个商品添加到购物车,推荐给用户N个与之相关的商品;. 在货架上将相关性比较高的几个商品摆放在一起;. 利用Redis的有序集合做法如下:.

使用redis的有序集合实现排行榜功能 - 简书

- -
排行榜是业务开发中常见的一个场景,如何设计一个好的数据结构能够满足高效实时的查询,下面我们结合一个实际例子来讨论一下. 选手报名参加活动,观众可以对选手进行投票,每个观众对同一名选手只能投一票,活动期间最多投四票. 接口1:返回TOP 10的选手信息及投票数. 接口2:返回活动总参与选手数及总投票数.

浅谈 Redis 与 MySQL 的耦合性以及利用管道完成 MySQL 到 Redis 的高效迁移

- - CSDN博客数据库推荐文章
    ㈠ Redis 与 MySQL 的耦合性.     在业务架构早期、我们便该"吃着碗里的看着锅里的"、切莫让MySQL 有梦、而Redis 无心.     毕竟、有些关系型的结构不适合放到Redis跑、"男女搭配、干活不累"嘛、推荐让MySQL与Redis喜结连理.     其次、这 2 人、一般是在不同场景做选择、而不会在性能上选择、.

Redis 负载监控——redis-monitor

- - ITeye资讯频道
redis-monitor是一个Web可视化的 redis 监控程序. 使用 Flask 来开发的,代码结构非常简单,适合移植到公司内网使用. redis 服务器信息,包括 redis 版本、上线时间、 os 系统信息等等. 实时的消息处理信息,例如处理 command 数量、连接总数量等. 内存占用、 cpu 消耗实时动态图表.

Redis 起步

- - 博客园_首页
Rdis和JQuery一样是纯粹为应用而产生的,这里记录的是在CentOS 5.7上学习入门文章:. Redis是一个key-value存储系统. 和Memcached类似,但是解决了断电后数据完全丢失的情况,而且她支持更多无化的value类型,除了和string外,还支持lists(链表)、sets(集合)和zsets(有序集合)几种数据类型.

redis 配置

- - 谁主沉浮
# 当配置中需要配置内存大小时,可以使用 1k, 5GB, 4M 等类似的格式,其转换方式如下(不区分大小写). # 内存配置大小写是一样的.比如 1gb 1Gb 1GB 1gB. # daemonize no 默认情况下,redis不是在后台运行的,如果需要在后台运行,把该项的值更改为yes. # 当redis在后台运行的时候,Redis默认会把pid文件放在/var/run/redis.pid,你可以配置到其他地址.

Cassandra代替Redis?

- - Tim[后端技术]
最近用Cassandra的又逐渐多了,除了之前的360案例,在月初的QCon Shanghai 2013 篱笆网也介绍了其使用案例. 而这篇 百万用户时尚分享网站feed系统扩展实践文章则提到了Fashiolista和Instagram从Redis迁移到Cassandra的案例. 考虑到到目前仍然有不少网友在讨论Redis的用法问题,Redis是一个数据库、内存、还是Key value store?以及Redis和memcache在实际场景的抉择问题,因此简单谈下相关区别.

redis 部署

- - CSDN博客云计算推荐文章
一、单机部署 tar xvf redis-2.6.16.tar.gz cd redis-2.6.16 make make PREFIX=/usr/local/redis install  #指定安装目录为/usr/local/redis,默认安装安装到/usr/local/bin. # chkconfig: 2345 80 10       #添加redhat系列操作系统平台,开机启动需求项(运行级别,开机时服务启动顺序、关机时服务关闭顺序) # description:  Starts, stops redis server.

nagios 监控redis

- - C1G军火库
下载check_redis.pl. OK: REDIS 2.6.12 on 192.168.0.130:6379 has 1 databases (db0) with 49801 keys, up 3 days 14 hours - connected_clients is 1, blocked_clients is 0 | connected_clients=1 blocked_clients=0.

转 redis vs memcached

- - 数据库 - ITeye博客
传统MySQL+ Memcached架构遇到的问题.   实际MySQL是适合进行海量数据存储的,通过Memcached将热点数据加载到cache,加速访问,很多公司都曾经使用过这样的架构,但随着业务数据量的不断增加,和访问量的持续增长,我们遇到了很多问题:.   1.MySQL需要不断进行拆库拆表,Memcached也需不断跟着扩容,扩容和维护工作占据大量开发时间.