本文所指的「商品的相關性」,就是依據與某個商品同時出現在購物車中次數最多的商品。
實際應用場景有:
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,對應分...