个人认为这个案例还是很经典的
- 这个案例很好的实现了,如何记录我关注了哪些人,哪些人关注了我
- 用set 结构进行去重, 关键是当我关注别人的时候如何存储
上代码:
/**
* 关注别人
* @param userId 自己
* @param followUserId 你要关注的人
*/
public void follow(long userId, long followUserId){
//我关注了谁 需要在我关注的人的 集合中增加一条记录
jedis.sadd("user::" + followUserId +"::followers",String.valueOf(userId));
//我关注人的集合
jedis.sadd("user::" +userId + "::follow_users",String.valueOf(followUserId));
}
- 以上代码中一个方法内,存储了两个SET,那么这两个set是干嘛的那
试想我们如果不用redis,用数据库存储的话,是不是需要设计数据库表,那么我们就会这样设计,
一张是用户表,记录用户基础信息
一张是用户关注明细,记录谁关注了此用户,字段为userId,follwUserId
我们在检索的时候查询 我被谁关注了 就直接select * from 关系表 where userId= 自己
那么检索我关注了谁那? 就是select * from 关系表 where follwUserId= 自己
是不是很简单,但是这样每次查库性能是不行的,所以我么要将这些数据提前聚合到缓存中:
- 也就出现了 上段代码中的:两个set
- 一个set用来存储被关注的人的集合中插入谁关注了他,谁那,就是我,key为我要关注的人的id,"user::" + followUserId +"::followers" value:为 自己
- 一个set用来存储我关注了哪些人的集合, 那么key 为自己的id, value为你所关注的人
取消关注
/**
* 取消关注
* @param userId
* @param followUserId
*/
public void unfollow(long userId, long followUserId){
jedis.srem("user::" + followUserId +"::followers",String.valueOf(userId));
jedis.srem("user::" +userId + "::follow_users",String.valueOf(followUserId));
}
查看哪些人关注了我
/**
* 查看有哪些人关注了我
* @param userId
* @return
*/
public Set<String> getFollowers(long userId){
return jedis.smembers("user::" + userId +"::followers");
}
/**
* 查看我关注了哪些人
* @param userId
* @return
*/
public Set<String> getFollowUsers(long userId){
return jedis.smembers("user::" +userId + "::follow_users");
}
/**
* 查看自己关注的人数
* @param userId
* @return
*/
public long getFollowUsersCount(long userId) {
return jedis.scard("user::" + userId + "::follow_users");
}
/**
* 查看自己关注的人数
* @param userId
* @return
*/
public long getFollowersCount(long userId){
return jedis.scard("user::" +userId + "::follow_users");
}
/**
* 获取用户跟其他用户之间共同关注的人有哪些
* @param userId
* @param otherUserId
* @return
*/
public Set<String> getSameFollowUsers(long userId, long otherUserId){
return jedis.sinter("user::" +userId + "::follow_users",
"user::" +otherUserId + "::follow_users");
}
/**
* 获取给我推荐的可关注人
* 我关注的某个好友关注的一些人,我没关注那些人,此时推荐那些人给我
* @param userId
* @param otherUserId
* @return
*/
public Set<String> getRecommendFollowUsers(long userId, long otherUserId){
return jedis.sdiff("user::" +userId + "::follow_users",
"user::" +otherUserId + "::follow_users");
}
很不错的案例