利用Redis的有序集合做購物車商品相關性分析

2021-07-10 18:07:51 字數 2035 閱讀 5389

本文所指的「商品的相關性」,就是依據與某個商品同時出現在購物車中次數最多的商品。

實際應用場景有:

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

Redis 有序集合

redis 有序集合和集合一樣也是string型別元素的集合,且不允許重複的成員。不同的是每個元素都會關聯乙個double型別的分數。redis正是通過分數來為集合中的成員進行從小到大的排序。有序集合的成員是唯一的,但分數 score 卻可以重複。集合是通過雜湊表實現的,所以新增,刪除,查詢的複雜度...

Redis有序集合

redis 有序集合和集合一樣也是string型別元素的集合,且不允許重複的成員。不同的是每個元素都會關聯乙個double型別的分數。redis正是通過分數來為集合中的成員進行從小到大的排序。有序集合的成員是唯一的,但分數 score 卻可以重複。集合是通過雜湊表實現的,所以新增,刪除,查詢的複雜度...

redis 有序集合

import redis pool redis.connectionpool host 127.0.0.1 實現乙個連線池 r redis.redis connection pool pool for i in range 100 r.zadd 1 i,i 表名稱為1,新增內容為 1到100,對應分...