RedisはSQLのようなwhereマルチ条件クエリを実現する

4466 ワード

1、Userテーブルを保存する方案について
1.1 RedisのHashタイプを使用してリレーショナル・データベースのUserテーブルを保存する
1.2 RedisのHashのkeyは「SYS_USER_TABLE_SEX_MAN」、field:userid value:jsonデータ
2.RedisのSetを利用して、一種類の条件を満たすUserユーザのid情報を保存する.例えば、性別は女性で、年齢は25歳以上などの条件です.
3、Java実現の具体的なコードは以下の通りである.
3.1 Json関連ツールクラス
public class GsonUtil {
	public static String object2Json(Object object) {
		Gson gson = new Gson();
		return gson.toJson(object);
	}

	public static  T json2Object(String json, Class clazz) {
		Gson gson = new Gson();
		return gson.fromJson(json, clazz);
	}
}

3.2 Userエンティティークラス
public class User {
	private int id;
	private String name;
	private String sex;
	private int age;

	public User() {
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getSex() {
		return sex;
	}

	public void setSex(String sex) {
		this.sex = sex;
	}

	@Override
	public String toString() {
		return "User [id=" + id + ", name=" + name + ", sex=" + sex + ", age="
				+ age + "]";
	}

}

3.3 RedisはSQLのような多条件クエリーテストを実現する
public class RedisSQL {
	public static void main(String[] args) {

		//  User      Redis  ,   key
		//  User    field:id value: json       
		final String SYS_USER_TABLE = "SYS_USER_TABLE";
		//           User   Redis Set
		final String SYS_USER_TABLE_SEX_MAN = "SYS_USER_TABLE_SEX_MAN";
		//              Redis Set
		final String SYS_USER_TABLE_SEX_FEMAN = "SYS_USER_TABLE_SEX_FEMAN";
		//     age 25     Redis Set
		final String SYS_USER_TABLE_AGE_25 = "SYS_USER_TABLE_AGE_25";
		//         
		Jedis jedis = new Jedis("192.168.2.116", 6379);

		//        User   
		List users = new ArrayList();
		for (int i = 0; i < 5; i++) {
			User user = new User();
			user.setId(i);
			user.setName("zhang" + i);
			user.setSex("man");
			user.setAge(20 + i);
			users.add(user);
		}
		for (int i = 5; i < 10; i++) {
			User user = new User();
			user.setId(i);
			user.setName("zhang" + i);
			user.setSex("feman");
			user.setAge(20 + i);
			users.add(user);
		}

		//   Hash  
		Map map = new HashMap();
		for (int i = 0; i < users.size(); i++) {
			map.put(users.get(i).getId() + "",
					GsonUtil.object2Json(users.get(i)));

			//        User  
			//    Redis key SYS_USER_TABLE_SEX_MAN Set    
			//      User   id    
			if ("man".equals(users.get(i).getSex())) {
				jedis.sadd(SYS_USER_TABLE_SEX_MAN, users.get(i).getId() + "");
			}
			//        User  
			//    Redis key SYS_USER_TABLE_SEX_MAN Set    
			//      User   id    
			if ("feman".equals(users.get(i).getSex())) {
				jedis.sadd(SYS_USER_TABLE_SEX_FEMAN, users.get(i).getId() + "");
			}
			//    age,birthday ,       
			//  Redis  ,     Set,           User id  
			if ("25".equals(users.get(i).getAge() + "")) {
				jedis.sadd(SYS_USER_TABLE_AGE_25, users.get(i).getId() + "");
			}
		}
		//       
		// Set keySet = map.keySet();
		// for (String key : keySet) {
		// System.out.println(map.get(key));
		// }

		//   User     Redis 
		// key SYS_USER_TABLE
		//       feild :id value:json      
		jedis.hmset(SYS_USER_TABLE, map);

		// ===============================
		//   SQL where     
		//      25 ,     user  
		Set sinter = jedis.sinter(SYS_USER_TABLE_SEX_FEMAN);
		for (String key : sinter) {
			//   id Redis  SYS_USER_TABLE,       user
			String hkey = jedis.hget(SYS_USER_TABLE, key);
			System.out.println(hkey);
			//      json  ,   User  
			User user = GsonUtil.json2Object(hkey, User.class);
			System.out.println(user);

		}

		//      25 ,     user  
		Set sinter2 = jedis.sinter(SYS_USER_TABLE_SEX_FEMAN,
				SYS_USER_TABLE_AGE_25);
		for (String key : sinter2) {
			//   id Redis  SYS_USER_TABLE,       user
			String hkey = jedis.hget(SYS_USER_TABLE, key);
			System.out.println(hkey);
			//      json  ,   User  
			User user = GsonUtil.json2Object(hkey, User.class);
			System.out.println(user);
		}
	}
}

4、テストコードのダウンロード