06_Jedis完成MySQL的条件查询案例
【概述】
假设现在有一个User表,其中有id,name,age,sex等字段,完成如下要求的SQL语句为:
1.查找所有age=18 的User
select * from user where age= ;
2.查找所有sex="M"("M"代表男性)的User
select * from user where sex="M" ;
3.查找所有sex="M" and age=18 的User
select * from user where age= and sex="M" ;
在MySQL关系型数据库中,这些操作是非常轻松的,但是在Redis这种非关系型数据库中,我们需要经过设计才能完成上述的功能。
【工程截图】

【redis.properties 配置文件】
ip=127.0.0.1
port=
maxActive=
maxIdle=
maxWait=
isTestOnBorrow=true
【RedisUtils.java】
package com.higgin.util; import java.io.InputStream;
import java.util.Properties; import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig; public class RedisUtils { private static String ip;
private static int port;
private static int maxActive; //最大连接数
private static int maxIdle;
private static long maxWait;
private static boolean isTestOnBorrow; private static JedisPool jedisPool;
private static JedisPoolConfig config;
private static Jedis jedis; static{ //静态代码块中完成解析redis.properties各种配置的工作
try{
InputStream in=RedisUtils.class.getClassLoader().getResourceAsStream("redis.properties");
Properties prop =new Properties();
prop.load(in); ip=prop.getProperty("ip");
port=Integer.parseInt(prop.getProperty("port"));
maxActive=Integer.parseInt(prop.getProperty("maxActive"));
maxIdle=Integer.parseInt(prop.getProperty("maxIdle"));
maxWait=Long.parseLong(prop.getProperty("maxWait"));
isTestOnBorrow=Boolean.parseBoolean(prop.getProperty("isTestOnBorrow")); config=new JedisPoolConfig(); //实例化一个Jedis连接池配置 的对象实例
config.setMaxActive(maxActive); //控制一个pool可以分配多少个jedis实例,通过JedisPool.getResource()获取
config.setMaxIdle(maxIdle); //控制一个pool最多有多少个状态为idle(空闲)的jedis实例
config.setMaxWait(*maxWait); //当borrow(引入)一个jedis实例时,最大的等待时间,如果超过等待时间,直接抛出JedisConnectionException
config.setTestOnBorrow(isTestOnBorrow); jedisPool=new JedisPool(config,ip,port); }catch(Exception e){
e.printStackTrace();
}
} /**
* 从连接池中得到一个jedis实例
* @return
*/
public static Jedis getJedis(){
jedis=jedisPool.getResource();
return jedis;
} /**
* 将jedis返还到连接池
*/
public static void returnResource(Jedis jedis){
if(jedis!=null){
jedisPool.returnResource(jedis);
}
} }
【JsonUtils.java】
package com.higgin.util;
import com.alibaba.fastjson.JSON;
public class JsonUtils {
    /**
     * 对象obj转成Json字符串
     */
    public static String getJsonString(Object obj){
        return JSON.toJSONString(obj);
    }
    /**
     * json字符串转成 Object对象
     */
    public static<T> T getObjectFromJsonString(String json,Class<T> clazz){
        return JSON.parseObject(json,clazz);
    }
}
【User.java】
package com.higgin.domain;
public class User {
    final public static String USER_KEY = "user_key";
    final public static String USER_AGE_KEY_18 = "user_age_key18";
    final public static String USER_SEX_KEY_M ="user_sex_key_m";
    final public static String USER_SEX_KEY_W ="user_sex_key_w";
    private String id;
    private String name;
    private int age;
    private String sex;
    //注意:要想被FastJson的JsonString-->Object,对应的Object必须有构造方法
    public User(){
    }
    public User(String id, String name, int age, String sex) {
        this.id = id;
        this.name = name;
        this.age = age;
        this.sex = sex;
    }
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String getSex() {
        return sex;
    }
    public void setSex(String sex) {
        this.sex = sex;
    }
    @Override
    public String toString() {
        return "User [id=" + id + ", name=" + name + ", age=" + age + ", sex="
                + sex + "]";
    }
}
【UserRedisDao.java 接口】
package com.higgin.dao; import java.util.List;
import com.higgin.domain.User; public interface UserRedisDao { public void setUserObject(String key,String id,User user); public void setUserJsonStr(String key,String id, String userJsonStr); public void setKeyId(String key,String id); public User getUser(String key,String id); public List<String> getIds(String key); public List<String> getIdsInter(String key1,String key2); //取出两个key所在的集合的交集 public List<String> getUsersByFields(String key,String[] fields); //返回对应的key中,满足fiedls数组的所有value
}
【UserRedisDaoImpl.java】
package com.higgin.dao.impl; import java.util.ArrayList;
import java.util.List;
import java.util.Set; import redis.clients.jedis.Jedis; import com.higgin.dao.UserRedisDao;
import com.higgin.domain.User;
import com.higgin.util.JsonUtils;
import com.higgin.util.RedisUtils; public class UserRedisDaoImpl implements UserRedisDao{ Jedis jedis=RedisUtils.getJedis(); @Override
public void setUserObject(String key, String id, User user) {
setUserJsonStr(key,id,JsonUtils.getJsonString(user));
} @Override
public void setUserJsonStr(String key,String id, String userJsonStr) {
jedis.hset(key, id, userJsonStr);
} @Override
public User getUser(String key,String userId) {
String userJsonStr=jedis.hget(key, userId);
return JsonUtils.getObjectFromJsonString(userJsonStr, User.class);
} @Override
public List<String> getIds(String key) {
Set<String> ids= jedis.smembers(key);
List<String> idsList=new ArrayList<String>(ids);
return idsList;
} @Override
public void setKeyId(String key, String id) {
jedis.sadd(key, id);
} @Override
public List<String> getIdsInter(String key1, String key2) {
Set<String> ids=jedis.sinter(key1,key2); //得到两个id集合的交集
List<String> idsList=new ArrayList<String>(ids);
return idsList;
} @Override
public List<String> getUsersByFields(String key, String[] fields) {
return jedis.hmget(key, fields);
} }
【TestUserRedisDao.java】
package com.higgin.dao; import java.util.List;
import redis.clients.jedis.Jedis; import com.higgin.dao.impl.UserRedisDaoImpl;
import com.higgin.domain.User;
import com.higgin.util.RedisUtils; public class TestUserRedisDao {
public static void main(String[] args) {
Jedis jedis=RedisUtils.getJedis(); User u1 =new User("", "zhangsan", , "M");
User u2 =new User("", "lisi", , "W");
User u3 =new User("", "wangwu", , "W");
User u4 =new User("", "maliu", , "W");
User u5 =new User("", "zhengqi", , "M");
User u6 =new User("", "songba", , "M"); UserRedisDao userDao=new UserRedisDaoImpl();
userDao.setUserObject(User.USER_KEY, u1.getId(), u1);
userDao.setUserObject(User.USER_KEY, u2.getId(), u2);
userDao.setUserObject(User.USER_KEY, u3.getId(), u3);
userDao.setUserObject(User.USER_KEY, u4.getId(), u4);
userDao.setUserObject(User.USER_KEY, u5.getId(), u5);
userDao.setUserObject(User.USER_KEY, u6.getId(), u6); userDao.setKeyId(User.USER_AGE_KEY_18, u1.getId());
userDao.setKeyId(User.USER_AGE_KEY_18, u3.getId());
userDao.setKeyId(User.USER_AGE_KEY_18, u5.getId()); userDao.setKeyId(User.USER_SEX_KEY_M, u1.getId());
userDao.setKeyId(User.USER_SEX_KEY_M, u5.getId());
userDao.setKeyId(User.USER_SEX_KEY_M, u6.getId()); //完成select * from user where age=18
List<String> ageIdsList=userDao.getIds(User.USER_AGE_KEY_18);
System.out.println(ageIdsList);
String[] ageIdsArray =(String[]) ageIdsList.toArray(new String[ageIdsList.size()]); //id的List --> 数组
List<String> userJsonList1=userDao.getUsersByFields(User.USER_KEY,ageIdsArray); //从user的hash类型中获取多个filed的value,传入的field可以为字符串数组
System.out.println(userJsonList1); //打印出所有的满足条件的user System.out.println("------------------------------------------------------"); //完成select * from user where sex="M"
List<String> sexManList=userDao.getIds(User.USER_SEX_KEY_M);
System.out.println(sexManList);
String[] sexManArray=sexManList.toArray(new String[sexManList.size()]);
List<String> userJsonList2=userDao.getUsersByFields(User.USER_KEY, sexManArray);
System.out.println(userJsonList2); System.out.println("------------------------------------------------------"); //完成select * from user where age=18 and sex="M"
List<String> ageAndSexIdsList=userDao.getIdsInter(User.USER_AGE_KEY_18, User.USER_SEX_KEY_M); //取交集
System.out.println(ageAndSexIdsList);
String[] ageAndSexArray=(String[])ageAndSexIdsList.toArray(new String[ageAndSexIdsList.size()]);
List<String> userJsonList3=userDao.getUsersByFields(User.USER_KEY, ageAndSexArray);
System.out.println(userJsonList3); jedis.quit();
}
}
【运行结果】

06_Jedis完成MySQL的条件查询案例的更多相关文章
- mysql  in条件查询到底会不会用到索引
		MySQL 的 in 查询在 5.5 以上的版本中存储引擎都是 innodb 的,正常情况下会走索引的!至于 MyISAM 没试过! 如果是 5.5 之前的版本确实不会走索引的,在 5.5 之后的版本 ... 
- lucene复合条件查询案例——查询name域 或 description域 包含lucene关键字的两种方式
		方式一:使用语法表达式查询 //查询name域 或 description域包含lucene关键字 QueryParser queryParser = new QueryParser("na ... 
- 【MySQL】条件查询之排序聚合分组分页查询
		排序查询 语法:order by 子句 order by 排序字段1 排序方式1 , 排序字段2 排序方式2... 排序方式: ASC:升序,默认的. DESC:降序. 注意: 如果有多个排序条件,则 ... 
- python Mysql 多条件查询
		做项目时,遇到一场景,前端至少传入一个参数,最多传入四个参数,根据单参数或者组合参数,从数据库筛选数据. 作为一个小白,思考之,从数学的角度,\(C_4^1 + C_4^2+C_4^3+C_4^4=1 ... 
- mysql按条件查询当条件是数字的时候加不加引号是一样的。
		select * from user where id=1 select * from user where id="1" 在查询的注意是否需要加上""; 
- MySQL条件查询
		语法: ①SELECT 查询列表(可以包括:字段.表达式.常量值.几个拼在一起的,构成的表) ②FROM 表名(原始表) ③WHERE (理解为当...筛选条件=TRUE或筛选条件=FALSE) 筛选 ... 
- 记一次mysql多表查询(left jion)优化案例
		一次mysql多表查询(left jion)优化案例 在新上线的供需模块中,发现某一个查询按钮点击后,出不来结果,找到该按钮对应sql手动执行,发现需要20-30秒才能出结果,所以服务端程序判断超时, ... 
- (四)MySQL条件查询(通配符、模糊查询)、排序查询、分组查询(单行、分组函数)
		一.条件查询 1.含义:前面学的基础查询可以查询一个或多个字段,如果需要的数据仅仅是其中的某一行或多行就用到了条件查询. 2.语法:(序号表示语句执行顺序) SELECT 字段名 ③ FROM 表名 ... 
- MySQL——基础查询与条件查询
		基础查询 /* 语法: select 查询列表 from 表名; 类似于:System.out.println(打印东西); 1.查询列表可以是:表中的字段.常量值.表达式.函数 2.查询的结果是一个 ... 
随机推荐
- swarm1
			type 必选项,1表示container,2表示swarm stack,3表示compose stack title 必选项 description 必选项 image 必选项,该应用使用的dock ... 
- 洛谷 P1217 [USACO1.5]回文质数 Prime Palindrome
			嗯... 这道题对于蒟蒻的我来说实在是TQL... 先看一下题:(题目链接:https://www.luogu.org/problemnew/show/P1217) 然后说一下我的做题过程吧: 一看到 ... 
- PHP 生成 MySql 数据库字典
			项目说明 通过配置 MySql 数据库信息,使用 PHP 生成数据表字典可以输出在当前页面,可以生成文件保存在指定位置,也可以下载格式支持网页HTML格式.CSV格式(Excel 读取).ZIP压缩格 ... 
- hybrid app开发工具
			hybrid app开发工具 1.AppCan AppCan是国内Hybrid App混合模式开发的倡导者,AppCan应用引擎支持Hybrid App的开发和运行.并且着重解决了基于HTML5的移动 ... 
- 有用的 Angular CLI 命令参数
			这是一些有用的 Angular 5 CLI 命令参数,注意参数前面的-和--的不同... 1. 指定build的输出为production version,合并优化css and js files. ... 
- Linux 运维之硬链接与软链接详解
			了解这个的时候不如先知道下文件吧. 我们知道文件都有文件名与数据,但是呢这个在 Linux 上被分成两个部分:用户数据 (user data) 与元数据 (metadata). 用户数据,即文件数据块 ... 
- Java实现Ip代理池
			设置Ip代理很多时候都会有用到,尤其是在写爬虫相关项目的时候.虽然自己目前没有接触这种需求,但由于最近比较闲,就写着当作练习吧 爬取代理IP 爬取 关于爬取代理IP,国内首先想到的网站当然是 西刺代理 ... 
- 32位x86处理器编程导入——《x86汇编语言:从实模式到保护模式》读书笔记08
			在说正题之前,我们先看2个概念. 1.指令集架构(ISA) ISA 的全称是 instruction set architecture,中文就是指令集架构,是指对程序员实际"可见" ... 
- 生成ks.cfg文件
			RHEL 7下生成ks.cfg文件 环境 + RHEL 7 + 字符界面, 没有安装图形界面 软件包安装 + `yum install system-config-kickstart -y` + `y ... 
- SpringBoot | 第三十五章:Mybatis的集成和使用
			前言 最近收到公众号留言说,单纯的Mybatis的集成和使用.前面在第九章:Mybatis-plus的集成和使用介绍了基于mybatis-plus的集成和使用.后者也只是对mybatis进行了功能增强 ... 
