Redis数据类型-Hash-基本使用

命令使用

命令描述时间复杂度
HDEL删除哈希表 key 中的一个或多个指定域,不存在的域将被忽略O(N), N 为要删除的域的数量
HEXISTS查看哈希表 key 中,给定域 field 是否存在O(1)
HSET返回哈希表 key 中给定域 field 的值O(1)
HGETALL返回哈希表 key 中,所有的域和值O(N), N 为哈希表的大小
HINCRBY为哈希表 key 中的域 field 的值加上增量 incrementO(1)
HINCRBYFLOAT为哈希表 key 中的域 field 加上浮点数增量 incrementO(1)
HKEYS返回哈希表 key 中的所有域O(N), N 为哈希表的大小
HLEN返回哈希表 key 中域的数量O(1)
HMGET返回哈希表 key 中,一个或多个给定域的值O(N), N 为给定域的数量
HMSET同时将多个 field-value (域-值)对设置到哈希表 keyO(N), Nfield-value 对的数量
HSET将哈希表 key 中的域 field 的值设为 valueO(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号}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Redis中,常用的基本数据类型包括字符串(string)、哈希(hash)、列表(list)、集合(set)和有序集合(sorted set)。Redis本身是一个Map,所有数据都采用key:value的形式存储,而key永远是字符串类型。对于字符串类型,value可以是字符串、整型或浮点型,Redis能够自动识别。除了字符串类型,还有哈希类型,可以存储键值对的集合,对于哈希类型的操作,可以使用HSET、HGET等命令。此外,还有列表类型,用于存储有序的字符串列表,可以使用LPUSH、RPUSH等命令进行操作;集合类型,用于存储不重复的字符串集合,可以使用SADD、SREM等命令进行操作;有序集合类型,用于存储带有权重的有序字符串集合,可以使用ZADD、ZRANGE等命令进行操作。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [Redis的五种常用数据类型基本使用](https://blog.csdn.net/weixin_43795939/article/details/107815058)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [Redis五大基础数据类型的操作](https://blog.csdn.net/weixin_44183721/article/details/126116049)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值