Redis 哈希数据类型(hash)是一个 string 类型的 field(字段) 和 value(值) 的映射表,下面将介绍怎样使用 jedis 操作 Redis 的 Hash。
向 Redis Hash 类型的键添加一个字段或者多个字段,方法定义如下:
Long hset(String key, Map<String,String> hash) 将整个 map 的键值对全部添加到键存储的 hash 中
Long hset(String key, String field, String value) 将指定的字段和值设置到键存储的 hash 中
Long hsetnx(String key, String field, String value) 如果在 key 存储的 hash 中,不存在 field 字段,则将该键值对添加到 key 的 hash 中。否则,不添加。
示例:
// 添加一个键值对到 mapKey 键中 jedis.hset("mapKey", "id", "100"); // 批量将 Map 中的键值对保存到 mapKey 键中 Map<String,String> map = new HashMap<>(); map.put("name", "人人编程网"); map.put("url", "www.hxstrive.com"); jedis.hset("mapKey", map); // 如果 name 不存在,则添加 name 属性 jedis.hsetnx("mapKey", "name", "new 人人编程网"); // 如果 isHttps 不存在,则添加 isHttps 属性 jedis.hsetnx("mapKey", "isHttps", "yes"); Map<String,String> resultMap = jedis.hgetAll("mapKey"); System.out.println(JSONObject.toJSONString(resultMap)); // 结果:{"name":"人人编程网","isHttps":"yes","url":"www.hxstrive.com","id":"100"}
从 Redis hash 中获取字段值,方法定义如下:
String hget(String key, String field) 返回 key 存储 hash 中 field 字段的值
Map<String,String> hgetAll(String key) 返回 key 存储 hash 中所有的字段和值
List<String> hmget(String key, String... fields) 返回 key 存储 hash 中 fields 数组中所有字段的值
示例:
// 准备点数据 Map<String,String> map = new HashMap<>(); map.put("id", "100"); map.put("name", "人人编程网"); map.put("url", "www.hxstrive.com"); jedis.hset("mapKey", map); // 获取 name 字段的值 String name = jedis.hget("mapKey", "name"); System.out.println("name=" + name); // name=人人编程网 // 一次性获取 name 和 id 字段的值 List<String> valueList = jedis.hmget("mapKey", "id", "name"); System.out.println(Arrays.toString(valueList.toArray())); // [100, 人人编程网] // 获取键对应的Map中所有的数据 Map<String,String> allMap = jedis.hgetAll("mapKey"); System.out.println(JSONObject.toJSONString(allMap)); // 结果:{"name":"人人编程网","url":"www.hxstrive.com","id":"100"}
从 Redis hash 中删除一个值,方法定义如下:
Long hdel(String key, String... fields) 从 key 存储的 hash 中删除 fields 指定的一个或多个字段
示例:
// 准备点数据 Map<String,String> map = new HashMap<>(); map.put("id", "100"); map.put("name", "人人编程网"); map.put("url", "www.hxstrive.com"); jedis.hset("mapKey", map); // 删除 mapKey 键中的 id 和 name 字段 long size = jedis.hdel("mapKey", "id", "name"); System.out.println("size=" + size); // size=2
检查指定的字段是否在 hash 中存在,方法定义如下:
Boolean hexists(String key, String field) 检查在 key 存储的 hash 中是否存在 field 字段。如果存在,则返回 true;如果不存在,则返回 false;
示例:
// 准备点数据 Map<String,String> map = new HashMap<>(); map.put("id", "100"); map.put("name", "人人编程网"); map.put("url", "www.hxstrive.com"); jedis.hset("mapKey", map); // 检查 mapKey 键的 Map 中是否存在 name 字段 boolean flag = jedis.hexists("mapKey", "name"); System.out.println("flag=" + flag); // flag=true
获取 redis hash 长度,方法定义如下:
Long hlen(String key) 返回 key 存储的 hash 中存在的条目数量,即键值对的数量
示例:
// 准备点数据 Map<String,String> map = new HashMap<>(); map.put("id", "100"); map.put("name", "人人编程网"); map.put("url", "www.hxstrive.com"); jedis.hset("mapKey", map); long size = jedis.hlen("mapKey"); System.out.println("size=" + size); // size=3
对 redis hash 中某个字段进行自增操作,方法定义如下:
Long hincrBy(String key, String field, long value) 对 key 存储的 hash 中的 field 字段的值自增 value
Double hincrByFloat(String key, String field, double value) 对 key 存储的 hash 中的 field 字段的值自增 value
示例:
// 准备点数据 Map<String,String> map = new HashMap<>(); map.put("id", "100"); jedis.hset("mapKey", map); // 对 id 字段加 1 jedis.hincrBy("mapKey", "id", 1); System.out.println(jedis.hget("mapKey", "id")); // 101 // 对 id 字段加 5.5 jedis.hincrByFloat("mapKey", "id", 5.5F); System.out.println(jedis.hget("mapKey", "id")); // 106.5
获取 redis hash 的所有键,方法定义如下:
Set<String> hkeys(String key) 获取 key 存储的 hash 中所有字段
示例:
// 准备点数据 Map<String,String> map = new HashMap<>(); map.put("id", "100"); map.put("name", "人人编程网"); map.put("url", "www.hxstrive.com"); jedis.hset("mapKey", map); // 获取 mapKey 键所有字段名 Set<String> keys = jedis.hkeys("mapKey"); System.out.println(Arrays.toString(keys.toArray())); // 结果:[name, url, id]
获取 redis hash 的所有值,方法定义如下:
List<String> hvals(String key) 获取 key 存储的 hash 中所有值
示例:
// 准备点数据 Map<String,String> map = new HashMap<>(); map.put("id", "100"); map.put("name", "人人编程网"); map.put("url", "www.hxstrive.com"); jedis.hset("mapKey", map); // 获取 mapKey 键所有字段名 List<String> vals = jedis.hvals("mapKey"); System.out.println(Arrays.toString(vals.toArray())); // 结果:[100, www.hxstrive.com, 人人编程网]
扫描 redis hash 中的条目,方法定义如下:
ScanResult<Map.Entry<String,String>> hscan(String key, String cursor) 使用默认参数扫描 key 存储的 hash
ScanResult<Map.Entry<String,String>> hscan(String key, String cursor, ScanParams params) 使用指定的参数 params 扫描 key 存储的 hash
示例:
// 准备点数据 Map<String,String> map = new HashMap<>(); map.put("site_id", "100"); map.put("site_name", "人人编程网"); map.put("site_url", "www.hxstrive.com"); map.put("version", "1.2.0"); jedis.hset("mapKey", map); ScanParams scanParams = new ScanParams(); // 匹配所有 site_ 开头的字段 scanParams.match("site_*"); // 限制一次扫描2条,没有效果 scanParams.count(2); ScanResult<Map.Entry<String,String>> scanResult = jedis.hscan("mapKey", "0", scanParams); for(Map.Entry<String,String> entry : scanResult.getResult()) { System.out.println(entry.getKey() + "=" + entry.getValue()); } // 结果: // site_id=100 // site_url=www.hxstrive.com // site_name=人人编程网 String newCursor = scanResult.getCursor(); System.out.println("newCursor=" + newCursor); // newCursor=0