Jedis 操作哈希(Hash)

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, 人人编程网]

扫描Hash

扫描 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
说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
公众号