Redis实现类似SQL的where多条件查询

Redis 专栏收录该内容
11 篇文章 0 订阅

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> T json2Object(String json, Class<T> 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<User> users = new ArrayList<User>();
		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<String, String> map = new HashMap<String, String>();
		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<String> 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<String> 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<String> 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、测试代码下载


  • 6
    点赞
  • 7
    评论
  • 10
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值