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