社交网络程序的一个核心就是网友之间的社交关系,关注与粉丝等。
package com.foxbill.redisinaction;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.Transaction;
import java.util.List;
import java.util.stream.Collectors;
/**
* 社交关系
*/
public class Chapter18 {
static String key_prefix_following="Chapter18:following";
static String key_prefix_follower="Chapter18:follower";
static public void start(Jedis jedis) {
cleanData(jedis);
//------------关注
String user1 = "user1";
String user2 = "user2";
String user3 = "user3";
String user4 = "user4";
//user1关注user2、user3、user4
follow(jedis,user1,user2);
follow(jedis,user1,user3);
follow(jedis,user1,user4);
//user2关注user3、user4
follow(jedis,user2,user3);
follow(jedis,user2,user4);
//-------------
List<String> range = range(jedis, user1, 1, 3);
String strRange = range.stream()
.collect(Collectors.joining(","));
System.out.printf("user1的粉丝1,到3:%s\n",strRange);
//-------------
long rank = rank(jedis,user1,user3);
System.out.printf("user3在user1的粉丝中排序位次:%d\n",rank);
rank = rank(jedis,user2,user4);
System.out.printf("user4在user2的粉丝中排序位次:%d\n",rank);
//-------------取消关注
unFollow(jedis,user1,user2);
unFollow(jedis,user2,user3);
}
//清理数据,便于反复测试
private static void cleanData(Jedis jedis) {
jedis.del(key_prefix_following);
jedis.del(key_prefix_follower);
}
//关注
private static void follow(Jedis jedis,String userA,String userB) {
// 开始事务
Transaction tx = jedis.multi();
try{
//执行业务
String key = String.format("%s:%s",key_prefix_following,userA);
//按照关注时间先后排序
double score=System.currentTimeMillis();
tx.zadd(key,score,userB);
String key2 = String.format("%s:%s",key_prefix_follower,userB);
tx.zadd(key2,score,userA);
// 提交事务
tx.exec();
}catch (Exception e) {
// 事务回滚
tx.discard();
}
}
//取消关注
private static void unFollow(Jedis jedis,String userA,String userB){
// 开始事务
Transaction tx = jedis.multi();
try{
//执行业务
String key = String.format("%s:%s",key_prefix_following,userA);
jedis.zrem(key,userB);
String key2 = String.format("%s:%s",key_prefix_follower,userB);
jedis.zrem(key2,userA);
// 提交事务
tx.exec();
}catch (Exception e) {
// 事务回滚
tx.discard();
}
}
//粉丝排名
private static Long rank(Jedis jedis,String userA,String userB){
String key = String.format("%s:%s",key_prefix_following,userA);
Long rank = jedis.zrank(key, userB);
return rank;
}
//批量获取粉丝
private static List<String> range(Jedis jedis,String userA,long start,long end){
String key = String.format("%s:%s",key_prefix_following,userA);
List<String> zrange = jedis.zrange(key, start, end);
return zrange;
}
}

被折叠的 条评论
为什么被折叠?



