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

华为云年中聚惠618活动,新用户专区,云服务器低至88元/年,3年仅580.98元,热销抢购中,最后2天!

华为云怎么样?华为云用在线的方式将华为30多年在ICT基础设施领域的技术积累和产品解决方案开放给客户,致力于提供稳定可靠、安全可信、可持续创新的云服务,做智能世界的“黑土地”,推进实现“用得起、用得好、用得放心”的普惠AI。华为云作为底座,为华为全栈全场景AI战略提供强大的算力平台和更易用的开发平台。本次年终聚惠618活动相当给力,1核2G内存1m云耀云服务器仅88元/年起,送主机安全基础版套餐,...

ZJI-全场八折优惠,香港服务器 600元起,还有日本/美国/韩国服务器

ZJI怎么样?ZJI是一家成立于2011年的商家,原名维翔主机,主要从事独立服务器产品销售,目前主打中国香港、日本、美国独立服务器产品,是一个稳定、靠谱的老牌商家。详情如下:月付/年付优惠码:zji??下物理服务器/VDS/虚拟主机空间订单八折终身优惠(长期有效)一、ZJI官网点击直达香港葵湾特惠B型 CPU:E5-2650L核心:6核12线程内存:16GB硬盘:480GB SSD带宽:5Mbps...

无忧云-河南洛阳BGP,CEPH集群分布式存储,数据安全可靠,活动期间月付大优惠!

 无忧云怎么样?无忧云服务器好不好?无忧云值不值得购买?无忧云是一家成立于2017年的老牌商家旗下的服务器销售品牌,现由深圳市云上无忧网络科技有限公司运营,是正规持证IDC/ISP/IRCS商家,主要销售国内、中国香港、国外服务器产品,线路有腾讯云国外线路、自营香港CN2线路等,都是中国大陆直连线路,非常适合免备案建站业务需求和各种负载较高的项目,同时国内服务器也有多个BGP以及高防节点...

阿里云数据库为你推荐
p图软件哪个好用美图P图软件哪个好,你们用哪个集成显卡和独立显卡哪个好集成显卡和独立显卡什么区别?电脑管家和360哪个好360卫士和电脑管家,哪个更好莫代尔和纯棉哪个好莫代尔好还是棉好迈腾和帕萨特哪个好迈腾和帕萨特哪个好法兰绒和珊瑚绒哪个好法兰绒、珊瑚绒、天鹅绒哪个暖和?江门旅游景点哪个好玩的地方江门有哪些旅游景点,江门哪里好玩游戏加速器哪个好大家玩游戏用的都是什么加速器啊,哪个效果最好宝来和朗逸哪个好朗逸和宝来买哪个好三国游戏哪个好玩三国类的游戏哪些好玩点
vps租用 bash漏洞 免费个人空间申请 web服务器架设 七夕促销 刀片服务器的优势 nerds qq对话框 umax120 台湾google 上海电信测速网站 华为k3 免费个人主页 主机返佣 杭州电信 mteam nnt 512内存 免费网站加速 次时代主机 更多