玩家阿里云数据库Redis版-最佳实践-D

阿里云数据库  时间:2021-02-01  阅读:()

最佳实践

游戏玩家积分排行榜

场景介绍

ApsaraDB for Redis在功能上不Redis基本一致因此很容易用它来实现一个在线游戏中的积分排行榜功能。代码示例importjava uti l ArrayList;importjava uti l List;importjava uti l Set;importjava uti l UUID;import redis cl ientsjedisJedis;import rediscl ientsjedisTuple;publ ic classGameRankSample

{ static int TOTAL_SIZE= 20;publ ic static void main(String[] args)

{

//连接信息从"控制台可以获得

String host= xxxxxxxxxx m cnhz1 kvstore al iyuncs com";int port = 6379;

Jedisjedis =new Jedis(host,port);try{

//实例ID及密码

String au thString =j edis auth("xxxxxxxxxx:yyyyyyy");//kvstore_instance_id:passwo rdif (!authString equals("OK"))

{

System err println("AUTH Fai led: " +authString);retu rn;

}

//Key(键)

String key= "游戏名奔跑吧阿里 ";

1

//清除可能的已有数据jedis del(key);

//模拟生成若干个游戏玩家

List<String>playerList =new ArrayList<String>();for (int i= 0; i <TOTAL_SIZE;++i)

{

//随机生成每个玩家的IDplayerListadd(UUID randomUUID()toString());

}

System out println("输入所有玩家");

//记录每个玩家的得分for (int i= 0; i <playerListsize(); i++)

{

//随机生成数字模拟玩家的游戏得分intscore=(int)(Math random()*5000);

String member= playerList get(i);

System out println("玩家ID " +member+ " 玩家得分: " + score);

//将玩家的ID和得分都加到对应key的SortedSet中去jedis zadd(key, score,member);

}

//输出打印全部玩家排行榜

System out println()";

System out println( "+key);

System out println(" 全部玩家排行榜 ");

//从对应key的SortedSet中获取已经排好序的玩家列表Set<Tu ple>scoreList=jedis zrevran geWith Scores(key,0, -1); fo r (Tupleitem: scoreList) {

System out println("玩家ID "+item getElement()+" 玩家得分

:"+Double valueOf(item getScore()) intValue());

}

//输出打印To p 5玩家排行榜

System out println();

System out println(" "+key);

System out println(" Top玩家");scoreList=jedis zrevran geWith Scores(key,0,4);for (Tuple item: scoreList) {

System out println("玩家ID "+item getElement()+" 玩家得分

:"+Double valueOf(item getScore()) intValue());

}

//输出打印特定玩家列表

System out println();

System out println(" "+key);

System out println(" 积分在1000至2000的玩家");

2

//从对应key的So rted Set中获取已经积分在1000至2000的玩家列表scoreList= jedis zrangeByScoreWithScores(key, 1000, 2000);for (Tuple item: scoreList) {

System out println("玩家ID "+item getElement()+" 玩家得分

:"+Double valueOf(item getScore()) intValue());

}

}catch(Exception e)

{e printStackTrace();

}final ly{jedisquit();jedisclose();

}

}

}

运行结果

在输入了正确的ApsaraDB for Redis实例访问地址和密码乊后运行以上Java程序输出结果如下

输入所有玩家

玩家ID9193e26f-6a71-4c76-8666-eaf8ee97ac86 玩家得分: 3860

玩家IDdb03520b-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4c396f 67-da7c-4b99-a783-25919d 52d756玩家得分: 958

玩家ID a6299dd2-4f 38-4528-bb5a-aa2d48a9f94a 玩家得分:2428

玩家ID 2e4ec631-1e4e-4ef 0-914f-7bf1745f7d 65 玩家得分:4478

玩家ID 24235a 85-85b9-476e-8b96-39f294f57aa7玩家得分: 1655

玩家ID e3e8e1fa-6aac-4a0c-af80-4c4a 1e126cd1 玩家得分:4064

玩家ID99bc5b4f-e32a-4295-bc3a-0324887bb77e 玩家得分: 4852

玩家ID 19e2aa6b-a2d8-4e56-bdf7-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 674bbdd1-2023-46ae-bbe6-dfcd8e372430 玩家得分: 2265

玩家ID 34574e3e-9cc5-43ed-ba15-9f 5405312692玩家得分: 3734

游戏名奔跑吧阿里

全部玩家排行榜

玩家ID db03520b-75a3-48e5-850a-071722ff 7afb玩家得分:4853

玩家ID99bc5b4f-e32a-4295-bc3a-0324887bb77e玩家得分:4852

玩家ID 2e4ec631-1e4e-4ef 0-914f-7bf1745f7d 65 玩家得分:4478

玩家ID ec0f06da-91ee-447b-b935-7ca935dc7968玩家得分:4391

玩家ID e3e8e1fa-6aac-4a0c-af80-4c4a 1e126cd1 玩家得分: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

3

玩家ID d302d 24d-d380-4e 15-a4d 6-84f71313f 27a 玩家得分:2931

玩家ID 2c814a6f-3706-4280-9085-5fe5fd56b71c 玩家得分:2510

玩家ID a6299dd2-4f 38-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玩家得分:1796玩

家ID 24235a85-85b9-476e-8b96-39f294f 57aa7 玩家得分:1655玩

家ID0293b43a-1554-4157-a95b-b78de9edf6dd玩家得分:1008玩

家ID4c396f 67-da7c-4b99-a783-25919d52d 756玩家得分:958玩

家ID 9ee2ed6d-08b8-4e7f-b52c-9adfe1e32dda 玩家得分:63

玩家ID99bc5b4f-e32a-4295-bc3a-0324887bb77e玩家得分:4852

玩家ID 2e4ec631-1e4e-4ef 0-914f-7bf1745f7d 65 玩家得分:4478

玩家ID ec0f06da-91ee-447b-b935-7ca935dc7968玩家得分:4391

玩家ID e3e8e1fa-6aac-4a0c-af80-4c4a 1e126cd1 玩家得分:4064

游戏名奔跑吧阿里

积分在1000至2000的玩家

玩家ID0293b43a-1554-4157-a95b-b78de9edf6dd玩家得分:1008

玩家ID 24235a 85-85b9-476e-8b96-39f294f57aa7玩家得分:1655

玩家ID bee46f9d-4b05-425e-8451-8aa6d48858e6玩家得分:1796玩

家ID e11ecc2c-cd51-4339-8412-c711142ca7aa 玩家得分:1848

网上商城商品相关性分析

场景介绍

ApsaraDB for Redis在功能上不Redis基本一致因此很容易利用它来实现一个网上商城的商品相关性分析程序。

商品的相关性就是某个产品不其他另外某商品同时出现在购物车中的情况。这种数据分析对于电商行业是很重

要的可以用来分析用户购买行为。例如

1在某一商品的detail页面推荐给用户不该商品相关的其他商品

2在添加购物车成功页面当用户把一个商品添加到购物车推荐给用户不乊相关的其他商品

3在货架上将相关性比较高的几个商品摆放在一起

利用ApsaraDB for Redis的有序集合,为每种商品构建一个有序集合集合的成员为和该商品同时出现在购物车中的商品成员的score为同时出现的次数。每次A和B商品同时出现在购物车中时候分别更新ApsaraDB forRedis中A和B对应的有序集合

代码示例

4

<ol><l i> package shop kvstore al iyun com;</l i><l i></l i><l i> importjava uti l Set;</l i><l i> import redis cl ientsjedis Jedis;</l i><l i> import redis cl ients jedis Tuple;</l i><l i></l i><l i> publ icclassAl iyunShoppingMal l {

</l i><l i></l i><l i>publ ic static void main(String[]args)</l i><l i>{</l i><l i>//ApsaraDB for Redis的连接信息从控制台可以获得</l i><l i>String host="xxxxxxxx mcnhza kvstore al iyuncs com" ;</l i><l i> int port=6379;

</l i><l i></l i><l i>Jedisjedis =newJedis (host,port);</l i><l i></l i><l i>try{</l i><l i>//ApsaraDB for Redis的实例ID及密码</l i><l i> String authString=jedis auth( "xxxxxxxx:yyyyyyyy" );//kvstore_instance_id:password

</l i><l i></l i><l i> if (!authString equals ( "OK" ))</l i><l i>{</l i><l i>System err println( "AUTH Fai led: " +authString);</l i><l i>return;</l i><l i>}</l i><l i></l i><l i>//产品列表</l i><l i>String key0="阿里云:产品:啤酒" ;

</l i><l i> String key1 ="阿里云:产品:巧克力" ;</l i><l i> String key2= "阿里云:产品:可乐" ;</l i><l i> String key3= "阿里云:产品:口香糖" ;</l i><l i> Strin g key4= "阿里云:产品:牛肉干" ;</l i><l i> String key5 ="阿里云:产品:鸡翅" ;

</l i><l i></l i><l i></l i><l i>final String [] al iyunProducts= new String[]{key0,key1,key2,key3,key4,key5};

</l i><l i></l i><l i>//初始化清除可能的已有旧数据</l i><l i>for (int i=0; i <al iyunProducts length; i++) {</l i><l i>jedis del (al iyunProducts[ i ]);</l i><l i>}</l i><l i></l i><l i></l i><l i>//模拟用户购物</l i><l i>for ( int i=0; i < 5; i

++) {//模拟多人次的用户购买行为</l i><l i></l i><l i>customersShopping( al iyunProducts, i ,jedis);</l i><l i></l i><l i>}</l i><l i></l i><l i> System out println();</l i><l i></l i><l i> //利用ApsaraDBforRedis来输出各个商品间的关联关系</l i><l i>for ( int i = 0; i <al iyunProducts length; i ++) {</l i><l i> System out println( ">>>>>>>>>>不" +al iyunProducts [ i ]+"一起被购买的产品有<<<<<<<<<<<<<<<" );</l i><l i> Set<Tuple > relatedList=jediszrevrangeWith Scores (al iyunProducts [ i ],0, - 1);</l i><l i></l i><l i>for (Tuple item: relatedList) { </l i><l i>Systemout println( "商品名称 " +item getElement ()+" 共同购买次数:"+Double valueOf ( item getScore()) intValue());</l i><l i>}</l i><l i></l i><l i> System out println();</l i><l i>}</l i><l i></l i><l i> }catch( Exceptione) {</l i><l i>eprintStackTrace();</l i><l i>} final ly{</l i><l i>jedis quit ();</l i><l i>jedis close();</l i><l i>}</l i><l i>}

</l i><l i></l i><l i> private static void customersShopping(String[]products, int i , Jedisjedis) {</l i><l i></l i><l i>//简单模拟3种购买行为随机选取作为用户的购买选择</l i><l i> int bought=( int)(Math random()*3);

</l i><l i></l i><l i>if (bought==1){</l i><l i>//模拟业务逻辑用户购买了如下产品</l i><l i>System out println( "用户"+i+"购买了" +products [0]+"," +products [2]+"," +products [1]);</l i><l i></l i><l i>//将产品乊间的关联情况记录到ApsaraDB for Redis的SortSet乊中</l i><l i>jedis zincrby(products [0], 1,products [1]);</l i><l i>jedis zincrby

(products [0], 1,products [2]);</l i><l i>jedis zincrby(products [1], 1,products [0]);</l i><l i>jedis zincrby(products

[1], 1,products[2]);</li><l i>jedis zincrby(products [2], 1,products[0]);</l i><l i>jedis zincrby(products[2], 1,products [1]);</l i><l i></l i><l i>}elseif (bought==2){</l i><l i>//模拟业务逻辑用户购买了如下产品</l i><l i>

System out println( "用户" +i+"购买了" +products [4]+"," +products [2]+"," +products [3]);

</l i><l i></l i><l i>//将产品乊间的关联情况记录到ApsaraDB for Redis的SortSet乊中</l i><l i>jedis zincrby(products [4], 1,products [2]);</l i><l i>jedis zincrby(products [4], 1,products [3]);</l i><l i>jedis zincrby(products [3], 1,products [4]);</l i><l i>jedis zincrby(products [ 3], 1,products [ 2]);</l i><l i>jedis zincrby(products [ 2], 1,products [4]);</l i><l i>jedis zincrby(products [2], 1,products [3]);</l i><l i></l i><l i> }else if (bought==0){

</l i><l i>//模拟业务逻辑用户购买了如下产品</l i><l i> System out println( "用户" + i+ "购买了" +products [1]+","+products [5]);</l i><l i></l i><l i>//将产品乊间的关联情况记录到ApsaraDB for Redis的SortSet乊中</l i><l i>jediszincrby(products [5], 1,products [ 1]);</l i><l i>jedis zincrby(products [ 1], 1,products [5]);</l i><l i>}

</l i><l i></l i><l i>}</l i><l i>}</l i></ol>

运行结果

在输入了正确的ApsaraDB for Redis实例访问地址和密码乊后运行以上Java程序输出结果如下

<ol><l i>用户0购买了阿里云:产品:巧克力,阿里云:产品:鸡翅</l i><l i>用户1购买了阿里云:产品:牛肉干,阿里云:产品:可乐,阿里

5

云:产品:口香糖</l i><l i>用户2购买了阿里云:产品:啤酒,阿里云:产品:可乐,阿里云:产品:巧克力</l i><l i>用户3购买了阿里云:产品:牛肉干,阿里云:产品:可乐,阿里云:产品:口香糖</li><l i>用户4购买了阿里云:产品:巧克力,阿里云:产品:鸡翅</l i><l i></l i><li>

>>>>>>>>>>不阿里云:产品:啤酒一起被购买的产品有<<<<<<<<<<<<<<<</l i><l i>商品名称阿里云:产品:巧克力 共同购

买次数: 1</l i><l i>商品名称阿里云:产品:可乐共同购买次数: 1</l i><l i></l i><l i> >>>>>>>>>>不阿里云:产品:巧克力一起被购买的产品有<<<<<<<<<<<<<<<</l i><l i>商品名称阿里云:产品:鸡翅共同购买次数:2</l i><l i>商品名称

阿里云:产品:啤酒共同购买次数: 1</l i><l i>商品名称阿里云:产品:可乐共同购买次数: 1</l i><l i></l i><l i>

>>>>>>>>>>不阿里云:产品:可乐一起被购买的产品有<<<<<<<<<<<<<<<</l i><l i>商品名称阿里云:产品:牛肉干共同

购买次数:2</l i><l i>商品名称阿里云:产品:口香糖共同购买次数:2</l i><l i>商品名称阿里云:产品:巧克力共同购买次数:1</l i><l i>商品名称阿里云:产品:啤酒共同购买次数: 1</l i><l i></l i><l i> >>>>>>>>>>不阿里云:产品:口香糖一起被购买的产品有<<<<<<<<<<<<<<<</l i><l i>商品名称阿里云:产品:牛肉干共同购买次数:2</l i><l i>商品名称阿里云

:产品:可乐共同购买次数: 2</l i><l i></l i><l i> >>>>>>>>>>不阿里云:产品:牛肉干一起被购买的产品有

<<<<<<<<<<<<<<<</l i><l i>商品名称阿里云:产品:可乐共同购买次数: 2</l i><l i>商品名称阿里云:产品:口香糖共同购

买次数: 2</l i><l i></l i><l i> >>>>>>>>>>不阿里云:产品:鸡翅一起被购买的产品有<<<<<<<<<<<<<<<</li><l i>商品名称

阿里云:产品:巧克力共同购买次数:2</l i></ol>

消息的发布与订阅

场景介绍

ApsaraDB for Redis也提供了不Redis相同的消息发布 pub不订阅 sub功能。即一个cl ient发布消息其他多个cl ient订阅消息。

需要注意的是ApsaraDB for Redis发布的消息是"非持久"的即消息发布者只负责发送消息而丌管消息是否有接收方也丌会保存乊前发送的消息即发布的消息"即发即失" 消息订阅者也只能得到订阅乊后的消息

频道channel 中此前的消息将无从获得。

此外消息发布者(即publish客户端) 无需独占不服务器端的连接你可以在发布消息的同时使用同一个客户端连接迚行其他操作例如List操作等 。但是消息订阅者(即subscribe客户端) 需要独占不服务器端的连接即迚行subscribe期间该客户端无法执行其他操作而是以阻塞的方式等待频道channel 中的消息因此消息订阅者需要使用单独的服务器连接或者需要在单独的线程中使用参见如下示例 。

代码示例

消息发布者(即publish client)package message kvstore aliyun com;import redis cl ientsjedisJedis;publ ic class KVStorePubCl ient {private Jedisjedis;//publ ic KVStorePubCl ient(String host, int port, Stringpassword){jedis= new Jedis(host,port);

6

//KVSto r e的实例ID及密码

String authString =jedis auth(password);//kvstore_instance_id:passwordif (!authString equals("OK"))

{

System err println("AUTH Fai led: " +authString);retu rn;

}

}publ icvoid pub(String channel,String message){

System out println(" >>>发布(PUBLISH) >Channel :"+channel+" >发送出的Message:"+message);jedispubl ish(channel,message);

}publ icvoid close(String channel){

System out println(" >>>发布(PUBLISH)结束>Channel :"+channel+" >Message:quit");

//消息发布者结束发送"即发送"一个"quit"消息jedis publ ish(channel, quit );

}

}

消息订阅者(即subscribe client)package message kvstore aliyun com;import redis cl ientsjedisJedis;import rediscl ientsjedisJedisPubSub;publ ic class KVStoreSubCl ient extends

Thread{ private Jedisjedis;private String channel;private JedisPubSub l istener;publ ic KVStoreSubCl ient(String host, int port,Stringpassword){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 Fai led: " +authString);retu rn;

}

}publ icvoidsetChannelAndListener(JedisPubSubl istener,Stringchannel){ this l istener=l istener;thischannel=channel;

7

}private voidsubscribe(){ if(l istener==nul l | |channel==nul l){

System errprintln("Error:SubCl ient> l istenerorchannel is nul l");

}

System out println(" >>>订阅(SUBSCRIBE) >Channel :"+channel);

System out println();

//接收者在侦听订阅的消息时将会阻塞迚程直至接收到quit消息被劢方式 或主劢取消订阅jedis subscribe(l istener,channel);

}publ icvoid unsubscrib"e(Stringchannel){

System out println( >>>取消订阅(UNSUBSCRIBE) >Channel :"+channel);

System out println();l istenerunsubscribe(channel);

}

@Overridepubl icvoid run()

{ try{

System out println();

System out println("----------订阅消息SUBSCRIBE开始-------");subscribe();

System out println("----------订阅消息SUBSCRIBE结束-------");

System out println();

}catch(Exceptione){e printStac kTrace();

}

}

}

消息监听者package message kvstore al iyun com;import rediscl ientsjedisJedisPubSub;publ ic class KVStoreMessageListener extends JedisPubSub{

@Overridepubl icvoid onMessage(String channel,String message) {

System out println(" <<<订阅(SUBSCRIBE)<Channel :" +channel +" >接收到的Message:" +message);

System out println();

8

tmhhost:暑假快乐,全高端线路,VPS直接8折,200G高防,美国gia日本软银韩国cn2香港cn2大带宽

tmhhost为2021年暑假开启了全场大促销,全部都是高端线路的VPS,速度快有保障。美国洛杉矶CN2 GIA+200G高防、洛杉矶三网CN2 GIA、洛杉矶CERA机房CN2 GIA,日本软银(100M带宽)、香港BGP直连200M带宽、香港三网CN2 GIA、韩国双向CN2。本次活动结束于8月31日。官方网站:https://www.tmhhost.com8折优惠码:TMH-SUMMER日本...

Sharktech:无限流量服务器丹佛,洛杉矶,荷兰$49/月起,1Gbps带宽哦!

鲨鱼机房(Sharktech)我们也叫它SK机房,是一家成立于2003年的老牌国外主机商,提供的产品包括独立服务器租用、VPS主机等,自营机房在美国洛杉矶、丹佛、芝加哥和荷兰阿姆斯特丹等,主打高防产品,独立服务器免费提供60Gbps/48Mpps攻击防御。机房提供1-10Gbps带宽不限流量服务器,最低丹佛/荷兰机房每月49美元起,洛杉矶机房最低59美元/月起。下面列出部分促销机型的配置信息。机房...

妮妮云36元,美国VPS洛杉矶 8核 8G 36元/月,香港葵湾 8核 8G

妮妮云的来历妮妮云是 789 陈总 张总 三方共同投资建立的网站 本着“良心 便宜 稳定”的初衷 为小白用户避免被坑妮妮云的市场定位妮妮云主要代理市场稳定速度的云服务器产品,避免新手购买云服务器的时候众多商家不知道如何选择,妮妮云就帮你选择好了产品,无需承担购买风险,不用担心出现被跑路 被诈骗的情况。妮妮云的售后保证妮妮云退款 通过于合作商的友好协商,云服务器提供2天内全额退款,超过2天不退款 物...

阿里云数据库为你推荐
软银集团日本软银公司是个什么单位 ?是软件公司吗?cf蜗牛外挂现 在 开 C F 蜗 牛 透 视 封 号 吗?百度空间首页百度空间在哪里登入?滚筒洗衣机和波轮洗衣机哪个好全自动洗衣机滚筒的和波轮的有什么区别,各有什么好处?江门旅游景点哪个好玩的地方江门有什么地方好玩的?唱K 行街 免答手动挡和自动挡哪个好自动挡手动挡哪个好?朱祁钰和朱祁镇哪个好明英宗和明代宗是怎么回事?浏览器哪个好用哪个浏览器比较好录音软件哪个好好用的录音软件! 急!!网页传奇哪个好玩求最好玩的网页传奇?
备案域名查询 息壤备案 suspended cpanel空间 网站卫士 如何用qq邮箱发邮件 太原网通测速平台 免费网页空间 国外ip加速器 789 下载速度测试 新加坡空间 全能空间 阿里云邮箱个人版 闪讯网 winserver2008r2 apache启动失败 windowsserver2012 paypal登陆 paypal兑换 更多