电商商品相关性分析
kvstore
手动配置
教程简介
本教程将指导您如何快速创建Redis开源版实例并搭建网上商城的商品相关性分析程序。Redis开源版是兼容开源Redis协议标准的数据库服务,基于双机热备架构及集群架构,可满足高吞吐、低延迟及弹性变配等业务需求。
我能学到什么
学会如何创建Redis开源版实例。
学会使用Redis开源版实例搭建网上商城的商品相关性分析程序。
操作难度 | 中 |
所需时间 | 25分钟 |
使用的阿里云产品 | |
所需费用 | 若您满足试用条件,则为0元,若不满足,在创建Redis开源版实例时将会产生费用。 |
准备环境和资源
5
开始教程前,请按以下步骤准备环境和资源:
准备如下开发环境。
开发工具:IntelliJ IDEA 2022.3.2及以上版本,本教程以Windows系统的IntelliJ IDEA 2022.3.2版为例。macOS系统的操作与本文类似。
Java:Java 1.8.0及以上版本,本教程以Java 1.8.0版为例。
访问阿里云免费试用。单击页面右上方的登录/注册按钮,并根据页面提示完成账号登录(已有阿里云账号)、账号注册(尚无阿里云账号)或实名认证(根据试用产品要求完成个人实名认证或企业实名认证)。
成功登录后,在产品类别下选择数据库>NoSQL 数据库,选择Redis 开源版,单击立即试用。
在Redis开源版面板,配置以下信息。
配置项
说明
示例
地域
实例的地域。请根据您所在的地理位置就近选择地域,实例将创建在该地域,创建后无法变更地域。
若需通过ECS连接该Redis实例,请确保Redis实例与ECS实例为同地域,否则它们无法通过内网互通,只能通过外网连接,无法发挥最佳性能。
华东1(杭州)
可用区类型
单可用区:主备节点都会部署在单一可用区,适合可用区灾备级别的要求为单机房的场景。
双可用区:主备节点会分别部署在指定的主可用区和备可用区,组成同城双中心主备架构。
单可用区
主可用区
可用区是指在同一地域内,电力和网络互相独立的物理区域。
当选择可用区类型为双可用区时,您还需要指定备可用区,且备可用区需要与主可用区不同。主备可用区共同组成同城双中心的主备架构。
杭州 可用区 G
专有网络
选择实例的专有网络。如果没有专有网络,系统将自动创建。
若需通过ECS连接该Redis实例,请确保Redis实例与ECS实例位于同一个专有网络(同VPC ID)。
自动创建VPC网络
虚拟交换机
选择专有网络下的虚拟交换机(vSwitch)。如果该专有网络下在当前可用区中没有交换机,系统将自动创建。
自动创建虚拟交换机
版本
推荐使用较新的Redis引擎版本,以支持更多的功能和特性。
Redis 6.0
版本类型、实例类型、架构类型、分片规格、读写分离、副本数、只读副本及分片数量等实例配置项保持默认值。
选择密码设置为立即设置,输入密码和确认密码。
输入实例名称(可选)。
名称为2~80个字符,以大小写字母或中文开头,不支持字符:@/:=”<>{[]}与空格。
试用时长固定为1个月。
选择实例所属的资源组为默认资源组。
阅读并选中服务协议,单击立即试用。
创建实例需要1~5分钟。您可以在Redis控制台实例列表中,选择实例所属的地域,即可看到新购买的Redis实例。
设置白名单
3
Redis实例默认禁止所有IP地址访问,在开始使用前,请将客户端的IP地址或IP地址段添加到Redis实例的白名单中。
在Redis控制台实例列表页面左上方选择创建实例的地域,例如华东1(杭州),然后单击目标实例ID。
在左侧导航栏,单击白名单设置。
在default默认白名单分组,单击修改。
在组内白名单文本框中,输入本地设备的公网IP地址。
获取本地设备公网IP地址的方式可能因你所处的网络环境或操作不同而不同。以下是不同系统通过命令方式获取本地设备公网IP地址的参考方法:
Linux操作系统:打开终端,输入
curl ifconfig.me
命令后回车。Windows操作系统:打开命令提示符,输入
curl ip.me
命令后回车。macOS操作系统:打开终端,输入
curl ifconfig.me
命令后回车。
单击确定。
获取Redis连接地址
2
Redis实例默认提供专有网络连接地址,由于本教程通过公网连接Redis实例,因此需要在连接前获取Redis实例的公网连接地址,申请公网地址和后续产生的公网流量暂不收费。
在左侧导航栏,单击实例信息。
在连接信息区域框,单击公网访问对应的申请连接地址。
单击确定。
申请操作完成后,刷新控制台页面,连接信息区域框中将展示公网连接地址。
执行代码
10
您可以参考如下步骤创建工程,您也可以下载AliyunShoppingMall源文件,下载后需参考本步骤的第6步修改Redis实例信息。
在本地设备,运行IDEA客户端。
新建一个Project。
参数说明:
Name:项目名称,示例为AliyunShoppingMall。
Location:项目存储路径,示例为
D:\Test\JAVA\
。Language:开发语言,选择Java。
Build system:编译系统,选择Maven。
JDK:开发工具包,选择1.8 Oracle OpenJDK version 1.8.0_261或Java 1.8其他版本。
在pom.xml文件中,添加Maven依赖。
<dependencies> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>4.2.3</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-simple</artifactId> <version>1.7.25</version> <scope>compile</scope> </dependency> </dependencies>
右键单击pom.xml文件,选择Maven > Reload project。
在src > main > java > org.example路径下,新建一个Java Class,命名为
AliyunShoppingMall
,并添加示例代码。请将示例代码中的Redis实例连接地址、端口号以及账号密码修改为您的Redis实例信息。
参数说明:
host:获取的Redis实例公网连接地址。
port:Redis实例的端口号,默认为6379,您无需修改。
authString:Redis实例的账号与密码,可直接填写创建实例时设置的密码(将通过默认账号进行登录),若您使用新建的账号登录,则账号密码格式为
user:password
。若创建实例时未配置密码,请参见修改或重置密码。
package shop.kvstore.aliyun.com; 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-bp***************4ypd.redis.rds.aliyuncs.com"; int port = 6379; Jedis jedis = new Jedis(host, port); try { String authString = jedis.auth("D*********3"); 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(); // 利用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]); // 将产品之间的关联情况记录到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]); // 将产品之间的关联情况记录到Redis的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]); // 将产品之间的关联情况记录到Redis的SortSet之中。 jedis.zincrby(products[5], 1, products[1]); jedis.zincrby(products[1], 1, products[5]); } } }
在客户端右上方,单击图标,运行示例代码。
完成
2
运行结果示例。
用户0购买了阿里云_产品_牛肉干、阿里云_产品_可乐,阿里云_产品_口香糖
用户1购买了阿里云_产品_巧克力、阿里云_产品_鸡翅
用户2购买了阿里云_产品_啤酒、阿里云_产品_可乐,阿里云_产品_巧克力
用户3购买了阿里云_产品_牛肉干、阿里云_产品_可乐,阿里云_产品_口香糖
用户4购买了阿里云_产品_巧克力、阿里云_产品_鸡翅
>>>>>>>>>>与阿里云_产品_啤酒一起被购买的产品有<<<<<<<<<<<<<<<
商品名称:阿里云_产品_巧克力, 共同购买次数:1
商品名称:阿里云_产品_可乐, 共同购买次数:1
>>>>>>>>>>与阿里云_产品_巧克力一起被购买的产品有<<<<<<<<<<<<<<<
商品名称:阿里云_产品_鸡翅, 共同购买次数:2
商品名称:阿里云_产品_啤酒, 共同购买次数:1
商品名称:阿里云_产品_可乐, 共同购买次数:1
>>>>>>>>>>与阿里云_产品_可乐一起被购买的产品有<<<<<<<<<<<<<<<
商品名称:阿里云_产品_牛肉干, 共同购买次数:2
商品名称:阿里云_产品_口香糖, 共同购买次数:2
商品名称:阿里云_产品_巧克力, 共同购买次数:1
商品名称:阿里云_产品_啤酒, 共同购买次数:1
>>>>>>>>>>与阿里云_产品_口香糖一起被购买的产品有<<<<<<<<<<<<<<<
商品名称:阿里云_产品_牛肉干, 共同购买次数:2
商品名称:阿里云_产品_可乐, 共同购买次数:2
>>>>>>>>>>与阿里云_产品_牛肉干一起被购买的产品有<<<<<<<<<<<<<<<
商品名称:阿里云_产品_可乐, 共同购买次数:2
商品名称:阿里云_产品_口香糖, 共同购买次数:2
>>>>>>>>>>与阿里云_产品_鸡翅一起被购买的产品有<<<<<<<<<<<<<<<
商品名称:阿里云_产品_巧克力, 共同购买次数:2
清理及后续
3
清理
该Redis实例只能免费试用1个月。实例到期后,将在15天后自动释放(数据被删除)。若您需继续使用Redis实例,您可以在该实例被释放前进行手动续费或开启自动续费,具体操作请参见续费实例。
后续
您还可以通过Redis实现更多游戏、金融、电商、视频直播类等应用,更多信息请参见什么是云数据库 Tair(兼容 Redis)。
总结
常用知识点
问题1:若不将客户端设备的IP地址添加至Redis实例的白名单中,客户端能否正常访问Redis实例?(单选题)
可以
不可以
正确答案是不可以,Redis实例默认拒绝任务IP地址访问,需提前将客户端设备的IP地址添加至Redis实例的白名单中才能正常访问。