mysql redis 条件查询数据_redis实现简单的条件查询

本文介绍了如何在Redis中模拟MySQL的条件查询功能。通过创建User实体类,并存入Redis缓存,然后利用Redis的集合操作如SADD、SMEMBERS、SINTER等,实现了根据年龄和性别的组合条件来查询User数据。这种方法虽然不直接,但可以解决Redis作为NoSQL数据库无法直接进行复杂条件查询的问题。
摘要由CSDN通过智能技术生成

44f2c860bb0c7c19d3526aaf73fbf1d3.png

一、导入jar包

23ee36a41509f2067505280064499582.png

二、实现简单的条件查询

创建一个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 map = new HashMap();

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对象存到缓存中

e547513e89cc96d056a7a99794ff8f18.png

接下来,首先实现单条件的查询,比如说查询年龄为15的user和性别为m的user

由于Redis是nosql,无法直接像mysql那样利用where进行条件查询,所以Redis想实现条件查询,只能用一个笨方法:将所有符合条件的user存到一个set中。Jedis jedis = new Jedis("127.0.0.1",6379);

Map map = new HashMap();

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);

99a88a8ced0046421021b9d24c9c695a.png

那么,如果想要查询年龄为15的user,就需要先从USER_TABLE_AGE_15中取出所有的uuid,然后再从USER_TABLE中取出user//获取年龄为15的user的uuid

Set age = jedis.smembers(USER_TABLE_AGE_15);

//根据uuid获取user

List userJson = new ArrayList();

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 userSet = jedis.sinter(USER_TABLE_AGE_15,USER_TABLE_SEX_m);

List users = new ArrayList();

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知识请关注redis入门教程栏目。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值