10-分布式缓存实战-Set集合数据结构实战

上一章我们对分布式缓存List与Hash的数据结构进行实战演练,能够清楚的了解使用List数据结构实现榜单的思想,还有使用Hash结构实现购物车添加商品、查看商品、清空购物车的实现。接下来咱们对Set集合这个数据结构进行实战分析,本次实战分成三部分。第一部分:Set用户画像去重,第二部分:Set集合关注、粉丝、共同好友,第三部分:SortedSet集合积分榜单的实现。

Set数据结构案例-大数据下用户画像标签去重

什么是用户画像?

用户画像,作为大数据的根基,它可以完美的抽象出一个用户的全貌,为更进一步、快速的对用户行为习惯进行分析。用户画像可以简单的理解成是海量数据的标签,根据用户的目标。行为和观点的差异,将他们区分成了不同的类型。比如:一个抖音用户一直喜欢看关于汽车类的视频,那么该用户就会被打上汽车的标签,接下来通过大数据的计算给该用户一直推关于汽车类型的视频。

用户画像的应用场景有哪些呢?

用户画像的应用场景很广泛,比如个性化的推荐、精准营销、金融风控、精细化运营等等,举个例子来理解用户画像的实际应用价值,比如淘宝里的猜你喜欢这个功能。用户画像通过多个维度之间进行计算的标签,来存储到每个人的用户画像里,这时候有些标签避免不了会重复,这时Set集合就可以很好的去重了。

编写画像去重案例

在项目的测试(test)目录下进行编写去重方法,运行该方法可以看出来set1的值和set2的值是一样的,并且set添加了一个同样的dog,是没有添加进去吗?并不是的,是因为添加的这个元素重复了,所以可以使用set数据结构实现用户的标签去重。

BoundSetOperations operations = redisTemplate.boundSetOps("user:tags:1");

operations.add("car","student","rich","guangdong","dog","rich");

Set<String> set1 = operations.members();

System.out.println(set1);

operations.remove("dog");

Set<String> set2 = operations.members();

System.out.println(set2);

return JsonData.buildSuccess();

案例实战-社交应用里面的关注、粉丝、共同好友案例

需求分析

相信小伙伴们在玩一些社交应用的时候,这里就拿新浪微博为例子。在新浪微博里可以对一些博主进行关注,你就会成为了别人的粉丝,他也成为了你的关注用户。当然别人也可以关注你,道理一样。这时你会发现,如果你和你的好友一起关注了同一个博主,那么你们就会有共同关注的博主。

public void testSet(){

BoundSetOperations operationLW = redisTemplate.boundSetOps("user:lw");

operationLW.add("A","B","C","D","E");

System.out.println("⽼王的粉丝:"+operationLW.members());


BoundSetOperations operationXD = redisTemplate.boundSetOps("user:xd");

operationXD.add("A","B","F","G","H","J");

System.out.println("⼩D的粉丝:"+operationXD.members());


//差集

Set lwSet = operationLW.diff("user:xd");

System.out.println("⽼王的优势:"+lwSet);

//差集

Set xdSet = operationXD.diff("user:lw");

System.out.println("⼩滴的优势:"+xdSet);

//交集

Set interSet =  operationLW.intersect("user:xd");

System.out.println("共同好友:"+interSet);

//并集

Set unionSet = operationLW.union("user:xd");

System.out.println("两个⼈的并集:"+unionSet);

//⽤户A是否是 ⽼王 的粉丝

boolean flag = operationLW.isMember("A");

System.out.println(flag);

}

通过上面的例子可以清楚的了解到使用Set集合的差集(我有的你没有的)、交集(我和你共同拥有的)、并集(我的全部与你的全部结合在一起)。通过上面的实战内容就可以实现共同好友等功能了。

案例实战-SortedSet开发用户积分实时榜单

需求分析

在现在一些市面的游戏上,必不可少就是一个游戏排行榜了,在上面我们有用过List数据结构实现了非实时的榜单,这里我们会使用SortedSet实现实时的榜单。一般排行榜我们一般都是读多写少,可以对master进行写入操作,然后使用多个slave进行读取操作。有一点要注意一下,如果存储对象的时候呢要重新HashCode与Equals的方法。

在VO类创建一个UserPointVO类

public class UserPointVO {

public UserPointVO(String username, String phone) {

this.username = username;

this.phone = phone;

}

private String username;

private String phone;

}

//set get方法略

//重写HashCode与equals方法 略

模拟榜单所需要的数据在Test类里添加

@Test

void testData() {

UserPointVO p1 = new UserPoint("⽼王","13113");

UserPointVO p2 = new UserPoint("⽼A","324");

UserPointVO p3 = new UserPoint("⽼B","242");

UserPointVO p4 = new UserPoint("⽼C","542345");

UserPointVO p5 = new UserPoint("⽼D","235");

UserPointVO p6 = new UserPoint("⽼E","1245");

UserPointVO p7 = new UserPoint("⽼F","2356432");

UserPointVO p8 = new UserPoint("⽼G","532332");

BoundZSetOperations<String, UserPointVO> operations = redisTemplate.boundZSetOps("point:rank:real");


    operations.add(p1,123);

    operations.add(p2,81);

    operations.add(p3,218);

    operations.add(p4,388);

    operations.add(p5,888);

    operations.add(p6,1888);

    operations.add(p7,8);

    operations.add(p8,18);

}

运行这个测试类代码后,在Redis中查看,会发现数据是从小到大进行排序的。一般榜单是从大到小排序的,这时我们应该如何实现呢?这时编写接口,当用户在获取积分后也要相应的加到榜单上。

在RankController里添加方法

//榜单从大到小排序

@RequestMapping("real_rank1")

public JsonData realRank1(){

BoundZSetOperations<String,UserPointVO> operations = redisTemplate.boundZSetOps("point:rank:real");

Set<UserPointVO> set = operations.reverseRange(0,-1);   

  return JsonData.buildSuccess(set)

}

//查看某个用户的排名

@RequestMapping("find_myrank")

public JsonData findRank1(String phone,String name){

BoundZSetOperations<String,UserPointVO> operations = redisTemplate.boundZSetOps("point:rank:real");

UserPointVO userPointVO = new UserPointVO(name,phone);

long rank = operations.reverseRank(userPointVO);

return JsonData.buildSuccess(++rank);

}

//给某个用户加积分

@RequestMapping("uprank")

public JsonData uprank(String phone,String name,int point){

BoundZSetOperations<String,UserPointVO> operations = redisTemplate.boundZSetOps("point:rank:real");

UserPointVO userPointVO = new UserPointVO(name,phone);

operations.incrementScore(userPointVO,point);

    Set<UserPointVO> set = operations.range(0,-1);

return JsonData.buildSuccess(set);

}

//查看某个用户的积分

@RequestMapping("mypoint")

public JsonData mypoint(String phone,String name){

BoundZSetOperations<String,UserPointVO> operations = redisTemplate.boundZSetOps("point:rank:real");

UserPointVO userPointVO = new UserPointVO(name,phone);

double score = operations.score(userPointVO);

return JsonData.buildSuccess(set);

}

通过上面的代码就实现了从大到小排序的榜单,查看某个用户的排名,给某个用户加积分与查询某个用户积分的功能了。

本章小结:通过本章我们学习了Set集合的三种实战演练,第一种是使用Set集合去重做人物画像的功能,第二种是使用Set集合去做差集、交集、并集这方面可以使用在关注、粉丝、共同好友这种功能。第三种使用SortedSet集合实现了积分排行榜的功能,可以根据用户的积分进行由小到大或由大到小排序。可以看出Set集合的使用是非常广泛的。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,366评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,521评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,689评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,925评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,942评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,727评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,447评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,349评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,820评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,990评论 3 337
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,127评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,812评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,471评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,017评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,142评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,388评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,066评论 2 355

推荐阅读更多精彩内容