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