使用Redis实例搭建网上商城的商品相关性分析程序

本文涉及的产品
云原生多模数据库 Lindorm,多引擎 多规格 0-4节点
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
云数据库 MongoDB,通用型 2核4GB
简介: 本教程将指导您如何快速创建实例并搭建网上商城的商品相关性分析程序。(ApsaraDB for Redis)是兼容开源Redis协议标准的数据库服务,基于双机热备架构及集群架构,可满足高吞吐、低延迟及弹性变配等业务需求。

本教程将指导您如何快速创建实例并搭建网上商城的商品相关性分析程序。(ApsaraDB for Redis)是兼容开源Redis协议标准的数据库服务,基于双机热备架构及集群架构,可满足高吞吐、低延迟及弹性变配等业务需求。

我能学到什么

  • 学会如何创建Redis实例。
  • 学会使用Redis实例搭建网上商城的商品相关性分析程序。

操作难度

所需时间

25分钟

使用的阿里云产品

云数据库Redis版

所需费用

若您满足试用条件,则为0元,若不满足,在创建Redis实例时将会产生费用。


准备环境和资源

开始教程前,请按以下步骤准备环境和资源:

  1. 准备如下开发环境。
  • 开发工具:IntelliJ IDEA 2022.3.2及以上版本,本教程以Windows系统的IntelliJ IDEA 2022.3.2版为例。macOS系统的操作与本文类似。
  • Java:Java 1.8.0及以上版本,本教程以Java 1.8.0版为例。
  1. 访问阿里云免费试用。单击页面右上方的登录/注册按钮,并根据页面提示完成账号登录(已有阿里云账号)、账号注册(尚无阿里云账号)或实名认证(根据试用产品要求完成个人实名认证或企业实名认证)。
  2. 成功登录后,在产品类别下选择数据库>NoSQL 数据库,选择云数据库Redis版,单击立即试用
  3. 云数据库Redis版面板,配置以下信息。


配置项

说明

示例

地域

实例的地域。请根据您所在的地理位置就近选择地域,实例将创建在该地域,创建后无法变更地域。

若需通过ECS连接该Redis实例,请确保Redis实例与ECS实例为同地域,否则它们无法通过内网互通,只能通过外网连接,无法发挥最佳性能。

华东1(杭州)

可用区类型

  • 单可用区:主备节点都会部署在单一可用区,适合可用区灾备级别的要求为单机房的场景。
  • 双可用区:主备节点会分别部署在指定的主可用区和备可用区,组成同城双中心主备架构。

单可用区

主可用区

可用区是指在同一地域内,电力和网络互相独立的物理区域。

当选择可用区类型双可用区时,您还需要指定备可用区,且备可用区需要与主可用区不同。主备可用区共同组成同城双中心的主备架构。

杭州 可用区 G

专有网络

选择实例的专有网络。如果没有专有网络,系统将自动创建。

若需通过ECS连接该Redis实例,请确保Redis实例与ECS实例位于同一个专有网络(同VPC ID)。

自动创建VPC网络

虚拟交换机

选择专有网络下的虚拟交换机(vSwitch)。如果该专有网络下在当前可用区中没有交换机,系统将自动创建。

自动创建虚拟交换机

版本

推荐使用较新的Redis引擎版本,以支持更多的功能和特性。

Redis 6.0


版本类型实例类型架构类型分片规格读写分离副本数只读副本分片数量等实例配置项保持默认值。


  1. 选择密码设置立即设置,输入密码和确认密码。
  2. 输入实例名称(可选)。
    名称为2~80个字符,以大小写字母或中文开头,不支持字符:@/:=”<>{[]}与空格。
  3. 试用时长固定为1个月
  4. 选择实例所属的资源组为默认资源组
  5. 阅读并选中服务协议,单击立即试用
    创建实例需要1~5分钟。您可以在Redis控制台实例列表中,选择实例所属的地域,即可看到新购买的Redis实例。

设置白名单

Redis实例默认禁止所有IP地址访问,在开始使用前,请将客户端的IP地址或IP地址段添加到Redis实例的白名单中。

  1. Redis控制台实例列表页面左上方选择创建实例的地域,例如华东1(杭州),然后单击目标实例ID。
  2. 在左侧导航栏,单击白名单设置
  3. default默认白名单分组,单击修改
  4. 组内白名单文本框中,输入本地设备的公网IP地址。获取本地设备公网IP地址的方式可能因你所处的网络环境或操作不同而不同。以下是不同系统通过命令方式获取本地设备公网IP地址的参考方法:
  • Linux操作系统:打开终端,输入curl ifconfig.me命令后回车。
  • Windows操作系统:打开命令提示符,输入curl ip.me命令后回车。
  • macOS操作系统:打开终端,输入curl ifconfig.me命令后回车。
  1. 单击确定

获取Redis连接地址

Redis实例默认提供专有网络连接地址,由于本教程通过公网连接Redis实例,因此需要在连接前获取Redis实例的公网连接地址,申请公网地址和后续产生的公网流量暂不收费。

  1. 在左侧导航栏,单击实例信息
  2. 连接信息区域框,单击公网访问对应的申请连接地址
  3. 单击确定
    申请操作完成后,刷新控制台页面,连接信息区域框中将展示公网连接地址。

执行代码

您可以参考如下步骤创建工程,您也可以下载AliyunShoppingMall源文件,下载后需参考本步骤的第6步修改Redis实例信息。

  1. 在本地设备,运行IDEA客户端。
  2. 新建一个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其他版本。
    图片后不放文字,文字设置区块

image.png

  1. 在pom.xml文件中,添加Maven依赖。
    
        
            redis.clients
            jedis
            4.2.3
        

        
            org.slf4j
            slf4j-simple
            1.7.25
            compile
        
    
  1. 右键单击pom.xml文件,选择Maven > Reload project
  2. 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]);
        }
    }
}
  1. 在客户端右上方,单击运行图标,运行示例代码。

完成

运行结果示例。

用户0购买了阿里云_产品_牛肉干、阿里云_产品_可乐,阿里云_产品_口香糖
用户1购买了阿里云_产品_巧克力、阿里云_产品_鸡翅
用户2购买了阿里云_产品_啤酒、阿里云_产品_可乐,阿里云_产品_巧克力
用户3购买了阿里云_产品_牛肉干、阿里云_产品_可乐,阿里云_产品_口香糖
用户4购买了阿里云_产品_巧克力、阿里云_产品_鸡翅

>>>>>>>>>>与阿里云_产品_啤酒一起被购买的产品有<<<<<<<<<<<<<<<
商品名称:阿里云_产品_巧克力, 共同购买次数:1
商品名称:阿里云_产品_可乐, 共同购买次数:1

>>>>>>>>>>与阿里云_产品_巧克力一起被购买的产品有<<<<<<<<<<<<<<<
商品名称:阿里云_产品_鸡翅, 共同购买次数:2
商品名称:阿里云_产品_啤酒, 共同购买次数:1
商品名称:阿里云_产品_可乐, 共同购买次数:1

>>>>>>>>>>与阿里云_产品_可乐一起被购买的产品有<<<<<<<<<<<<<<<
商品名称:阿里云_产品_牛肉干, 共同购买次数:2
商品名称:阿里云_产品_口香糖, 共同购买次数:2
商品名称:阿里云_产品_巧克力, 共同购买次数:1
商品名称:阿里云_产品_啤酒, 共同购买次数:1

>>>>>>>>>>与阿里云_产品_口香糖一起被购买的产品有<<<<<<<<<<<<<<<
商品名称:阿里云_产品_牛肉干, 共同购买次数:2
商品名称:阿里云_产品_可乐, 共同购买次数:2

>>>>>>>>>>与阿里云_产品_牛肉干一起被购买的产品有<<<<<<<<<<<<<<<
商品名称:阿里云_产品_可乐, 共同购买次数:2
商品名称:阿里云_产品_口香糖, 共同购买次数:2

>>>>>>>>>>与阿里云_产品_鸡翅一起被购买的产品有<<<<<<<<<<<<<<<
商品名称:阿里云_产品_巧克力, 共同购买次数:2


清理及后续

清理

该Redis实例只能免费试用1个月。实例到期后,将在15天后自动释放(数据被删除)。若您需继续使用Redis实例,您可以在该实例被释放前进行手动续费或开启自动续费,具体操作请参见续费实例

后续

您还可以通过Redis实现更多游戏、金融、电商、视频直播类等应用,更多信息请参见什么是云数据库Redis版

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
12天前
|
缓存 监控 NoSQL
【Redis性能瓶颈揭秘】「调优系列」深入分析热Key的排查策略和解决方案
【Redis性能瓶颈揭秘】「调优系列」深入分析热Key的排查策略和解决方案
215389 12
|
12天前
|
存储 消息中间件 缓存
Redis的高性能使得它非常适合用于实时分析场景
【5月更文挑战第15天】Redis在Python Web开发中扮演关键角色,常用于缓存系统,提高数据读取速度;会话管理,存储用户信息;分布式锁,确保数据一致性;排行榜和计数,利用有序集合和哈希结构;消息队列,基于列表结构实现异步处理;实时分析,高效处理实时数据。其丰富的数据结构和高性能使其在多种场景下应用广泛。
289 3
|
12天前
|
NoSQL 网络协议 Java
Redis客户端Lettuce深度分析介绍(上)
Spring Boot自2.0版本开始默认使用Lettuce作为Redis的客户端(注1)。Lettuce客户端基于Netty的NIO框架实现,对于大多数的Redis操作,只需要维持单一的连接即可高效支持业务端的并发请求 —— 这点与Jedis的连接池模式有很大不同。同时,Lettuce支持的特性更加全面,且其性能表现并不逊于,甚至优于Jedis。本文通过分析Lettuce的特性和内部实现(基于6.0版本),及其与Jedis的对照比较,对这两种客户端,以及Redis服务端进行深度探讨。
101108 7
|
12天前
|
存储 运维 NoSQL
通过OOS实现定时备份Redis实例转储到OSS
基于阿里云 Redis 备份功能,现结合 OOS 推出自动转储至 OSS 的新方案,解决了数据安全风险、运维繁琐、成本增加和效率低下等问题。新方案亮点包括: 1. 数据安全性提高:备份文件自动上传至OSS,利用OSS的数据冗余存储,保证数据在硬件故障时的持久性和可用性。 2. 完全自动化:设置好定时规则后,备份和转储过程无需人工干预。 3. 多实例多地域集中管理:支持一次选择多个实例和跨区域备份,简化管理。 4. 灵活的备份策略和成本控制:自定义备份频率,并通过OSS生命周期管理策略控制成本。 5. 监控和告警:集成OSS和云监控,实时掌握备份状态,及时处理异常。
166 0
通过OOS实现定时备份Redis实例转储到OSS
|
12天前
|
NoSQL Redis 数据库
通过migrate命令实现两个redis实例之间的数据迁移
通过migrate命令实现两个redis实例之间的数据迁移
|
12天前
|
NoSQL Shell Redis
批量迁移redis实例的key
批量迁移redis实例的key
|
存储 NoSQL Redis
|
12天前
|
负载均衡 监控 NoSQL
Redis的几种主要集群方案
【5月更文挑战第15天】Redis集群方案包括主从复制(基础,读写分离,手动故障恢复)、哨兵模式(自动高可用,自动故障转移)和Redis Cluster(官方分布式解决方案,自动分片、容错和扩展)。此外,还有Codis、Redisson和Twemproxy等工具用于代理分片和负载均衡。选择方案需考虑应用场景、数据量和并发需求,权衡可用性、性能和扩展性。
191 2
|
12天前
|
存储 监控 负载均衡
保证Redis的高可用性是一个涉及多个层面的任务,主要包括数据持久化、复制与故障转移、集群化部署等方面
【5月更文挑战第15天】保证Redis高可用性涉及数据持久化、复制与故障转移、集群化及优化策略。RDB和AOF是数据持久化方法,哨兵模式确保故障自动恢复。Redis Cluster实现分布式部署,提高负载均衡和容错性。其他措施包括身份认证、多线程、数据压缩和监控报警,以增强安全性和稳定性。通过综合配置与监控,可确保Redis服务的高效、可靠运行。
185 2
|
12天前
|
存储 NoSQL Redis
Redis源码、面试指南(5)多机数据库、复制、哨兵、集群(下)
Redis源码、面试指南(5)多机数据库、复制、哨兵、集群
230 1

相关产品

  • 云数据库 Redis 版