華為云計(jì)算 云知識(shí) 使用分布式緩存服務(wù)DCS實(shí)現(xiàn)排行榜功能
使用分布式緩存服務(wù)DCS實(shí)現(xiàn)排行榜功能

方案概述

在網(wǎng)頁和APP中經(jīng)常需要用到榜單的功能,對(duì)某個(gè)key-value的列表進(jìn)行降序顯示。當(dāng)操作和查詢并發(fā)大的時(shí)候,使用傳統(tǒng) 數(shù)據(jù)庫 就會(huì)遇到性能瓶頸,造成較大的時(shí)延。

使用分布式緩存服務(wù)(DCS)的Redis版本,可以實(shí)現(xiàn)一個(gè)商品熱銷排行榜的功能。它的優(yōu)勢(shì)在于:

  • 數(shù)據(jù)保存在內(nèi)存中,讀寫速度非??臁?/li>
  • 提供字符串(String)、鏈表(List)、集合(Set)、哈希(Hash)等多種數(shù)據(jù)結(jié)構(gòu)類型的存儲(chǔ)。

前提條件

  • 已創(chuàng)建DCS緩存實(shí)例,且狀態(tài)為“運(yùn)行中”。
  • 客戶端所在服務(wù)器與DCS緩存實(shí)例網(wǎng)絡(luò)互通:
    • 客戶端與Redis實(shí)例所在VPC為同一VPC

      同一VPC內(nèi)網(wǎng)絡(luò)默認(rèn)互通。

    • 客戶端與Redis實(shí)例所在VPC為相同region下的不同VPC

      如果客戶端與Redis實(shí)例不在相同VPC中,可以通過建立VPC對(duì)等連接方式連通網(wǎng)絡(luò),具體請(qǐng)參考:緩存實(shí)例是否支持跨VPC訪問?。

    • 客戶端與Redis實(shí)例所在VPC不在相同region

      如果客戶端服務(wù)器和Redis實(shí)例不在同一region,僅支持通過 云專線 打通網(wǎng)絡(luò),請(qǐng)參考云專線。

    • 公網(wǎng)訪問

      客戶端公網(wǎng)訪問Redis 4.0/5.0/6.0實(shí)例時(shí),需要開啟實(shí)例公網(wǎng)訪問開關(guān),具體請(qǐng)參考開啟Redis 4.0/5.0/6.0公網(wǎng)訪問并獲取公網(wǎng)訪問地址

  • 客戶端所在的服務(wù)器已安裝JDK1.8以上版本和開發(fā)工具(本文檔以安裝Eclipse為例),下載jedis客戶端(單擊此處直接下載jar包)。

    本文檔下載的開發(fā)工具和客戶端僅為示例,您可以選擇其它類型的工具和客戶端。

實(shí)施步驟

  1. 在服務(wù)器上運(yùn)行Eclipse,單擊“File > New Project”創(chuàng)建一個(gè)java工程,工程名稱使用代碼示例中的包名“dcsDemo02”。
  2. 單擊“New > Class”創(chuàng)建一個(gè)productSalesRankDemo.java文件。
  3. 將以下示例代碼復(fù)制到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實(shí)例連接地址和端口,需替換為實(shí)際獲取的值
            String host = "192.168.0.246";
            int port = 6379;
    
            Jedis jedisClient = new Jedis(host, port);
    
            try {
                // Redis實(shí)例連接密碼,需替換為實(shí)際獲取的值
                String authMsg = jedisClient.auth("******");
                if (!authMsg.equals("OK")) {
                    System.out.println("AUTH FAILED: " + authMsg);
                }
    
                //鍵
                String key = "商品熱銷排行榜";
    
                jedisClient.del(key);
    
                //隨機(jī)生成產(chǎn)品數(shù)據(jù)
                List productList = new ArrayList<>();
                for(int i = 0; i < PRODUCT_KINDS; i ++) {
                    productList.add("product-" + UUID.randomUUID().toString());
                }
    
                //隨機(jī)生成銷量
                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 sortedProductList = jedisClient.zrevrangeWithScores(key, 0, -1);
                for(Tuple product : sortedProductList) {
                    System.out.println("產(chǎn)品ID: " + product.getElement() + ", 銷量: " 
                            + Double.valueOf(product.getScore()).intValue());
                }
    
                System.out.println();
                System.out.println("                   "+key);
                System.out.println("                   前五大熱銷產(chǎn)品");
    
                //獲取銷量前五列表并輸出
                Set sortedTopList = jedisClient.zrevrangeWithScores(key, 0, 4);
                for(Tuple product : sortedTopList) {
                    System.out.println("產(chǎn)品ID: " + product.getElement() + ", 銷量: " 
                            + Double.valueOf(product.getScore()).intValue());
                }
            }
            catch (Exception e) {
                e.printStackTrace();
            }
            finally {
                jedisClient.quit();
                jedisClient.close();
            }
        }
    
    }
  4. 將DCS緩存實(shí)例的連接地址、端口以及連接密碼配置到示例代碼文件中。
  5. 編譯并運(yùn)行得到結(jié)果。

運(yùn)行結(jié)果

編譯并運(yùn)行以上Demo程序,結(jié)果如下:

 商品熱銷排行榜
產(chǎn)品ID: product-b290c0d4-e919-4266-8eb5-7ab84b19862d, 銷量: 18433
產(chǎn)品ID: product-e61a0642-d34f-46f4-a720-ee35940a5e7f, 銷量: 18334
產(chǎn)品ID: product-ceeab7c3-69a7-4994-afc6-41b7bc463d44, 銷量: 18196
產(chǎn)品ID: product-f2bdc549-8b3e-4db1-8cd4-a2ddef4f5d97, 銷量: 17870
產(chǎn)品ID: product-f50ca2de-7fa4-45a3-bf32-23d34ac15a41, 銷量: 17842
產(chǎn)品ID: product-d0c364e0-66ec-48a8-9ac9-4fb58adfd033, 銷量: 17782
產(chǎn)品ID: product-5e406bbf-47c7-44a9-965e-e1e9b62ed1cc, 銷量: 17093
產(chǎn)品ID: product-0c4d31ee-bb15-4c88-b319-a69f74e3c493, 銷量: 16432
產(chǎn)品ID: product-a986e3a4-4023-4e00-8104-db97e459f958, 銷量: 16380
產(chǎn)品ID: product-a3ac9738-bed2-4a9c-b96a-d8511ae7f03a, 銷量: 15305
產(chǎn)品ID: product-6b8ad4b7-e134-480f-b3ae-3d35d242cb53, 銷量: 14534
產(chǎn)品ID: product-26a9b41b-96b1-4de0-932b-f78d95d55b2d, 銷量: 11417
產(chǎn)品ID: product-1f043255-a1f9-40a0-b48b-f40a81d07e0e, 銷量: 10875
產(chǎn)品ID: product-c8fee24c-d601-4e0e-9d18-046a65e59835, 銷量: 10521
產(chǎn)品ID: product-5869622b-1894-4702-b750-d76ff4b29163, 銷量: 10271
產(chǎn)品ID: product-ff0317d2-d7be-4021-9d25-1f997d622768, 銷量: 9909
產(chǎn)品ID: product-da254e81-6dec-4c76-928d-9a879a11ed8d, 銷量: 9504
產(chǎn)品ID: product-fa976c02-b175-4e82-b53a-8c0df96fe877, 銷量: 8630
產(chǎn)品ID: product-0624a180-4914-46b9-84d0-9dfbbdaa0da2, 銷量: 8405
產(chǎn)品ID: product-d0079955-eaea-47b2-845f-5ff05a110a70, 銷量: 7930
產(chǎn)品ID: product-a53145ef-1db9-4c4d-a029-9324e7f728fe, 銷量: 7429
產(chǎn)品ID: product-9b1a1fd1-7c3b-4ae8-9fd3-ab6a0bf71cae, 銷量: 5944
產(chǎn)品ID: product-cf894aee-c1cb-425e-a644-87ff06485eb7, 銷量: 5252
產(chǎn)品ID: product-8bd78ba8-f2c4-4e5e-b393-60aa738eceae, 銷量: 4903
產(chǎn)品ID: product-89b64402-c624-4cf1-8532-ae1b4ec4cabc, 銷量: 4527
產(chǎn)品ID: product-98b85168-9226-43d9-b3cf-ef84e1c3d75f, 銷量: 3095
產(chǎn)品ID: product-0dda314f-22a7-464b-ab8c-2f8f00823a39, 銷量: 2425
產(chǎn)品ID: product-de7eb085-9435-4924-b6fa-9e9fe552d5a7, 銷量: 1694
產(chǎn)品ID: product-9beadc07-aab0-438c-ac5e-bcc72b9d9c36, 銷量: 1135
產(chǎn)品ID: product-43834316-4aca-4fb2-8d2d-c768513015c5, 銷量: 256

            商品熱銷排行榜
            前五大熱銷產(chǎn)品
產(chǎn)品ID: product-b290c0d4-e919-4266-8eb5-7ab84b19862d, 銷量: 18433
產(chǎn)品ID: product-e61a0642-d34f-46f4-a720-ee35940a5e7f, 銷量: 18334
產(chǎn)品ID: product-ceeab7c3-69a7-4994-afc6-41b7bc463d44, 銷量: 18196
產(chǎn)品ID: product-f2bdc549-8b3e-4db1-8cd4-a2ddef4f5d97, 銷量: 17870
產(chǎn)品ID: product-f50ca2de-7fa4-45a3-bf32-23d34ac15a41, 銷量: 17842