溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

redis怎么實(shí)現(xiàn)條件查詢?

發(fā)布時(shí)間:2020-05-18 11:38:16 來(lái)源:億速云 閱讀:435 作者:Leah 欄目:關(guān)系型數(shù)據(jù)庫(kù)

redis怎么實(shí)現(xiàn)條件查詢?這個(gè)問(wèn)題可能是我們?nèi)粘9ぷ鹘?jīng)常見到的。通過(guò)這個(gè)問(wèn)題,希望你能收獲更多。今天跟隨小編一起來(lái)看解決方案吧。

一、導(dǎo)入jar包

redis怎么實(shí)現(xiàn)條件查詢?

二、實(shí)現(xiàn)簡(jiǎn)單的條件查詢

創(chuàng)建一個(gè)User實(shí)體類

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 + "]";
    }
}

創(chuàng)建5個(gè)對(duì)象并將其存入緩存中,以便我們進(jìn)行測(cè)試

	//連接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條數(shù)據(jù)組成的map
	String uuid1 = UUID.randomUUID().toString();
	User user1 = new User(uuid1, "y1", "m", 15);
	//將對(duì)象轉(zhuǎn)為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中查詢,可以看到已經(jīng)將5個(gè)user對(duì)象存到緩存中

redis怎么實(shí)現(xiàn)條件查詢?

接下來(lái),首先實(shí)現(xiàn)單條件的查詢,比如說(shuō)查詢年齡為15的user和性別為m的user

由于Redis是nosql,無(wú)法直接像mysql那樣利用where進(jìn)行條件查詢,所以Redis想實(shí)現(xiàn)條件查詢,只能用一個(gè)笨方法:將所有符合條件的user存到一個(gè)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條數(shù)據(jù)組成的map
	
	String uuid1 = UUID.randomUUID().toString();
	User user1 = new User(uuid1, "y1", "m", 15);
	//將對(duì)象轉(zhuǎn)為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);

redis怎么實(shí)現(xiàn)條件查詢?

那么,如果想要查詢年齡為15的user,就需要先從USER_TABLE_AGE_15中取出所有的uuid,然后再?gòu)腢SER_TABLE中取出user

	//獲取年齡為15的user的uuid
	Set<String> age = jedis.smembers(USER_TABLE_AGE_15);
	
	//根據(jù)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);
	}

結(jié)果如下:

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]

那么如果現(xiàn)在需要年齡為15,性別為m的user呢,很簡(jiǎn)單,獲取
USER_TABLE_AGE_15 和 USER_TABLE_SEX_m的并集,再?gòu)腢SER_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實(shí)現(xiàn)條件查詢的方法介紹,代碼示例簡(jiǎn)單明了,如果在日常工作遇到此問(wèn)題。通過(guò)這篇文章,希望你能有所收獲,更多詳情敬請(qǐng)關(guān)注億速云行業(yè)資訊頻道!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI