您可以使用云數據庫 Tair(兼容 Redis)實例搭建網上商城的商品相關性分析程序。
場景介紹
商品的相關性就是某個產品與其他另外某商品同時出現在購物車中的情況。這種數據分析對于電商行業是很重要的,可以用來分析用戶購買行為。例如:
在某一商品的detail頁面,推薦給用戶與該商品相關的其他商品;
在添加購物車成功頁面,當用戶把一個商品添加到購物車,推薦給用戶與之相關的其他商品;
在貨架上將相關性比較高的幾個商品擺放在一起。
利用有序集合,為每種商品構建一個有序集合,集合的成員為和該商品同時出現在購物車中的商品,成員的score為同時出現的次數。每次A和B商品同時出現在購物車中時,分別更新A和B對應的有序集合。
代碼示例
本示例基于Jedis 4.2.3版本,您可以在pom.xml文件中添加以下Maven依賴:
<dependencies>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>4.2.3</version>
</dependency>
</dependencies>
代碼示例如下:
import java.util.List;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.resps.Tuple;
public class AliyunShoppingMall {
public static void main(String[] args)
{
// 實例的連接信息,從控制臺可以獲得
String host = "r-uf66rt5q0vsstw****.tairpena.rds.aliyuncs.com";
int port = 6379;
Jedis jedis = new Jedis(host, port);
try {
// 實例的實例密碼
String authString = jedis.auth("password");//password
if (!authString.equals("OK"))
{
System.err.println("AUTH Failed: " + authString);
return;
}
//產品列表
String key0="阿里云:產品:啤酒";
String key1="阿里云:產品:巧克力";
String key2="阿里云:產品:可樂";
String key3="阿里云:產品:口香糖";
String key4="阿里云:產品:牛肉干";
String key5="阿里云:產品:雞翅";
final String[] aliyunProducts=new String[]{key0,key1,key2,key3,key4,key5};
//初始化,清除可能的已有舊數據
for (int i = 0; i < aliyunProducts.length; i++) {
jedis.del(aliyunProducts[i]);
}
//模擬用戶購物
for (int i = 0; i < 5; i++) {//模擬多人次的用戶購買行為
customersShopping(aliyunProducts,i,jedis);
}
System.out.println();
//利用ApsaraDB for Redis來輸出各個商品間的關聯關系
for (int i = 0; i < aliyunProducts.length; i++) {
System.out.println(">>>>>>>>>>與"+aliyunProducts[i]+"一起被購買的產品有<<<<<<<<<<<<<<<");
List<Tuple> relatedList = jedis.zrevrangeWithScores(aliyunProducts[i], 0, -1);
for (Tuple item : relatedList) {
System.out.println("商品名稱:"+item.getElement()+", 共同購買次數:"+Double.valueOf(item.getScore()).intValue());
}
System.out.println();
}
} catch (Exception e) {
e.printStackTrace();
}finally{
jedis.quit();
jedis.close();
}
}
private static void customersShopping(String[] products, int i, Jedis jedis) {
//簡單模擬3種購買行為,隨機選取作為用戶的購買選擇
int bought=(int)(Math.random()*3);
if(bought==1){
//模擬業務邏輯:用戶購買了如下產品
System.out.println("用戶"+i+"購買了"+products[0]+","+products[2]+","+products[1]);
//將產品之間的關聯情況記錄到ApsaraDB for Redis的SortSet之中
jedis.zincrby(products[0], 1, products[1]);
jedis.zincrby(products[0], 1, products[2]);
jedis.zincrby(products[1], 1, products[0]);
jedis.zincrby(products[1], 1, products[2]);
jedis.zincrby(products[2], 1, products[0]);
jedis.zincrby(products[2], 1, products[1]);
}else if(bought==2){
//模擬業務邏輯:用戶購買了如下產品
System.out.println("用戶"+i+"購買了"+products[4]+","+products[2]+","+products[3]);
//將產品之間的關聯情況記錄到SortSet之中
jedis.zincrby(products[4], 1, products[2]);
jedis.zincrby(products[4], 1, products[3]);
jedis.zincrby(products[3], 1, products[4]);
jedis.zincrby(products[3], 1, products[2]);
jedis.zincrby(products[2], 1, products[4]);
jedis.zincrby(products[2], 1, products[3]);
}else if(bought==0){
//模擬業務邏輯:用戶購買了如下產品
System.out.println("用戶"+i+"購買了"+products[1]+","+products[5]);
//將產品之間的關聯情況記錄到實例的SortSet之中
jedis.zincrby(products[5], 1, products[1]);
jedis.zincrby(products[1], 1, products[5]);
}
}
}
在輸入了正確的實例訪問地址和密碼之后,運行以上Java程序,輸出結果如下:
用戶0購買了阿里云:產品:巧克力,阿里云:產品:雞翅
用戶1購買了阿里云:產品:牛肉干,阿里云:產品:可樂,阿里云:產品:口香糖
用戶2購買了阿里云:產品:啤酒,阿里云:產品:可樂,阿里云:產品:巧克力
用戶3購買了阿里云:產品:牛肉干,阿里云:產品:可樂,阿里云:產品:口香糖
用戶4購買了阿里云:產品:巧克力,阿里云:產品:雞翅
>>>>>>>>>>與阿里云:產品:啤酒一起被購買的產品有<<<<<<<<<<<<<<<
商品名稱:阿里云:產品:巧克力, 共同購買次數:1
商品名稱:阿里云:產品:可樂, 共同購買次數:1
>>>>>>>>>>與阿里云:產品:巧克力一起被購買的產品有<<<<<<<<<<<<<<<
商品名稱:阿里云:產品:雞翅, 共同購買次數:2
商品名稱:阿里云:產品:啤酒, 共同購買次數:1
商品名稱:阿里云:產品:可樂, 共同購買次數:1
>>>>>>>>>>與阿里云:產品:可樂一起被購買的產品有<<<<<<<<<<<<<<<
商品名稱:阿里云:產品:牛肉干, 共同購買次數:2
商品名稱:阿里云:產品:口香糖, 共同購買次數:2
商品名稱:阿里云:產品:巧克力, 共同購買次數:1
商品名稱:阿里云:產品:啤酒, 共同購買次數:1
>>>>>>>>>>與阿里云:產品:口香糖一起被購買的產品有<<<<<<<<<<<<<<<
商品名稱:阿里云:產品:牛肉干, 共同購買次數:2
商品名稱:阿里云:產品:可樂, 共同購買次數:2
>>>>>>>>>>與阿里云:產品:牛肉干一起被購買的產品有<<<<<<<<<<<<<<<
商品名稱:阿里云:產品:可樂, 共同購買次數:2
商品名稱:阿里云:產品:口香糖, 共同購買次數:2
>>>>>>>>>>與阿里云:產品:雞翅一起被購買的產品有<<<<<<<<<<<<<<<
商品名稱:阿里云:產品:巧克力, 共同購買次數:2
文檔內容是否對您有幫助?