
# 使用DCS实现排行榜功能
#### 方案概述
在网页和APP中经常需要用到榜单的功能，对某个key-value的列表进行降序显示。当操作和查询并发大的时候，使用传统数据库就会遇到性能瓶颈，造成较大的时延。
使用分布式缓存服务（DCS）的Redis版本，可以实现一个商品热销排行榜的功能。它的优势在于：
- 数据保存在内存中，读写速度非常快。
- 提供字符串（String）、链表（List）、集合（Set）、哈希（Hash）等多种数据结构类型的存储。
 
#### 前提条件
- 已创建DCS缓存实例，且状态为"运行中"。
- 客户端所在服务器与DCS缓存实例网络互通：
  - 客户端与Redis实例所在VPC为同一VPC 同一VPC内网络默认互通。
    
  
  - 客户端与Redis实例所在VPC为相同region下的不同VPC 如果客户端与Redis实例不在相同VPC中，可以通过建立VPC对等连接方式连通网络，具体请参考：[缓存实例是否支持跨VPC访问？](https://support.huaweicloud.com/dcs_faq/dcs-faq-0427002.html)。
    
  
  - 客户端与Redis实例所在VPC不在相同region 如果客户端服务器和Redis实例不在同一region，仅支持通过云专线打通网络，请参考[云专线](https://support.huaweicloud.com/productdesc-dc/zh-cn_topic_0032053183.html)。
    
  
  - 公网访问 客户端公网访问Redis 4.0/5.0/6.0实例时，需要开启实例公网访问开关，具体请参考[开启Redis 4.0/5.0/6.0公网访问并获取公网访问地址](https://support.huaweicloud.com/usermanual-dcs/dcs_03_0011.html)。
    
   
- 客户端所在的服务器已安装[JDK1.8](https://www.oracle.com/java/technologies/downloads/)以上版本和开发工具（本文档以安装[Eclipse](https://www.eclipse.org/downloads/)为例），下载jedis客户端（[单击此处直接下载jar包](https://jar-download.com/artifacts/redis.clients/jedis/3.5.1/source-code)）。
  本文档下载的开发工具和客户端仅为示例，您可以选择其它类型的工具和客户端。
  
 
#### 实施步骤
1. 在服务器上运行Eclipse，单击"File \> New Project"创建一个java工程，工程名称使用代码示例中的包名"dcsDemo02"。
2. 单击"New \> Class"创建一个productSalesRankDemo.java文件。
3. 将以下示例代码复制到productSalesRankDemo.java文件中。 
   ```
   package dcsDemo02;
   import java.util.ArrayList;
   import java.util.List;
   import java.util.Set;
   import java.util.UUID;
   import redis.clients.jedis.Jedis;
   import redis.clients.jedis.Tuple;
   public class productSalesRankDemo {
       static final int PRODUCT_KINDS = 30;
       public static void main(String[] args) {
           // Redis实例连接地址和端口，需替换为实际获取的值
           String host = "192.168.0.246";
           int port = 6379;
           Jedis jedisClient = new Jedis(host, port);
           try {
               // Redis实例连接密码，需替换为实际获取的值
               String authMsg = jedisClient.auth("******");
               if (!authMsg.equals("OK")) {
                   System.out.println("AUTH FAILED: " + authMsg);
               }
               //键
               String key = "商品热销排行榜";
               jedisClient.del(key);
               //随机生成产品数据
               List<String> productList = new ArrayList<>();
               for(int i = 0; i < PRODUCT_KINDS; i ++) {
                   productList.add("product-" + UUID.randomUUID().toString());
               }
               //随机生成销量
               for(int i = 0; i < productList.size(); i ++) {
                   int sales = (int)(Math.random() * 20000);
                   String product = productList.get(i);
                   //插入Redis的SortedSet中
                   jedisClient.zadd(key, sales, product);
               }
               System.out.println();
               System.out.println("                   "+key);
               //获取所有列表并按销量顺序输出
               Set<Tuple> sortedProductList = jedisClient.zrevrangeWithScores(key, 0, -1);
               for(Tuple product : sortedProductList) {
                   System.out.println("产品ID： " + product.getElement() + ", 销量： " 
                           + Double.valueOf(product.getScore()).intValue());
               }
               System.out.println();
               System.out.println("                   "+key);
               System.out.println("                   前五大热销产品");
               //获取销量前五列表并输出
               Set<Tuple> sortedTopList = jedisClient.zrevrangeWithScores(key, 0, 4);
               for(Tuple product : sortedTopList) {
                   System.out.println("产品ID： " + product.getElement() + ", 销量： " 
                           + Double.valueOf(product.getScore()).intValue());
               }
           }
           catch (Exception e) {
               e.printStackTrace();
           }
           finally {
               jedisClient.quit();
               jedisClient.close();
           }
       }
   }
   ```
   
   
4. 将DCS缓存实例的连接地址、端口以及连接密码配置到示例代码文件中。
5. 编译并运行得到结果。
 
#### 运行结果
编译并运行以上Demo程序，结果如下：
```
商品热销排行榜
产品ID： product-b290c0d4-e919-4266-8eb5-7ab84b19862d, 销量： 18433
产品ID： product-e61a0642-d34f-46f4-a720-ee35940a5e7f, 销量： 18334
产品ID： product-ceeab7c3-69a7-4994-afc6-41b7bc463d44, 销量： 18196
产品ID： product-f2bdc549-8b3e-4db1-8cd4-a2ddef4f5d97, 销量： 17870
产品ID： product-f50ca2de-7fa4-45a3-bf32-23d34ac15a41, 销量： 17842
产品ID： product-d0c364e0-66ec-48a8-9ac9-4fb58adfd033, 销量： 17782
产品ID： product-5e406bbf-47c7-44a9-965e-e1e9b62ed1cc, 销量： 17093
产品ID： product-0c4d31ee-bb15-4c88-b319-a69f74e3c493, 销量： 16432
产品ID： product-a986e3a4-4023-4e00-8104-db97e459f958, 销量： 16380
产品ID： product-a3ac9738-bed2-4a9c-b96a-d8511ae7f03a, 销量： 15305
产品ID： product-6b8ad4b7-e134-480f-b3ae-3d35d242cb53, 销量： 14534
产品ID： product-26a9b41b-96b1-4de0-932b-f78d95d55b2d, 销量： 11417
产品ID： product-1f043255-a1f9-40a0-b48b-f40a81d07e0e, 销量： 10875
产品ID： product-c8fee24c-d601-4e0e-9d18-046a65e59835, 销量： 10521
产品ID： product-5869622b-1894-4702-b750-d76ff4b29163, 销量： 10271
产品ID： product-ff0317d2-d7be-4021-9d25-1f997d622768, 销量： 9909
产品ID： product-da254e81-6dec-4c76-928d-9a879a11ed8d, 销量： 9504
产品ID： product-fa976c02-b175-4e82-b53a-8c0df96fe877, 销量： 8630
产品ID： product-0624a180-4914-46b9-84d0-9dfbbdaa0da2, 销量： 8405
产品ID： product-d0079955-eaea-47b2-845f-5ff05a110a70, 销量： 7930
产品ID： product-a53145ef-1db9-4c4d-a029-9324e7f728fe, 销量： 7429
产品ID： product-9b1a1fd1-7c3b-4ae8-9fd3-ab6a0bf71cae, 销量： 5944
产品ID： product-cf894aee-c1cb-425e-a644-87ff06485eb7, 销量： 5252
产品ID： product-8bd78ba8-f2c4-4e5e-b393-60aa738eceae, 销量： 4903
产品ID： product-89b64402-c624-4cf1-8532-ae1b4ec4cabc, 销量： 4527
产品ID： product-98b85168-9226-43d9-b3cf-ef84e1c3d75f, 销量： 3095
产品ID： product-0dda314f-22a7-464b-ab8c-2f8f00823a39, 销量： 2425
产品ID： product-de7eb085-9435-4924-b6fa-9e9fe552d5a7, 销量： 1694
产品ID： product-9beadc07-aab0-438c-ac5e-bcc72b9d9c36, 销量： 1135
产品ID： product-43834316-4aca-4fb2-8d2d-c768513015c5, 销量： 256
            商品热销排行榜
            前五大热销产品
产品ID： product-b290c0d4-e919-4266-8eb5-7ab84b19862d, 销量： 18433
产品ID： product-e61a0642-d34f-46f4-a720-ee35940a5e7f, 销量： 18334
产品ID： product-ceeab7c3-69a7-4994-afc6-41b7bc463d44, 销量： 18196
产品ID： product-f2bdc549-8b3e-4db1-8cd4-a2ddef4f5d97, 销量： 17870
产品ID： product-f50ca2de-7fa4-45a3-bf32-23d34ac15a41, 销量： 17842
```
