Redis五大数据类型——Hash哈希

Redis五大数据类型:String(字符串),Hash(哈希),List(列表),Set(集合)及Zset(sorted set:有序集合)。

 一、介绍

Redis 中的(Hash)类型是一个 String 类型与 field 和 field-value 的映射表,适用于存储对象,将一个对象类型存储在Hash类型中要比存在 String 类型中占用要更小,更加节省内存空间

以下是 String 类型和 Hash 类型的结构比较:

二、数据结构

底层使用两种数据结构存储:

  • ziplist  压缩列表
  • hashtable  普通的哈希表(key为set的值,value为null)

当使用ziplist编码必须满足下面两个条件,否则使用hashtable

  • 哈希对象保存的所有键值对的键和值的字符串长度都小于64字节
  • 哈希对象保存的键值对数量小于512

ziplist这里不再做讲解,我在《Redis五大数据类型——List列表》博文中讲解过,感兴趣的还请翻阅我之前的博文,谢谢

三、操作命令

命令功能语法描述
hset添加Hset key filed1 value filed2..往哈希表中添加一个或多个键值对
hmset等同hsetHset key filed1 value filed2..往哈希表中添加一个或多个键值对
hsetnx不存在则添加Hset key filed value哈希表不存在此filed则添加
hgetall查询全部Hgetall key返回哈希表中全部键值对
hget查询单个Hget key filed返回哈希表中单个filed的value值
hmget查询多个Hmget key filed1 filed2...返回哈希表中多个filed的value值
hlenfiled数量Hlen key返回哈希表中filed的数量
hkeys全部filedHkeys  key返回哈希表中全部filed
hvals全部valueHvals  key返回哈希表中全部value
hexists判断是否存在Hexists  key filed判断哈希表中 filed是否存在
hdel删除指定filedHdel key filed1 filed2...删除哈希表中指定的多个键值对
hincrby+增量值Hincrby key filed [num]向哈希表中指定的整数filed执行 "+增量值" 操作

1、Hset   向哈希表中添加一对键值    (添加)

语法:Hset key filed1 value [filed2 ...]

# 1.添加单个field-value 到user1对象中 (键值对:name-wpf)
[127.0.0.1:6379> hset user1 id 3
(integer) 1

# 查询user2
[127.0.0.1:6379> hgetall user1
1) "id"
2) "3"


# 2.添加多个field-value 到user2对象中 (键值对:name-wpf age-18)
[127.0.0.1:6379> hset user2 name wpf age 18
(integer) 2

# 查询user2
[127.0.0.1:6379> hgetall user2   # [hgetall key] 获取哈希表key中所有的键值对
1) "name"
2) "wpf"
3) "age"
4) "18"

2、Hsetnx   哈希表中不存在field,则添加    (不存在则添加)

语法:Hsetnx key filed value 

# 添加一对键值(key-value)到 map1哈希表中 (nam-lisa)
[127.0.0.1:6379> hset map1 name lisa
(integer) 1

# 1. 如果不存在name这个field,则添加,如果存在,就忽略此次操作
127.0.0.1:6379> hsetnx map1 name rose
(integer) 0

# 查询哈希表map1的所有键值(上述添加rose失败,因为存在name这个field了,即key已存在)
127.0.0.1:6379> hgetall map1
1) "name"
2) "lisa"

# 2. 继续使用“不存在则添加”命令,往哈希表map1中添加键值对 age-20
127.0.0.1:6379> hsetnx map1 age 20
(integer) 1

# 查询哈希表map1的所有键值(age添加成功了)
127.0.0.1:6379> hgetall map1
1) "name"
2) "lisa"
3) "age"
4) "20"

3、Hget   查询哈希表中单个filed的value值    (查询单个filed的值)

语法:Hget key filed 

# 查询哈希表map1的所有键值
127.0.0.1:6379> hgetall map1
1) "name"
2) "lisa"
3) "age"
4) "20"

# 查询哈希表map1中指定的age的值
127.0.0.1:6379> hget map1 age
"20"

4、Hmget   查询哈希表中多个filed的value值    (查询多个filed的值)

语法:Hmget key filed1 filed2... 

# 查询哈希表map1的所有键值
127.0.0.1:6379> hgetall map1
1) "name"
2) "lisa"
3) "age"
4) "20"

# 查询哈希表map1中 name和age的值
127.0.0.1:6379> hmget map1 name age
1) "lisa"
2) "20"

5、Hlen   查询哈希表中filed的数量    (查询filed数量)

语法:Hlen key

# 查询哈希表map1的所有键值
127.0.0.1:6379> hgetall map1
1) "name"
2) "lisa"
3) "age"
4) "20"

# 查询哈希表map1 的filed数量(name、age)
127.0.0.1:6379> hlen map1
(integer) 2

6、Hkeys   查询哈希表中所有的filed    (查询全部filed)

语法:Hkeys key

# 查询哈希表map1的所有键值
127.0.0.1:6379> hgetall map1
1) "name"
2) "lisa"
3) "age"
4) "20"

# 查询哈希表map1中所有的filed(即key)
127.0.0.1:6379> hkeys map1
1) "name"
2) "age"

8、Hvals   查询哈希表中所有的value值   (查询全部value)

语法:Hvals key

# 查询哈希表map1的所有键值
127.0.0.1:6379> hgetall map1
1) "name"
2) "lisa"
3) "age"
4) "20"

# 查询哈希表map1中所有 filed的value值
127.0.0.1:6379> hvals map1
1) "lisa"
2) "20"

9、Hexists   查询哈希表中是否存在某个filed    (判断是否存在filed)

语法:Hexists key

# 查询哈希表map1的所有键值
127.0.0.1:6379> hgetall map1
1) "name"
2) "lisa"
3) "age"
4) "20"

# 查询哈希表map1中 是否存在filed为id的
127.0.0.1:6379> hexists map1 id
(integer) 0  #不存在,返回0

# 查询哈希表map1中 是否存在filed为name的
127.0.0.1:6379> hexists map1 name
(integer) 1  #存在,返回1

10、Hdel  删除哈希表中指定的filed    (删除filed)

语法:Hdel key filed1 filed2 ...

# 添加 [name-jack]、[age-28]、[id-5] 键值对到 map1哈希表中
127.0.0.1:6379> hmset map1 name jack age 28 id 5
OK

# 查询哈希表map1的所有键
127.0.0.1:6379> hkeys map1
1) "name"
2) "age"
3) "id"

# 删除map1中的age、name
127.0.0.1:6379> hdel map1 age name
(integer) 2

# 查询哈希表map1的所有键 (只剩"id",另外两个已被删除)
127.0.0.1:6379> hkeys map1
1) "id"

11、Hincrby 删除哈希表中指定的filed    (给某个整数添加增量值)

语法:Hincrby key filed1 filed2 ...

# 查询哈希表map1的所有键值对
127.0.0.1:6379> hgetall map1
1) "id"
2) "5"

给map1中的id键的值累加+3
127.0.0.1:6379> hincrby map1 id 3
(integer) 8  #原始5,加3后等于8

给map1中的id键的值累加+1
127.0.0.1:6379> hincrby map1 id 1
(integer) 9 #原始8,加1后等于9

四、Hash结构优缺点

  • 优点:简单直观,将同类数据归类整合储存(同一个key),方便数据管理相比String储存更节省空间

  • 缺点:要控制和减少 哈希 在 ziplist 和 hashtable 两种 内部编码 的 转换,hashtable 会消耗 更多内存。

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Redis有五种主要的数据类型,它们分别是字符串(string)、哈希hash)、列表(list)、集合(set)和有序集合(sorted set),它们之间的区别如下: 1. 字符串(string):字符串是 Redis 最基础的数据类型,它存储的是一个字符串值,可以是数字、字符、二进制数据等。字符串类型支持的操作包括设置和获取值、对值进行加、减、乘、除等运算、对值进行位操作等。 2. 哈希hash):哈希类型是一种键值对类型,它存储的是一个键值对集合,其中键和值都是字符串类型的数据。哈希类型支持的操作包括设置和获取值、删除键值对、获取所有键值对等。 3. 列表(list):列表类型是一种链表结构,它存储的是一个有序的元素集合,每个元素都是一个字符串。列表类型支持的操作包括在列表的头部或尾部插入元素、在列表中删除元素、获取列表的长度、获取列表中的元素等。 4. 集合(set):集合类型是一个无序的元素集合,每个元素都是一个字符串。集合类型支持的操作包括向集合中添加元素、从集合中删除元素、获取集合中的元素个数、判断一个元素是否在集合中等。 5. 有序集合(sorted set):有序集合类型也是一个元素集合,每个元素都是一个字符串,但是它们和集合类型不同的是,有序集合中的元素是有序的,并且每个元素都有一个分数值。有序集合类型支持的操作包括向集合中添加元素、从集合中删除元素、获取集合中的元素个数、根据分数值范围获取元素等。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值