Redis中的关系查询(范围查询,模糊查询等...)

https://yq.aliyun.com/articles/376606

模糊查询 Redis 2.8.9后zSet加入了一个非常有用的方法zrangeByLex

 

package com.imooc;

import com.alibaba.fastjson.JSON;
import lombok.Getter;
import lombok.Setter;
import org.apache.commons.lang3.StringUtils;
import redis.clients.jedis.Jedis;

import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * Created by Administrator on 2019/11/15 0015.
 */
public class MyRedis {

    public static void main(String[] args) {
        Jedis jedis = new Jedis("127.0.0.1", 6379);
        jedis.select(3);
        jedis.flushDB();
        Staff staff1 = new Staff();
        staff1.setId(1);
        staff1.setDepartment("IT");
        staff1.setName("Allen");
        staff1.setAge(29);

        Staff staff2 = new Staff();
        staff2.setId(2);
        staff2.setDepartment("QA");
        staff2.setName("Rachel");
        staff2.setAge(28);

        Staff staff3 = new Staff();
        staff3.setId(3);
        staff3.setDepartment("IT");
        staff3.setName("Carter");
        staff3.setAge(25);

        Staff staff4 = new Staff();
        staff4.setId(4);
        staff4.setDepartment("Mgr");
        staff4.setName("Arron");
        staff4.setAge(27);

        //string id:对象json串
        jedis.set("1", JSON.toJSONString(staff1));
        jedis.set("2", JSON.toJSONString(staff2));
        jedis.set("3", JSON.toJSONString(staff3));
        jedis.set("4", JSON.toJSONString(staff4));

        //hash结构结构  部门:ids
        jedis.hset("dept", "IT", "1,3");
        jedis.hset("dept", "QA", "2");
        jedis.hset("dept", "Mgr", "4");

        //zset结构存储name+age 可以模糊查询
        Map<String, Double> nameMap = new LinkedHashMap<>();
        nameMap.put("Allen:1", 0d);
        nameMap.put("Rachel:2", 0d);
        nameMap.put("Carter:3", 0d);
        nameMap.put("Arron:4", 0d);
        jedis.zadd("name", nameMap);


        Map<String, Double> ageMap = new LinkedHashMap<>();
        ageMap.put("1", 29d);
        ageMap.put("2", 28d);
        ageMap.put("3", 25d);
        ageMap.put("4", 27d);
        jedis.zadd("age", ageMap);
//        inDept(jedis);
//        rangeAge(jedis);
//        selectLike(jedis);
        pageQuery(jedis);
        jedis.close();

    }

    public static void inDept(Jedis jedis) {
        // 2 匹配查询 利用hash表的hget或hmget可以实现dept='IT'或者dept in ('IT', 'QA')这种单值或多值的完全匹配查询。
        // 拿到id列表后,再去查询key-value获得到对象。
        List<String> ids = jedis.hmget("dept", "IT", "QA");
        for (String id : ids) {
            if (id.indexOf(",") != -1) {
                //string-->>arr
                String[] split = StringUtils.split(id, ",");
                for (String s : split) {
                    String staff = jedis.get(s);
                    System.out.println(staff);
                }
            } else {
                String staff = jedis.get(id);
                System.out.println(staff);
            }
        }
    }

    public static void rangeAge(Jedis jedis) {
        //范围查询 将age保存成zSet的score,value是id,所以可以利用zSet的zrangeByScore方法获得score在某一区间范围内的value值。
        Set<String> agesId = jedis.zrangeByScore("age", 0, 27);
        for (String ageId : agesId) {
            String staff = jedis.get(ageId);
            System.out.println(staff);
        }
    }

    // 模糊查询 Redis 2.8.9后zSet加入了一个非常有用的方法zrangeByLex,我们将score都保存为0,
// value是姓名:id的格式,利用zrangeByLex可以获得字母在某一区间内的value值。
// 例如,zrangeByLex name [A, (F,可以查询出Allen, Aaron, Carter。
    public static void selectLike(Jedis jedis) {
        Set<String> nameSet = jedis.zrangeByLex("name", "[A", "[F");
        System.out.println(nameSet.toString());
    }

    //分页查询  同时,zrangeByLex还支持分页查询,语法类似limit start, offset。
    public static void pageQuery(Jedis jedis) {
        Set<String> nameSet = jedis.zrangeByLex("name", "[A", "[F", 0, 2);
        System.out.println(nameSet.toString());
    }

    @Setter
    @Getter
    public static class Staff {
        private Integer id;
        private String department;
        private String name;
        private Integer age;
    }


}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值