命令使用
命令 | 描述 | 时间复杂度 |
---|---|---|
HDEL | 删除哈希表 key 中的一个或多个指定域,不存在的域将被忽略 | O(N), N 为要删除的域的数量 |
HEXISTS | 查看哈希表 key 中,给定域 field 是否存在 | O(1) |
HSET | 返回哈希表 key 中给定域 field 的值 | O(1) |
HGETALL | 返回哈希表 key 中,所有的域和值 | O(N), N 为哈希表的大小 |
HINCRBY | 为哈希表 key 中的域 field 的值加上增量 increment | O(1) |
HINCRBYFLOAT | 为哈希表 key 中的域 field 加上浮点数增量 increment | O(1) |
HKEYS | 返回哈希表 key 中的所有域 | O(N), N 为哈希表的大小 |
HLEN | 返回哈希表 key 中域的数量 | O(1) |
HMGET | 返回哈希表 key 中,一个或多个给定域的值 | O(N), N 为给定域的数量 |
HMSET | 同时将多个 field-value (域-值)对设置到哈希表 key 中 | O(N), N 为 field-value 对的数量 |
HSET | 将哈希表 key 中的域 field 的值设为 value | O(1) |
HSETNX | 将哈希表 key 中的域 field 的值设置为 value ,当且仅当域 field 不存在 | O(1) |
HVALS | 返回哈希表 key 中所有域的值 | O(N), N 为哈希表的大小 |
HSCAN | 用于迭代哈希表中的键值对 | O(N), N 为哈希表的大小 |
说明
HINCRBY:
为哈希表 key
中的域 field
的值加上增量 increment
。
增量也可以为负数,相当于对给定域进行减法操作。
如果 key
不存在,一个新的哈希表被创建并执行 HINCRBY 命令。
如果域 field
不存在,那么在执行命令前,域的值被初始化为 0
。
对一个储存字符串值的域 field
执行 HINCRBY 命令将造成一个错误。
本操作的值被限制在 64 位(bit)有符号数字表示之内。
HINCRBYFLOAT
如果哈希表中没有域 field
,那么 HINCRBYFLOAT 会先将域 field
的值设为 0
,然后再执行加法操作。
如果键 key
不存在,那么HINCRBYFLOAT 会先创建一个哈希表,再创建域 field
,最后再执行加法操作。
当以下任意一个条件发生时,返回一个错误:
- 域
field
的值不是字符串类型(因为 redis 中的数字和浮点数都以字符串的形式保存,所以它们都属于字符串类型) - 域
field
当前的值或给定的增量increment
不能解释(parse)为双精度浮点数(double precision floating point number)
HINCRBYFLOAT 命令的详细功能和 INCRBYFLOAT 命令类似,请查看 INCRBYFLOAT 命令获取更多相关信息。
HMGET
如果给定的域不存在于哈希表,那么返回一个 nil
值。
因为不存在的 key
被当作一个空哈希表来处理,所以对一个不存在的 key
进行 HMGET 操作将返回一个只带有 nil
值的表。
HMSET
此命令会覆盖哈希表中已存在的域。
如果 key
不存在,一个空哈希表被创建并执行 HMSET 操作。
HSET
如果 key
不存在,一个新的哈希表被创建并进行 HMSET 操作。
如果域 field
已经存在于哈希表中,旧值将被覆盖。
HSETNX
将哈希表 key
中的域 field
的值设置为 value
,当且仅当域 field
不存在。
若域 field
已经存在,该操作无效。
如果 key
不存在,一个新哈希表被创建并执行 HSETNX 命令。
RedisTemplate 基本使用
添加
通过put方法添加元素
redisTemplate.opsForHash().put("hash:key","1","1号");
redisTemplate.opsForHash().put("hash:key","2","2号");
redisTemplate.opsForHash().put("hash:key","3","3号");
通过putAll方法以map集合的形式添加
Map<String, String> newMap = new HashMap<>();
newMap.put("6","6号");
newMap.put("7","7号");
newMap.put("8","8号");
newMap.put("9","9号");
redisTemplate.opsForHash().putAll("hash:key",newMap);
查询
通过values(H key)方法获取变量中的hashMap值
redisTemplate.opsForHash().put("hash:key","1","1号");
redisTemplate.opsForHash().put("hash:key","2","2号");
redisTemplate.opsForHash().put("hash:key","3","3号");
List<Object> hashList = redisTemplate.opsForHash().values("hash:key");
//输出结果..............hashList:[1号, 2号, 3号]
通过entries(H key)方法获取变量中的键值对
redisTemplate.opsForHash().put("hash:key","1","1号");
redisTemplate.opsForHash().put("hash:key","2","2号");
redisTemplate.opsForHash().put("hash:key","3","3号");
Map<Object,Object> map = redisTemplate.opsForHash().entries("hash:key");
//输出结果..............map:{1=1号, 2=2号, 3=3号}
通过get(H key, Object hashKey)方法获取map键的值
redisTemplate.opsForHash().put("hash:key","1","1号");
redisTemplate.opsForHash().put("hash:key","2","2号");
redisTemplate.opsForHash().put("hash:key","3","3号");
Object mapValue = redisTemplate.opsForHash().get("hash:key","1");
//输出结果..............mapValue:1号
通过hasKey(H key, Object hashKey)方法判断变量中是否存在map键
redisTemplate.opsForHash().put("hash:key","1","1号");
redisTemplate.opsForHash().put("hash:key","2","2号");
redisTemplate.opsForHash().put("hash:key","3","3号");
boolean hashKeyBoolean = redisTemplate.opsForHash().hasKey("hash:key","1");
//输出结果..............hashKeyBoolean:true
hashKeyBoolean = redisTemplate.opsForHash().hasKey("hash:key","111");
//输出结果..............hashKeyBoolean:false
通过keys(H key)方法获取变量中的键数量
redisTemplate.opsForHash().put("hash:key","1","1号");
redisTemplate.opsForHash().put("hash:key","2","2号");
redisTemplate.opsForHash().put("hash:key","3","3号");
Set<Object> keySet = redisTemplate.opsForHash().keys("hash:key");
//输出结果..............keySet:3
通过size(H key)方法获取变量的数量
redisTemplate.opsForHash().put("hash:key","1","1号");
redisTemplate.opsForHash().put("hash:key","2","2号");
redisTemplate.opsForHash().put("hash:key","3","3号");
long hashLength = redisTemplate.opsForHash().size("hash:key");
//输出结果..............hashLength:3
通过multiGet(H key, Collection hashKeys)方法以集合的方式获取变量中的值
redisTemplate.opsForHash().put("hash:key","1","1号");
redisTemplate.opsForHash().put("hash:key","2","2号");
redisTemplate.opsForHash().put("hash:key","3","3号");
List<Object> list = new ArrayList<>();
list.add("1");
list.add("2");
list.add("3");
List mapValueList = redisTemplate.opsForHash().multiGet("hash:key",list);
//输出结果..............mapValueList:[1号, 2号, 3号]
通过scan(H key, ScanOptions options)方法获取匹配键值对
匹配获取键位map1的键值对,不能模糊匹配;
ScanOptions.NONE为获取全部键对;
redisTemplate.opsForHash().put("hash:key", "1", "1号");
redisTemplate.opsForHash().put("hash:key", "2", "2号");
redisTemplate.opsForHash().put("hash:key", "3", "3号");
Cursor<Map.Entry<Object, Object>> cursor = redisTemplate.opsForHash().scan("hash:key", ScanOptions.scanOptions().match("1").build());
while (cursor.hasNext()) {
Map.Entry<Object, Object> entry = cursor.next();
log.info("..............entry:" + entry.getKey() + "---->" + entry.getValue());
}
//输出结果..............entry:1---->1号
//获取全部键值对
Cursor<Map.Entry<Object,Object>> cursor = redisTemplate.opsForHash().scan("hash:key",ScanOptions.NONE);
通过increment(H key, HK hashKey, double delta)方法使变量中的键以值的大小进行自增长
redisTemplate.opsForHash().put("hash:key", "1", "1号");
redisTemplate.opsForHash().put("hash:key", "2", "2号");
redisTemplate.opsForHash().put("hash:key", "3", "3号");
double hashIncDouble = redisTemplate.opsForHash().increment(hash_key, "4", 3);
//输出结果..............hashIncDouble:3.0
hashIncDouble = redisTemplate.opsForHash().increment(hash_key, "4", 3);
//输出结果..............hashIncDouble:6.0
Map map = redisTemplate.opsForHash().entries(hash_key);
//输出结果..............map:{1=1号, 2=2号, 3=3号, 4=6}
通过increment(H key, HK hashKey, long delta)方法使变量中的键以值的大小进行自增长
redisTemplate.opsForHash().put("hash:key", "1", "1号");
redisTemplate.opsForHash().put("hash:key", "2", "2号");
redisTemplate.opsForHash().put("hash:key", "3", "3号");
long hashIncLong = redisTemplate.opsForHash().increment(hash_key, "5", 6);
//输出结果..............hashIncLong:6
hashIncLong = redisTemplate.opsForHash().increment(hash_key, "5", 6);
//输出结果..............hashIncLong:12
Map map = redisTemplate.opsForHash().entries(hash_key);
//输出结果..............map:{1=1号, 2=2号, 3=3号, 5=12}
修改
通过putIfAbsent(H key, HK hashKey, HV value)方法添加不存在于变量中的键值对
当前key存在时,则不会修改key的值
//当前key存在时,则不会修改key的值
redisTemplate.opsForHash().putIfAbsent("hash:key","1","1号-1");
redisTemplate.opsForHash().putIfAbsent("hash:key","10","10号");
Map map = redisTemplate.opsForHash().entries("hash:key");
//输出结果..............map:{1=1号, 2=2号, 3=3号, 10=10号}
删除
通过delete(H key, Object… hashKeys)方法删除变量中的键值
redisTemplate.opsForHash().put("hash:key", "1", "1号");
redisTemplate.opsForHash().put("hash:key", "2", "2号");
redisTemplate.opsForHash().put("hash:key", "3", "3号");
redisTemplate.opsForHash().delete("hash:key", "1", "2");
Map map = redisTemplate.opsForHash().entries("hash:key");
//输出结果..............map:{3=3号}