




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、云數(shù)據(jù)庫 Redis 版最佳實踐RedisRedis/最佳實踐 PAGE 19 PAGE 19最佳實踐游戲玩家積分排行榜場景介紹ApsaraDB for Redis在功能上與Redis基本一致,因此很容易用它來實現(xiàn)一個在線游戲中的積分排行榜功能。代碼示例import java.util.ArrayList; import java.util.List; import java.util.Set; import java.util.UUID;import java.util.ArrayList; import java.util.List; import java.util.Set; impor
2、t java.util.UUID;import redis.clients.jedis.Jedis; import redis.clients.jedis.Tuple;public class GameRankSample static int TOTAL_SIZE = 20;public static void main(String args)/連接信息,從控制臺可以獲得String host = ; int port = 6379;Jedis jedis = new Jedis(host, port); try /實例ID及密碼String authString = jedis.auth
3、(xxxxxxxxxx:yyyyyyy);/kvstore_instance_id:passwordif (!authString.equals(OK)System.err.println(AUTH Failed: + authString); return;/Key(鍵)String key = 游戲名:奔跑吧,阿里!;/清除可能的已有數(shù)據(jù)jedis.del(key);/模擬生成若干個游戲玩家List playerList = new ArrayList(); for (int i = 0; i TOTAL_SIZE; +i)/ 隨 機 生 成 每 個 玩 家 的 ID playerList
4、.add(UUID.randomUUID().toString();System.out.println(輸入所有玩家 );/記錄每個玩家的得分for (int i = 0; i playerList.size(); i+)/隨機生成數(shù)字,模擬玩家的游戲得分int score(int)(Math.random()*5000);String member = playerList.get(i);System.out.println(玩家ID: + member + , 玩家得分: + score);/將玩家的ID和得分,都加到對應(yīng)key的SortedSet中去jedis.zadd(key, sc
5、ore, member);/輸出打印全部玩家排行榜System.out.println(); System.out.println(System.out.println(全部玩家排行榜);/從對應(yīng)key的SortedSet中獲取已經(jīng)排好序的玩家列表Set scoreList = jedis.zrevrangeWithScores(key, 0, -1); for (Tuple item : scoreList) System.out.println(玩家ID:+item.getElement()+, 玩家得分:+Double.valueOf(item.getScore().intValue()
6、;/輸出打印Top5玩家排行榜System.out.println(); System.out.println(+key); System.out.println(Top玩家);scoreList = jedis.zrevrangeWithScores(key, 0, 4); for (Tuple item : scoreList) System.out.println(玩家ID:+item.getElement()+, 玩家得分:+Double.valueOf(item.getScore().intValue();/輸出打印特定玩家列表System.out.println(); System
7、.out.println(System.out.println(積分在1000至2000的玩家);/從對應(yīng)key的SortedSet中獲取已經(jīng)積分在1000至2000的玩家列表scoreList = jedis.zrangeByScoreWithScores(key, 1000, 2000); for (Tuple item : scoreList) /從對應(yīng)key的SortedSet中獲取已經(jīng)積分在1000至2000的玩家列表scoreList = jedis.zrangeByScoreWithScores(key, 1000, 2000); for (Tuple item : scoreL
8、ist) System.out.println(玩家ID:+item.getElement()+, 玩家得分:+Double.valueOf(item.getScore().intValue(); catch (Exception e) e.printStackTrace();finallyjedis.quit(); jedis.close();運行結(jié)果在輸入了正確的ApsaraDB for Redis實例訪問地址和密碼之后,運行以上Java程序,輸出結(jié)果如下:輸入所有玩家玩家ID:9193e26f-6a71-4c76-8666-eaf8ee97ac86, 玩家得分: 3860玩家ID:db0
9、3520b-75a3-48e5-850a-071722ff7afb, 玩家得分: 4853玩家ID:d302d24d-d380-4e15-a4d6-84f71313f27a, 玩家得分: 2931玩家ID:bee46f9d-4b05-425e-8451-8aa6d48858e6, 玩家得分: 1796玩家ID:ec24fb9e-366e-4b89-a0d5-0be151a8cad0, 玩家得分: 2263玩家ID:e11ecc2c-cd51-4339-8412-c711142ca7aa, 玩家得分: 1848玩家ID:4c396f67-da7c-4b99-a783-25919d52d756,
10、玩家得分: 958玩家ID:a6299dd2-4f38-4528-bb5a-aa2d48a9f94a, 玩家得分: 2428玩家ID:2e4ec631-1e4e-4ef0-914f-7bf1745f7d65, 玩家得分: 4478玩家ID:24235a85-85b9-476e-8b96-39f294f57aa7, 玩家得分: 1655玩家ID:e3e8e1fa-6aac-4a0c-af80-4c4a1e126cd1, 玩家得分: 4064玩家ID:99bc5b4f-e32a-4295-bc3a-0324887bb77e, 玩家得分: 4852玩家ID:19e2aa6b-a2d8-4e56-bd
11、f7-8b59f64bd8e0, 玩家得分: 3394玩家ID:cb62bb24-1318-4af2-9d9b-fbff7280dbec, 玩家得分: 3405玩家ID:ec0f06da-91ee-447b-b935-7ca935dc7968, 玩家得分: 4391玩家ID:2c814a6f-3706-4280-9085-5fe5fd56b71c, 玩家得分: 2510玩家ID:9ee2ed6d-08b8-4e7f-b52c-9adfe1e32dda, 玩家得分: 63玩家ID:0293b43a-1554-4157-a95b-b78de9edf6dd, 玩家得分: 1008玩家ID:674bb
12、dd1-2023-46ae-bbe6-dfcd8e372430, 玩家得分: 2265玩家ID:34574e3e-9cc5-43ed-ba15-9f5405312692, 玩家得分: 3734游戲名:奔跑吧,阿里! 全部玩家排行榜玩家ID:db03520b-75a3-48e5-850a-071722ff7afb,:4853 玩家ID:99bc5b4f-e32a-4295-bc3a-0324887bb77e, 玩家得分:4852 玩家ID:2e4ec631-1e4e-4ef0-914f-7bf1745f7d65,:4478 玩家ID:ec0f06da-91ee-447b-b935-7ca935d
13、c7968, 玩家得分:4391 玩家ID:e3e8e1fa-6aac-4a0c-af80-4c4a1e126cd1,:4064 玩家ID:9193e26f-6a71-4c76-8666-eaf8ee97ac86,:3860 玩家ID:34574e3e-9cc5-43ed-ba15-9f5405312692, 玩家得分:3734 玩家ID:cb62bb24-1318-4af2-9d9b-fbff7280dbec,:3405 玩家ID:19e2aa6b-a2d8-4e56-bdf7-8b59f64bd8e0, 玩家得分:3394玩家ID:d302d24d-d380-4e15-a4d6-84f71
14、313f27a,:2931 玩家ID:2c814a6f-3706-4280-9085-5fe5fd56b71c,:2510 玩家ID:a6299dd2-4f38-4528-bb5a-aa2d48a9f94a,:2428 玩家ID:674bbdd1-2023-46ae-bbe6-dfcd8e372430, 玩家得分:2265 玩家ID:ec24fb9e-366e-4b89-a0d5-0be151a8cad0,:2263 玩家ID:e11ecc2c-cd51-4339-8412-c711142ca7aa,:1848 玩家ID:bee46f9d-4b05-425e-8451-8aa6d48858e6
15、, 玩家得分:1796 玩家ID:24235a85-85b9-476e-8b96-39f294f57aa7,:1655 玩家ID:0293b43a-1554-4157-a95b-b78de9edf6dd, 玩家得分:1008 玩家ID:4c396f67-da7c-4b99-a783-25919d52d756,:958 玩家ID:9ee2ed6d-08b8-4e7f-b52c-9adfe1e32dda,:63游戲名:奔跑吧,阿里!Top 玩家玩家ID:db03520b-75a3-48e5-850a-071722ff7afb,:4853 玩家ID:99bc5b4f-e32a-4295-bc3a-0
16、324887bb77e, 玩家得分:4852 玩家ID:2e4ec631-1e4e-4ef0-914f-7bf1745f7d65,:4478 玩家ID:ec0f06da-91ee-447b-b935-7ca935dc7968, 玩家得分:4391 玩家ID:e3e8e1fa-6aac-4a0c-af80-4c4a1e126cd1,:4064游戲名:奔跑吧,阿里! 積分在1000至2000的玩家玩家ID:0293b43a-1554-4157-a95b-b78de9edf6dd, 玩家得分:1008 玩家ID:24235a85-85b9-476e-8b96-39f294f57aa7, 玩家得分:1
17、655 玩家ID:bee46f9d-4b05-425e-8451-8aa6d48858e6, 玩家得分:1796 玩家ID:e11ecc2c-cd51-4339-8412-c711142ca7aa, 玩家得分:1848網(wǎng)上商城商品相關(guān)性分析場景介紹ApsaraDB for Redis在功能上與Redis基本一致,因此很容易利用它來實現(xiàn)一個網(wǎng)上商城的商品相關(guān)性分析程序。商品的相關(guān)性就是某個產(chǎn)品與其他另外某商品同時出現(xiàn)在購物車中的情況。這種數(shù)據(jù)分析對于電商行業(yè)是很重 要的,可以用來分析用戶購買行為。例如:在某一商品的detail頁面,推薦給用戶與該商品相關(guān)的其他商品;在添加購物車成功頁面,當用戶把
18、一個商品添加到購物車,推薦給用戶與之相關(guān)的其他商品;在貨架上將相關(guān)性比較高的幾個商品擺放在一起;利用ApsaraDB for Redis的有序集合,為每種商品構(gòu)建一個有序集合,集合的成員為和該商品同時出現(xiàn)在購物車中的商品,成員的score為同時出現(xiàn)的次數(shù)。每次A和B商品同時出現(xiàn)在購物車中時候,分別更新ApsaraDB for Redis中A和B對應(yīng)的有序集合,代碼示例 package shop . kvstore . aliyun . com ; import java . util . Set ; import redis . clients . jedis . Jedis ; import
19、 redis . clients . jedis . Tuple ; public class AliyunShoppingMall lipublic static void mainStringargslili/ApsaraDB for Redis的連接信息,從控制臺可以獲得liString host;liint port6379 ;liJedis jedisnew Jedishostport );litry li/ApsaraDB for Redis的實例ID及密碼liString authStringjedisauthxxxxxxxx:yyyyyyyy/kvstore_instance_
20、id:passwordliifauthStringequalsOK)liliSystemerrprintlnAUTH Failed);lireturn ;lili/產(chǎn)品列表liString key0 String key1 = 阿里云:產(chǎn)品:巧克力 ; String key2 = 阿里云:產(chǎn)品:可樂 ; String key3 = 阿里云:產(chǎn)品:口香糖 ; String key4 = 阿里云:產(chǎn)品:牛肉干 ; String key5 = 阿里云:產(chǎn)品:雞翅 ; final String aliyunProducts = new String key0 , key1 , key2 , key3
21、, key4 , key5 ;li/初始化,清除可能的已有舊數(shù)據(jù)liforint i0ialiyunProductslengthi jedisdelaliyunProductsi );lili/模擬用戶購物liforint i0i5i +) /模擬多人次的用戶購買行為 customersShopping ( aliyunProducts , i , jedis ); System . out . println (); /利用ApsaraDB for Redis來輸出各個商品間的關(guān)聯(lián)關(guān)系 for ( int i = 0 ; i aliyunProducts . length ; i +) Sy
22、stem . out . println ( 與 + aliyunProducts i + 一 起 被 購 買 的 產(chǎn) 品 有 ); Set relatedList = jedis . zrevrangeWithScoresaliyunProductsi01 );liforTuple itemrelatedListliSystemprintlnitemgetElementDoublevalueOfitemgetScoreintValue;System.out.println();catch(Exceptione)e. printStackTrace();finallyjedis.quit();
23、jedis.close(); private static void customersShopping ( String products , int i , Jedis jedis ) /簡單模擬3種購買行為,隨機選取作為用戶的購買選擇 int bought =( int )( Math . random ()* 3 );liifbought1)li/模擬業(yè)務(wù)邏輯:用戶購買了如下產(chǎn)品liSystemoutprintlniproducts0products2products1);li/將產(chǎn)品之間的關(guān)聯(lián)情況記錄到ApsaraDBforRedis的SortSet之中l(wèi)ijediszincrbyp
24、roducts01products1);lijediszincrby21products1);lielseifbought2)li/模擬業(yè)務(wù)邏輯:用戶購買了如下產(chǎn)品liSystemoutprintlniproducts4products2products3; /將產(chǎn)品之間的關(guān)聯(lián)情況記錄到ApsaraDB for Redis的SortSet之中 jedis . zincrby ( products 4 ,1,products2);jedis.zincrby(products4,1,products3);jedis.zincrby(products3,1, products 4 ); jedis
25、. zincrby ( products 3 , 1 , products 2 ); jedis . zincrby ( products 2 , 1 , products4);jedis.zincrby(products2,1,products3);elseif(bought=0) /模擬業(yè)務(wù)邏輯:用戶購買了如下產(chǎn)品 System . out . println ( 用戶 + i + 購買了 + products 1 + , + products 5 ); /將產(chǎn)品之間的關(guān)聯(lián)情況記錄到ApsaraDB for Redis的SortSet之中 jedis . zincrby ( product
26、s 5 , 1 , products 1 ); jedis . zincrby ( products 1 , 1 , products 5 ); 運行結(jié)果在輸入了正確的ApsaraDB for Redis實例訪問地址和密碼之后,運行以上Java程序,輸出結(jié)果如下: 用戶 0 購買了阿里云:產(chǎn)品:巧克力,阿里云:產(chǎn)品:雞翅 用戶 1 購買了阿里云:產(chǎn)品:牛肉干,阿里云:產(chǎn)品:可樂,阿里云:產(chǎn)品:口香糖li2 用戶 4 購買了阿里云:產(chǎn)品:巧克力,阿里云:產(chǎn)品:雞翅與阿里云:產(chǎn)品:啤酒一起被購買的產(chǎn)品有l(wèi)i1li1li2li:阿里云:產(chǎn)品:啤酒, 共同購買次數(shù): 1 商品名稱:阿里云:產(chǎn)品:可樂,
27、 共同購買次數(shù): 1 與阿里云:產(chǎn)品:可樂一起被購買的產(chǎn)品有l(wèi)i2li2li1li1li2li:產(chǎn)品:可樂, 共同購買次數(shù): 2 與阿里云:產(chǎn)品:牛肉干一起被購買的產(chǎn)品有l(wèi)i2li購買次數(shù): 2 與阿里云:產(chǎn)品:雞翅一起被購買的產(chǎn)品有 商品名2 消息的發(fā)布與訂閱場景介紹ApsaraDB for Redis也提供了與Redis相同的消息發(fā)布(pub)與訂閱(sub)功能。即一個client發(fā)布消息,其他多個client訂閱消息。需要注意的是,ApsaraDB for Redis發(fā)布的消息是非持久的,即消息發(fā)布者只負責(zé)發(fā)送消息,而不管消息是否有接收方,也不會保存之前發(fā)送的消息,即發(fā)布的消息即發(fā)即失
28、;消息訂閱者也只能得到訂閱之后的消息,頻道(channel)中此前的消息將無從獲得。此外消息發(fā)布者(即publish客戶端),無需獨占與服務(wù)器端的連接,你可以在發(fā)布消息的同時,使用同一個客戶端連接進行其他操作(例如List操作等)。但是消息訂閱者(即subscribe客戶端),需要獨占與服務(wù)器端的連接,即進行subscribe期間,該客戶端無法執(zhí)行其他操作,而是以阻塞的方式等待頻道(channel)中的消息;因 此消息訂閱者需要使用單獨的服務(wù)器連接,或者需要在單獨的線程中使用(參見如下示例)。代碼示例package ; import redis.clients.jedis.Jedis;pack
29、age ; import redis.clients.jedis.Jedis;public class KVStorePubClient private Jedis jedis;/public KVStorePubClient(String host,int port, String password) jedis = new Jedis(host,port);/KVStore的實例ID及密碼/KVStore的實例ID及密碼String authString = jedis.auth(password);/kvstore_instance_id:passwordif (!authString.
30、equals(OK)System.err.println(AUTH Failed: + authString); return;public void pub(String channel,String message)System.out.println( 發(fā)布(PUBLISH) Channel:+channel+ 發(fā)送出的Message:+message);jedis.publish(channel, message);public void close(String channel)System.out.println( 發(fā)布(PUBLISH)結(jié)束 Channel:+channel+ M
31、essage:quit);/消息發(fā)布者結(jié)束發(fā)送,即發(fā)送一個quit消息; jedis.publish(channel, quit);package ; import redis.clients.jedis.Jedis;package ; import redis.clients.jedis.Jedis;import redis.clients.jedis.JedisPubSub;public class KVStoreSubClient extends Thread private Jedis jedis;private String channel;private JedisPubSub l
32、istener;public KVStoreSubClient(String host,int port, String password) jedis = new Jedis(host,port);/ApsaraDB for Redis的實例ID及密碼String authString = jedis.auth(password);/kvstore_instance_id:passwordif (!authString.equals(OK)System.err.println(AUTH Failed: + authString); return;publicvoidsetChannelAnd
33、Listener(JedisPubSublistener,Stringchannel) this.listener=listener;this.channel=channel;private void subscribe() if(listener=null | channel=null)System.err.println(Error:SubClient listener or channel is null);System.out.println( 訂閱(SUBSCRIBE) Channel:+channel); System.out.println();/接收者在偵聽訂閱的消息時,將會阻
34、塞進程,直至接收到quit消息(被動方式),或主動取消訂閱jedis.subscribe(listener, channel);public void unsubscribe(String channel)System.out.println( 取消訂閱(UNSUBSCRIBE) Channel:+channel); System.out.println();listener.unsubscribe(channel);Overridepublic void run() trySystem.out.println();System.out.println(訂閱消息SUBSCRIBE 開始);su
35、bscribe();System.out.println(訂閱消息SUBSCRIBE 結(jié)束); System.out.println();catch(Exception e) e.printStackTrace();package ; import redis.clients.jedis.JedisPubSub;package ; import redis.clients.jedis.JedisPubSub;public class KVStoreMessageListener extends JedisPubSubOverridepublic void onMessage(String ch
36、annel, String message) System.out.println( 訂閱(SUBSCRIBE)接收到的Message: + message ); System.out.println();/當接收到的message為quit時,取消訂閱(被動方式) if(message.equalsIgnoreCase(quit)/當接收到的message為quit時,取消訂閱(被動方式) if(message.equalsIgnoreCase(quit)this.unsubscribe(channel);Overridepublic void onPMessage(String patte
37、rn, String channel, String message) / TODO Auto-generated method stubOverridepublic void onSubscribe(String channel, int subscribedChannels) / TODO Auto-generated method stubOverridepublic void onUnsubscribe(String channel, int subscribedChannels) / TODO Auto-generated method stubOverridepublic void
38、 onPUnsubscribe(String pattern, int subscribedChannels) / TODO Auto-generated method stubOverridepublic void onPSubscribe(String pattern, int subscribedChannels) / TODO Auto-generated method stubpackage ; import java.util.UUID;package ; import java.util.UUID;import redis.clients.jedis.JedisPubSub; p
39、ublic class KVStorePubSubTest /ApsaraDB for Redis的連接信息,從控制臺可以獲得static final String host = ; static final int port = 6379;static final String password=xxxxxxxxxx:yyyyyyyy;/kvstore_instance_id:passwordpublic static void main(String args) throws ExceptionKVStorePubClient pubClient = new KVStorePubClien
40、t(host, port,password);final String channel = KVStore頻道-A;final String channel = KVStore頻道-A;/消息發(fā)送者開始發(fā)消息,此時還無人訂閱,所以此消息不會被接收pubClient.pub(channel, Aliyun消息1:(此時還無人訂閱,所以此消息不會被接收));/消息接收者KVStoreSubClient subClient = new KVStoreSubClient(host, port,password);JedisPubSub listener = new KVStoreMessageList
41、ener(); subClient.setChannelAndListener(listener, channel);/消息接收者開始訂閱subClient.start();/消息發(fā)送者繼續(xù)發(fā)消息for (int i = 0; i 訂閱(SUBSCRIBE) Channel:KVStore頻道-A 發(fā)布(PUBLISH) Channel:KVStore頻道-A 發(fā)送出的Message:0f9c2cee-77c7-4498-89a0-1dc5a2f65889 訂閱(SUBSCRIBE)接收到的Message:0f9c2cee-77c7-4498-89a0-1dc5a2f65889 發(fā)布(PUBL
42、ISH) Channel:KVStore頻道-A 發(fā)送出的Message:ed5924a9-016b-469b-8203-7db63d06f812 訂閱(SUBSCRIBE)接收到的Message:ed5924a9-016b-469b-8203-7db63d06f812 發(fā)布(PUBLISH) Channel:KVStore頻道-A 發(fā)送出的Message:f1f84e0f-8f35-4362-9567-25716b1531cd 訂閱(SUBSCRIBE)接收到的Message:f1f84e0f-8f35-4362-9567-25716b1531cd 訂閱(SUBSCRIBE)接收到的Mess
43、age:f1f84e0f-8f35-4362-9567-25716b1531cd 發(fā)布(PUBLISH) Channel:KVStore頻道-A 發(fā)送出的Message:746bde54-af8f-44d7-8a49-37d1a245d21b 訂閱(SUBSCRIBE)接收到的Message:746bde54-af8f-44d7-8a49-37d1a245d21b 發(fā)布(PUBLISH) Channel:KVStore頻道-A 發(fā)送出的Message:8ac3b2b8-9906-4f61-8cad-84fc1f15a3ef 訂閱(SUBSCRIBE)接收到的Message:8ac3b2b8-9
44、906-4f61-8cad-84fc1f15a3ef 取消訂閱(UNSUBSCRIBE) Channel:KVStore頻道-A訂閱消息SUBSCRIBE 結(jié)束(PUBLISH)Channel:KVStore頻道-AMessage:Aliyun消息2:(此時訂閱取消,所以此消息不會被接收) 發(fā)布(PUBLISH)結(jié)束 Channel:KVStore頻道-A Message:quit以上示例中僅演示了一個發(fā)布者與一個訂閱者的情況,實際上發(fā)布者與訂閱者都可以為多個,發(fā)送消息的頻道(channel)也可以是多個,對以上代碼稍作修改即可。管道傳輸(pipeline)場景介紹ApsaraDB for R
45、edis提供了與Redis相同的管道傳輸(pipeline)機制。管道(pipeline)將客戶端client與服務(wù)器端的交互明確劃分為單向的發(fā)送請求(Send Request)和接收響應(yīng)(Receive Response):用戶可以將多個操作連續(xù)發(fā)給服務(wù)器,但在此期間服務(wù)器端并不對每個操作命令發(fā)送響應(yīng)數(shù)據(jù);全部請求發(fā)送完畢后用戶 關(guān)閉請求,開始接收響應(yīng)獲取每個操作命令的響應(yīng)結(jié)果。管道(pipeline)在某些場景下非常有用,比如有多個操作命令需要被迅速提交至服務(wù)器端,但用戶并不依賴 每個操作返回的響應(yīng)結(jié)果,對結(jié)果響應(yīng)也無需立即獲得,那么管道就可以用來作為優(yōu)化性能的批處理工具。性 能提升的原因
46、主要是減少了TCP連接中交互往返的開銷。不過在程序中使用管道請注意,使用pipeline時客戶端將獨占與服務(wù)器端的連接,此期間將不能進行其他非管 道類型操作,直至pipeline被關(guān)閉;如果要同時執(zhí)行其他操作,可以為pipeline操作單獨建立一個連接,將其 與常規(guī)操作分離開來。代碼示例1package ; import java.util.Date;package ; import java.util.Date;import redis.clients.jedis.Jedis;import redis.clients.jedis.Pipeline;public class RedisPipe
47、linePerformanceTest static final String host = ; static final int port = 6379;static final String password = instance_id:password;public static void main(String args) Jedis jedis = new Jedis(host, port);/ApsaraDB for Redis的實例ID及密碼String authString = jedis.auth(password);/ kvstore_instance_id:passwor
48、dif (!authString.equals(OK) System.err.println(AUTH Failed: + authString); jedis.close();return;/連續(xù)執(zhí)行多次命令操作final int COUNT=5000;String key = KVStore-Tanghan;/ 1 不使用pipeline操作 jedis.del(key);/ 初 始 化 key Date ts1 = new Date();for (int i = 0; i COUNT; i+) /發(fā)送一個請求,并接收一個響應(yīng)(Send Request and Receive Respon
49、se) jedis.incr(key);Date ts2 = new Date();System.out.println(不用Pipelinevalue為:+jedis.get(key)+(ts2.getTime(ms);/2 對比使用pipeline操作 jedis.del(key);/ 初 始 化 key Pipeline p1 = jedis.pipelined(); Date ts3 = new Date();for (int i = 0; i value為:5000 操作用時:5844ms 使用Pipeline value為:5000 操作用時:78ms在輸入了正確的ApsaraDB
50、 for Redis實例訪問地址和密碼之后,運行以上Java程序,輸出結(jié)果如下。從中可以看出使用pipeline的性能要快的多。不用Pipeline value為:5000 操作用時:5844ms 使用Pipeline value為:5000 操作用時:78ms代碼示例2package ; import java.util.List;package ; import java.util.List;import redis.clients.jedis.Jedis;import redis.clients.jedis.Pipeline; import redis.clients.jedis.Res
51、ponse;public class PipelineClientTest static final String host = ; static final int port = 6379;static final String password = instance_id:password;public static void main(String args) Jedis jedis = new Jedis(host, port);/ ApsaraDB for Redis的實例ID及密碼String authString = jedis.auth(password);/ kvstore_
52、instance_id:passwordif (!authString.equals(OK) System.err.println(AUTH Failed: + authString); jedis.close();return;String key = KVStore-Test1; jedis.del(key);/初始化/ 方法1Pipeline p1 = jedis.pipelined();System.out.println(方法1); for (int i = 0; i 5; i+) p1.incr(key);System.out.println(Pipeline發(fā)送請求);/ 發(fā) 送
53、 請 求 完 成 , 開 始 接 收 響 應(yīng) System.out.println(發(fā)送請求完成,開始接收響應(yīng)); List responses = p1.syncAndReturnAll();if (responses = null | responses.isEmpty() jedis.close();throw new RuntimeException(Pipeline error: 沒有接收到響應(yīng));for (Object resp : responses) System.out.println(Pipeline接收響應(yīng)Responseresp.toString();System.ou
54、t.println();/ 方法2System.out.println(方法2);jedis.del(key);/初始化Pipeline p2 = jedis.pipelined();/ 需 要 先 聲 明 Response Response r1 = p2.incr(key); System.out.println(Pipeline發(fā)送請求);Response r2 = p2.incr(key); System.out.println(Pipeline發(fā)送請求);Response r3 = p2.incr(key); System.out.println(Pipeline發(fā)送請求);Resp
55、onse r4 = p2.incr(key); System.out.println(Pipeline發(fā)送請求);Response r5 = p2.incr(key); System.out.println(Pipeline發(fā)送請求);tryr1.get(); /此時還未開始接收響應(yīng),所以此操作會出錯catch(Exception e)System.out.println( );catch(Exception e)System.out.println( );/ 發(fā)送請求完成,開始接收響應(yīng)System.out.println(發(fā)送請求完成,開始接收響應(yīng)); p2.sync();System.ou
56、t.println(Pipeline接收響應(yīng)Responser1.get(); System.out.println(Pipeline接收響應(yīng)Responser2.get(); System.out.println(Pipeline接收響應(yīng)Responser3.get(); System.out.println(Pipeline接收響應(yīng)Responser4.get(); System.out.println(Pipeline接收響應(yīng)Responser5.get();jedis.close();運行結(jié)果2方法1Pipeline發(fā)送請求Pipeline發(fā)送請求Pipeline發(fā)送請求Pipelin
57、e發(fā)送請求Pipeline發(fā)送請求方法1Pipeline發(fā)送請求Pipeline發(fā)送請求Pipeline發(fā)送請求Pipeline發(fā)送請求Pipeline發(fā)送請求發(fā)送請求完成,開始接收響應(yīng)Pipeline接收響應(yīng)Response: 1Pipeline接收響應(yīng)Response: 2Pipeline接收響應(yīng)Response: 3Pipeline接收響應(yīng)Response: 4Pipeline接收響應(yīng)Response: 5方法2Pipeline發(fā)送請求Pipeline發(fā)送請求Pipeline發(fā)送請求Pipeline發(fā)送請求Pipeline發(fā)送請求Pipelineerror:還未開始接收響應(yīng) 發(fā) 送 請
58、求 完 成 , 開 始 接 收 響 應(yīng) Pipeline接收響應(yīng)Response: 1Pipeline接收響應(yīng)Response: 2Pipeline接收響應(yīng)Response: 3Pipeline接收響應(yīng)Response: 4Pipeline接收響應(yīng)Response: 5事務(wù)處理(transcation)場景介紹ApsaraDB for Redis支持Redis中定義的事務(wù)(transcation)機制,即用戶可以使用MULTI,EXEC,DISCARD,WATCH,UNWATCH指令用來執(zhí)行原子性的事務(wù)操作。需要強調(diào)的是,Redis中定義的事務(wù) HYPERLINK http:/redis.io
59、/topics/transactions) (http:/redis.io/topics/transactions),并不是關(guān)系數(shù)據(jù)庫中嚴格意義上的 。當Redis事務(wù)中的某個操作執(zhí)行失敗,或者用DISCARD取消事務(wù)時候,Redis并不執(zhí)行事務(wù)回滾,在使 用時要注意這點。代碼示例1:兩個client操作不同的keypackage ; package ; import java.util.List;import redis.clients.jedis.Jedis; import redis.clients.jedis.Transaction;public class KVStoreTranscationTest static final String host = ; static final int port = 6379;static final String
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度新能源儲能技術(shù)貸款擔(dān)保合同
- 二零二五年度人力資源招聘傭金支付及人才引進合同
- 二零二五年度租賃合同解除與合同解除爭議訴訟結(jié)果起訴狀
- 電腦銷售合同協(xié)議書
- 石家莊二手房房屋買賣合同
- 獸藥購銷合同
- 2024簡單租房合同范本常用3
- 高空作業(yè)施工合同
- 物聯(lián)網(wǎng)設(shè)備安裝與維護合同
- 演員聘用合同協(xié)議
- 《信息技術(shù)基礎(chǔ)》高職全套教學(xué)課件
- GB/T 19077-2024粒度分析激光衍射法
- 露天礦山開采施工組織方案
- 北京市西城區(qū)2022-2023學(xué)年高三上學(xué)期1月期末考試歷史試題 附答案
- 2024關(guān)于進一步提升基層應(yīng)急管理能力的意見學(xué)習(xí)解讀課件
- 幼兒園小班健康公開課《笑一笑》課件
- 單詞連連看答題闖關(guān)游戲課堂互動課件1
- 16S524塑料排水檢查井-井筒直徑Φ700~Φ1000
- 加強文物古籍保護利用(2022年廣東廣州中考語文試卷非連續(xù)性文本閱讀試題及答案)
- 2024小學(xué)數(shù)學(xué)義務(wù)教育新課程標準(2022版)必考題庫附含答案
- 2024年上半年教師資格證《高中物理》真題及答案
評論
0/150
提交評論