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

java和redis的哈希表 redis哈希类型_redis

 一、介绍

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

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

java和redis的哈希表 redis哈希类型_redis_02

二、数据结构

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

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

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

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

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

三、操作命令

命令

功能

语法

描述

hset

添加

Hset key filed1 value filed2..

往哈希表中添加一个或多个键值对

hmset

等同hset

Hset 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值

hlen

filed数量

Hlen key

返回哈希表中filed的数量

hkeys

全部filed

Hkeys  key

返回哈希表中全部filed

hvals

全部value

Hvals  key

返回哈希表中全部value

hexists

判断是否存在

Hexists  key filed

判断哈希表中 filed是否存在

hdel

删除指定filed

Hdel 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 会消耗 更多内存。