redis怎么实现条件查询?
redis怎么实现条件查询?这个问题可能是我们日常工作经常见到的。通过这个问题,希望你能收获更多。今天跟随小编一起来看解决方案吧。
一、导入jar包
二、实现简单的条件查询
创建一个User实体类
public class User {
private String id;
private String name;
private String sex;
private int age;
public String getId() {
return id;
}
public User() {
super();
}
public void setId(String 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;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public User(String id, String name, String sex, int age) {
super();
this.id = id;
this.name = name;
this.sex = sex;
this.age = age;
}
@Override
public String toString() {
return "User [id=" + id + ", name=" + name + ", sex=" + sex + ", age="
+ age + "]";
}
}
创建5个对象并将其存入缓存中,以便我们进行测试
//连接redis
Jedis jedis = new Jedis("127.0.0.1",6379);
Map<String, String> map = new HashMap<String,String>();
final String USER_TABLE = "USER_TABLE";
//向缓存中存入5条数据组成的map
String uuid1 = UUID.randomUUID().toString();
User user1 = new User(uuid1, "y1", "m", 15);
//将对象转为json
map.put(uuid1, JSONObject.fromObject(user1).toString());
String uuid2 = UUID.randomUUID().toString();
User user2 = new User(uuid2, "y2", "m", 18);
map.put(uuid2, JSONObject.fromObject(user2).toString());
String uuid3 = UUID.randomUUID().toString();
User user3 = new User(uuid3, "y3", "n", 25);
map.put(uuid3, JSONObject.fromObject(user3).toString());
String uuid4 = UUID.randomUUID().toString();
User user4 = new User(uuid4, "y4", "n", 15);
map.put(uuid4, JSONObject.fromObject(user4).toString());
String uuid5 = UUID.randomUUID().toString();
User user5 = new User(uuid5, "y5", "m", 25);
map.put(uuid5, JSONObject.fromObject(user5).toString());
//把map存到缓存中
jedis.hmset("USER_TABLE", map);
在redis中查询,可以看到已经将5个user对象存到缓存中
接下来,首先实现单条件的查询,比如说查询年龄为15的user和性别为m的user
由于Redis是nosql,无法直接像mysql那样利用where进行条件查询,所以Redis想实现条件查询,只能用一个笨方法:将所有符合条件的user存到一个set中。
Jedis jedis = new Jedis("127.0.0.1",6379);
Map<String, String> map = new HashMap<String,String>();
final String USER_TABLE = "USER_TABLE";
//查询年龄为15,性别为n
final String USER_TABLE_AGE_15 = "USER_TABLE_AGE_15";
final String USER_TABLE_SEX_m = "USER_TABLE_SEX_m";
final String USER_TABLE_SEX_n = "USER_TABLE_SEX_n";
//向缓存中存入5条数据组成的map
String uuid1 = UUID.randomUUID().toString();
User user1 = new User(uuid1, "y1", "m", 15);
//将对象转为json
map.put(uuid1, JSONObject.fromObject(user1).toString());
//将符合条件的user的Id存到set中
jedis.sadd(USER_TABLE_AGE_15,uuid1);
jedis.sadd(USER_TABLE_SEX_m,uuid1);
String uuid2 = UUID.randomUUID().toString();
User user2 = new User(uuid2, "y2", "m", 18);
map.put(uuid2, JSONObject.fromObject(user2).toString());
jedis.sadd(USER_TABLE_SEX_m,uuid2);
String uuid3 = UUID.randomUUID().toString();
User user3 = new User(uuid3, "y3", "n", 25);
map.put(uuid3, JSONObject.fromObject(user3).toString());
String uuid4 = UUID.randomUUID().toString();
User user4 = new User(uuid4, "y4", "n", 15);
map.put(uuid4, JSONObject.fromObject(user4).toString());
jedis.sadd(USER_TABLE_AGE_15,uuid4);
String uuid5 = UUID.randomUUID().toString();
User user5 = new User(uuid5, "y5", "m", 25);
map.put(uuid5, JSONObject.fromObject(user5).toString());
jedis.sadd(USER_TABLE_SEX_m,uuid5);
//把map存到缓存中
jedis.hmset("USER_TABLE", map);
那么,如果想要查询年龄为15的user,就需要先从USER_TABLE_AGE_15中取出所有的uuid,然后再从USER_TABLE中取出user
//获取年龄为15的user的uuid
Set<String> age = jedis.smembers(USER_TABLE_AGE_15);
//根据uuid获取user
List<User> userJson = new ArrayList<User>();
for (Iterator iterator = age.iterator(); iterator.hasNext();) {
String string = (String) iterator.next();
String jsonStr = jedis.hget(USER_TABLE, string);
JSONObject json = JSONObject.fromObject(jsonStr);
User user = (User) JSONObject.toBean(json, User.class);
userJson.add(user);
System.out.println(user);
}
结果如下:
User [id=63a970ec-e997-43e0-8ed9-14c5eb87de8b, name=y1, sex=m, age=15]
User [id=aa074a2a-88d9-4b50-a99f-1375539164f7, name=y4, sex=n, age=15]
那么如果现在需要年龄为15,性别为m的user呢,很简单,获取
USER_TABLE_AGE_15 和 USER_TABLE_SEX_m的并集,再从USER_TABLE中获取.
//获取年龄为15并性别为m的user
Set<String> userSet = jedis.sinter(USER_TABLE_AGE_15,USER_TABLE_SEX_m);
List<User> users = new ArrayList<User>();
for (Iterator iterator = userSet.iterator(); iterator.hasNext();) {
String string = (String) iterator.next();
String jsonStr = jedis.hget(USER_TABLE, string);
JSONObject json = JSONObject.fromObject(jsonStr);
User user = (User) JSONObject.toBean(json, User.class);
users.add(user);
System.out.println(user);
}
User [id=63a970ec-e997-43e0-8ed9-14c5eb87de8b, name=y1, sex=m, age=15]
以上就是redis实现条件查询的方法介绍,代码示例简单明了,如果在日常工作遇到此问题。通过这篇文章,希望你能有所收获,更多详情敬请关注亿速云行业资讯频道!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341