用Redis来存储关注关系(java实现)

标签: redis 关系 java | 发表时间:2012-04-20 10:50 | 作者:
出处:http://www.iteye.com
//一个接口UserService.java
//一个接口的实现UserServiceImpl.java
//两个采用Jedis的客户端测试类FollowTestMain.java,IsFollowTestMain.java


//UserService.java接口如下

package com.redis.test;

import java.util.Set;

public interface UserService {
	public void follow(String userId);
	public void unfollow(String userId);
	public Set<String> following();
	public Set<String> followedBy();
	public boolean isfollowing(String userId);
	public boolean isfollowedBy(String userId);
	public Long followingCount();
	public Long followerCount();
	public Set<String> commonfollowing(String userId);
	public Set<String> commonfollowedBy(String userId);
}

//接口实现方法如下:

package com.redis.test;

import java.util.Set;

import redis.clients.jedis.Jedis;

public class UserServiceImpl implements UserService {

	private String userId;
	private Jedis redisService;

	public UserServiceImpl(String userId) {
		this.userId = userId;
		this.redisService = new Jedis("localhost");
	}

	/**
	 *@description 关注对应用户编号方法实现
	 *@date 2012-4-1
	 *@parameter
	 *@see com.redis.test.UserService#follow(java.lang.String)
	 */
	@Override
	public void follow(String userId) {
		this.redisService.sadd("graph:user:" + this.userId + ":following",userId); //add
		this.redisService.sadd("graph:user:" + userId + ":followed_by",this.userId); //add
	}

	/**
	 *@description 获取当前用户所有关注对象的用户编号集合
	 *@date 2012-4-1
	 *@parameter
	 *@see com.redis.test.UserService#following()
	 */
	@Override
	public Set<String> following() {
		return this.redisService.smembers("graph:user:" + this.userId + ":following"); //member
	}

	/**
	 *@description 获取当前用户被哪些人关注的用户编号集合
	 *@date 2012-4-1
	 *@parameter
	 *@see com.redis.test.UserService#followedBy()
	 */
	@Override
	public Set<String> followedBy() {
		return this.redisService.smembers("graph:user:" + this.userId + ":followed_by"); //member
	}

	/**
	 *@description 取消关注某人(传入的用户编号标识操作)方法实现
	 *@date 2012-4-1
	 *@parameter
	 *@see com.redis.test.UserService#unfollow(java.lang.String)
	 */
	@Override
	public void unfollow(String userId) {
		this.redisService.srem("graph:user:" + this.userId + ":following",userId); //remove
		this.redisService.srem("graph:user:" + userId + ":followed_by",this.userId); //remove
	}

	/**
	 *@description 判断当前用户是否关注了对应用户编号的用户方法实现
	 *@date 2012-4-1
	 *@parameter
	 *@see com.redis.test.UserService#isfollowing(java.lang.String)
	 */
	@Override
	public boolean isfollowing(String userId) {
		return this.redisService.sismember("graph:user:"+this.userId+":following", userId); //is member
	}

	/**
	 *@description 判断是否存在对应用户编号的粉丝方法实现
	 *@date 2012-4-1
	 *@parameter
	 *@see com.redis.test.UserService#isfollowedBy(java.lang.String)
	 */
	@Override
	public boolean isfollowedBy(String userId) {
		return this.redisService.sismember("graph:user:"+this.userId+":followed_by", userId);//is member
	}

	/**
	 *@description 统计当前用户关注的人数总和
	 *@date 2012-4-1
	 *@parameter
	 *@see com.redis.test.UserService#followingCount()
	 */
	@Override
	public Long followingCount() {
		return this.redisService.scard("graph:user:"+this.userId+":following"); //card
	}

	/**
	 *@description 统计当前用户有多少粉丝数目方法实现
	 *@date 2012-4-1
	 *@parameter
	 *@see com.redis.test.UserService#followerCount()
	 */
	@Override
	public Long followerCount() {
		return this.redisService.scard("graph:user:"+this.userId+":followed_by"); //card
	}

	/**
	 *@description 获取当前用户和传入用户编号对应的用户共同关注的用户编号集合方法实现
	 *@date 2012-4-1
	 *@parameter
	 *@see com.redis.test.UserService#commonfollowing(java.lang.String)
	 */
	@Override
	public Set<String> commonfollowing(String userId) {
		String s1 = "graph:user:" + this.userId + ":following";
		String s2 = "graph:user:" + userId + ":following";
		return this.redisService.sinter(new String[] { s1, s2 });
	}

	/**
	 *@description 获取当前用户和传入用户编号对应的用户共同粉丝的用户编号集合方法实现
	 *@date 2012-4-1
	 *@parameter
	 *@see com.redis.test.UserService#commonfollowedBy(java.lang.String)
	 */
	@Override
	public Set<String> commonfollowedBy(String userId) {
		String s1 = "graph:user:" + this.userId + ":followed_by";
		String s2 = "graph:user:" + userId + ":followed_by";
		return this.redisService.sinter(new String[] { s1, s2 });
	}
}

//两个测试类如下:

package com.redis.test;

import java.util.Iterator;

public class FollowTestMain {

	//简单测试、没有采用单元测试Junit
	public static void main(String[] args) {
		UserService user1 = new UserServiceImpl("1");
		UserService user2 = new UserServiceImpl("2");
		UserService user3 = new UserServiceImpl("3");
		
		user1.follow("2");
		user1.follow("3");
		
		user2.follow("1");
		user2.follow("3");
		
		user3.follow("1");
		user3.follow("2");
		
		Iterator<String> it1 = user1.following().iterator();
		System.out.println("user1 following:");
		while(it1.hasNext()){
			System.out.print(it1.next()+" "); //2 3
		}
		
		Iterator<String> it2 = user2.following().iterator();
		System.out.println("\nuser2 following:");
		while(it2.hasNext()){
			System.out.print(it2.next()+" "); //1 3
		}
		
		Iterator<String> it3 = user3.following().iterator();
		System.out.println("\nuser3 following:");
		while(it3.hasNext()){
			System.out.print(it3.next()+" "); //1 2
		}
		
		Iterator<String> it11 = user1.followedBy().iterator();
		System.out.println("\nuser1 followed_by:");
		while(it11.hasNext()){
			System.out.print(it11.next()+" "); //2 3
		}
		
		Iterator<String> it22 = user2.followedBy().iterator();
		System.out.println("\nuser2 followed_by:");
		while(it22.hasNext()){
			System.out.print(it22.next()+" "); //1 3
		}
		
		Iterator<String> it33 = user3.followedBy().iterator();
		System.out.println("\nuser3 followed_by:");
		while(it33.hasNext()){
			System.out.print(it33.next()+" "); //1 2
		}
		
	}

}

package com.redis.test;

import java.util.Iterator;

public class IsFollowTestMain {

	//简单测试、没有采用单元测试Junit
	public static void main(String[] args) {
		UserService user1 = new UserServiceImpl("1");
		UserService user2 = new UserServiceImpl("2");
		UserService user3 = new UserServiceImpl("3");
		user1.follow("2");
		
		user2.follow("1");
		user2.follow("3");
		
		user3.follow("1");
		user3.follow("2");
		
		boolean isfollowing = user1.isfollowing("2");
		System.out.println("user1 isfollowing user2 result = "+isfollowing); //true
		
		boolean isfollowed = user1.isfollowedBy("3");
		System.out.println("user1 isfollowed by user3 result = "+isfollowed); //true
		
		Long followingCount = user1.followingCount();
		System.out.println("user1 followingCount = "+followingCount); //1
		
		Long followedCount = user2.followerCount();
		System.out.println("user2 followedCount = "+followedCount); //2

		Iterator<String> commonFollowing = user1.commonfollowing("3").iterator();
		System.out.println("user1 and user3 common following = ");
		while(commonFollowing.hasNext()){
			System.out.println(commonFollowing.next()); //2
		}
		
		Iterator<String> commonFans = user3.commonfollowedBy("1").iterator();
		System.out.println("user1 and user3 common fans = ");
		while(commonFans.hasNext()){
			System.out.println(commonFans.next()); //2
		}
		
	}

}


已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [redis 关系 java] 推荐:

用Redis来存储关注关系(java实现)

- - ITeye博客
//一个接口UserService.java //一个接口的实现UserServiceImpl.java //两个采用Jedis的客户端测试类FollowTestMain.java,IsFollowTestMain.java. //UserService.java接口如下 package com.redis.test; import java.util.Set; public interface UserService {.

java对redis的基本操作

- - 编程语言 - ITeye博客
    可看到当前可下载版本:redis2.6.     下载windows平台文件:.      解压后,选择当前64位win7系统对应的版本:.     1)解压后将里面所有文件拷贝至redis安装目录:.      几个exe程序的功能:    .         redis-benchmark.exe:性能测试,用以模拟同时由N个客户端发送M个 SETs/GETs 查询 (类似于 Apache 的ab 工具).

浅谈Java开发中Redis的使用姿势

- - 尚弟的小笔记
Redis是我们开发时最常使用的键值存储工具了,但是与诸多软件工具一样,它也有很多技巧和经验. 本文就是将我了解的一些经验和教训分享出来. 如果不谨慎使用Redis,可能浪费大量的内存,甚至性能低下. 以下时 使用时的几个具体建议:. 通常一个Redis实例有16个数据库,通常你的业务并不是独立的数据库.

JAVA通过Gearman实现MySQL到Redis的数据同步(异步复制)

- - 企业架构 - ITeye博客
MySQL到Redis数据复制方案. 无论MySQL还是Redis,自身都带有数据同步的机制,像比较常用的 MySQL的Master/Slave模式 ,就是由Slave端分析Master的binlog来实现的,这样的数据复制其实还是一个异步过程,只不过当服务器都在同一内网时,异步的延迟几乎可以忽略.

案例:用Redis来存储关注关系

- Wang Dong - NoSQLFan
Redis提供了丰富的数据类型,比起关系型数据库或者简单的Key-Value存储(比如Memcached)来,Redis的数据模型与实际应用的数据模型更相近. 比如下面说到的好友关系的存储,原作者使用了Redis的 Sets(集合)数据结构. 具体存储方式如下:对于每一个用户,其关注关系存储两份列表,一份为此用户关注的人的UID列表,另一份为此用户粉丝的UID列表,这两个列表都使用Sets(集合).

java中jmx/jconsole/jstat/jmap的关系

- - CSDN博客推荐文章
JMX是java5开始提供的对java应用进行监控的一套接口. 实现方式是在jvm内部起一个mbeanserver通过网络对外开放调用接口,这样外部就可以做应用监控或者类似远程方法调用. java默认实现了jvm的一些监控,比如堆内存使用情况(MemoryMXBean),线程情况(ThreadMXBean),gc情况等,外部程序可以直接使用,比如jconsole实际上就是对这些bean的包装,只是把返回结果可视化了.

Redis的Java客户端Jedis的八种调用方式(事务、管道、分布式等)介绍

- - 数据库 - ITeye博客
        redis是一个著名的key-value存储系统,而作为其官方推荐的java版客户端jedis也非常强大和稳定,支持事务、管道及有jedis自身实现的分布式.         在这里对jedis关于事务、管道和分布式的调用方式做一个简单的介绍和对比:.         最简单和基础的调用方式.

java spring框架中方法级redis的连接自动获取和释放实现

- - Java - 编程语言 - ITeye博客
java中使用redis总是需要处理redis连接的获取,释放等操作,每次使用都会使代码变的特别丑陋,模仿spring中aop的实现,用动态代理写一个 连接自动获取和释放的工具. JedisManageSupport 抽象类 类似于 aop的切入点,所有继承了该类(一般都是service层)的类,可以使用提供的获取redis的方法获取redis,并且不需要释放.

Redis分布式锁的正确实现方式(Java版) - 吴大山的博客 | Wudashan Blog

- -
本博客使用第三方开源组件Jedis实现Redis客户端,且只考虑Redis服务端单机部署的场景. 分布式锁一般有三种实现方式:1. 基于ZooKeeper的分布式锁. 本篇博客将介绍第二种方式,基于Redis实现分布式锁. 虽然网上已经有各种介绍Redis分布式锁实现的博客,然而他们的实现却有着各种各样的问题,为了避免误人子弟,本篇博客将详细介绍如何正确地实现Redis分布式锁.

Java线程与Linux内核线程的映射关系

- - CSDN博客编程语言推荐文章
Linux从内核2.6开始使用NPTL (Native POSIX Thread Library)支持,但这时线程本质上还轻量级进程. Java里的线程是由JVM来管理的,它如何对应到操作系统的线程是由JVM的实现来确定的. Linux 2.6上的HotSpot使用了NPTL机制, JVM线程跟内核轻量级进程有一一对应的关系.