最佳实践
游戏玩家积分排行榜
场景介绍
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程序输出结果如下
输入所有玩家
玩家ID9193e26f-6a71-4c76-8666-eaf8ee97ac86 玩家得分: 3860
玩家IDdb03520b-75a3-48e5-850a-071722ff7afb 玩家得分: 4853
玩家IDd302d24d-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
玩家ID4c396f 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
玩家ID99bc5b4f-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
玩家ID0293b43a-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
玩家ID99bc5b4f-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玩
家ID0293b43a-1554-4157-a95b-b78de9edf6dd玩家得分:1008玩
家ID4c396f 67-da7c-4b99-a783-25919d52d 756玩家得分:958玩
家ID 9ee2ed6d-08b8-4e7f-b52c-9adfe1e32dda 玩家得分:63
玩
玩家ID99bc5b4f-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的玩家
玩家ID0293b43a-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
华为云怎么样?华为云用在线的方式将华为30多年在ICT基础设施领域的技术积累和产品解决方案开放给客户,致力于提供稳定可靠、安全可信、可持续创新的云服务,做智能世界的“黑土地”,推进实现“用得起、用得好、用得放心”的普惠AI。华为云作为底座,为华为全栈全场景AI战略提供强大的算力平台和更易用的开发平台。本次年终聚惠618活动相当给力,1核2G内存1m云耀云服务器仅88元/年起,送主机安全基础版套餐,...
ZJI怎么样?ZJI是一家成立于2011年的商家,原名维翔主机,主要从事独立服务器产品销售,目前主打中国香港、日本、美国独立服务器产品,是一个稳定、靠谱的老牌商家。详情如下:月付/年付优惠码:zji??下物理服务器/VDS/虚拟主机空间订单八折终身优惠(长期有效)一、ZJI官网点击直达香港葵湾特惠B型 CPU:E5-2650L核心:6核12线程内存:16GB硬盘:480GB SSD带宽:5Mbps...
无忧云怎么样?无忧云服务器好不好?无忧云值不值得购买?无忧云是一家成立于2017年的老牌商家旗下的服务器销售品牌,现由深圳市云上无忧网络科技有限公司运营,是正规持证IDC/ISP/IRCS商家,主要销售国内、中国香港、国外服务器产品,线路有腾讯云国外线路、自营香港CN2线路等,都是中国大陆直连线路,非常适合免备案建站业务需求和各种负载较高的项目,同时国内服务器也有多个BGP以及高防节点...