玩家阿里云数据库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

Megalayer美国独立服务器配置及性能速度综合评测

Megalayer 商家在之前也有记录过,商家开始只有提供香港站群服务器和独立服务器,后来也有增加到美国独立服务器,以及前几天也有介绍到有增加香港VPS主机。对于香港服务器之前有过评测(Megalayer香港服务器配置一览及E3-1230 8GB服务器评测记录),这里申请到一台美国独立服务器,所以也准备简单的评测记录。目前市场上我们看到很多商家提供VPS或者云服务器基本上没有什么特别的,但是独立服...

Friendhosting,美国迈阿密机房新上线,全场45折特价优惠,100Mbps带宽不限流量,美国/荷兰/波兰/乌兰克/瑞士等可选,7.18欧元/半年

近日Friendhosting发布了最新的消息,新上线了美国迈阿密的云产品,之前的夏季优惠活动还在进行中,全场一次性45折优惠,最高可购买半年,超过半年优惠力度就不高了,Friendhosting商家的优势就是100Mbps带宽不限流量,有需要的朋友可以尝试一下。Friendhosting怎么样?Friendhosting服务器好不好?Friendhosting服务器值不值得购买?Friendho...

腾讯云轻量服务器老用户续费优惠和老用户复购活动

继阿里云服务商推出轻量服务器后,腾讯云这两年对于轻量服务器的推广力度还是比较大的。实际上对于我们大部分网友用户来说,轻量服务器对于我们网站和一般的业务来说是绝对够用的。反而有些时候轻量服务器的带宽比CVM云服务器够大,配置也够好,更有是价格也便宜,所以对于初期的网站业务来说轻量服务器是够用的。这几天UCLOUD优刻得香港服务器稳定性不佳,于是有网友也在考虑搬迁到腾讯云服务器商家,对于轻量服务器官方...

阿里云数据库为你推荐
软银巨亏孙正义的个人经历滴滴软银合资哪款车比较适合跑滴滴cf蜗牛外挂我想让cf用什么外挂可以让号被封了要最快那种。最好永久封了最好涡轮增压和自然吸气哪个好涡轮增压和自然吸气哪个好天气预报哪个好用哪个最准确分小时的那种天气预报app,哪个准确方便使用迈腾和帕萨特哪个好迈腾和帕萨特哪个好少儿英语哪个好少儿英语哪套教材好哪里好呢?尼康和佳能单反哪个好入门的单反相机 佳能和尼康哪个好?海克斯皮肤哪个好海克斯安妮和摄魂薇恩哪个好 需要多少宝石雅思和托福哪个好考雅思和托福哪个好考?
欧洲欧洲vps 免费试用vps 美国加州vps 主机评测 国外空间服务商 godaddy支付宝 seovip 远程登陆工具 cpanel空间 howfile 谁的qq空间最好看 adroit 电信虚拟主机 服务器硬件防火墙 国内域名 国外的代理服务器 石家庄服务器托管 wordpress中文主题 江苏徐州移动 ssl加速 更多