首先,先了解一下哈希表,相对于对于列表(list)的了解,哈希表就比较陌生了,哈希表在百度词典中的定义为:
散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。
因为本身接触哈希也是比较少,所以,只能是很浅地了解一下哈希表的原理;
简单来讲,哈希表与python结合来理解就是,表现很像列表,但是内部却是以字典的形式,即类似于键值对的形式,但是哈希是以唯一索引的形式去存储数据,这样可以节约查询的时间,但是缺陷是比较占内存,可以说是用空间来换时间了。
在redis中,hash的一些简单个人理解:
首先,在redis中,创建时,hash以键key中有多个索引region(域),每个索引对应唯一值value的形式进行存储,在对hash进行操作时,大多是对key中存储的region进行操作,也可直接对key进行操作。
redis中对于hash的一些指令:
关键字 | 用法 | 指令作用 |
---|---|---|
hdel | hdel key region1 region2… | 删除哈希表key中的一个或多个file(域) |
hexists | hexists key region | 查看哈希表key中是否有指定的域 |
hget | hget key rekgion | 查询哈希表key中指定域的值 |
hgetall | hgetall key | 查询哈希表key中的所有域以及对应的值 |
hincrby | hincrby key region num | 给哈希表key中指定域对应的值增加num |
hincrbyfloat | hincrbyfloat key region num | 给哈希表key中指定域对应的值增加num(浮点型) |
hkeys | hkeys key | 返回哈希表key中所有的域 |
hlen | hlen key | 返回哈希表key中域的数量 |
hmget | hmget key region1 region2… | 返回哈希表key中指定的一个或者多个域 |
hmset | hmset key region1 value1 … | 给哈希表key中一个或多个指定域进行赋值并存储 |
hset | hset key region value | 给哈希表key中的指定域region赋值并保存 |
hsetnx | hsetnx key region value | 给哈希表key中不存在的域region赋值并保存 |
hvals | hvals key | 返回哈希表key中所有域的值 |
hstrlen | hstrlen key region | 查询哈希表哦key中指定域对应的内容的字符串长度 |
语法:
hdel key region1 region2...
作用:
删除哈希表key中一个或多个region域,如果redion域不存在,则会自动忽略,删除下一个,知道全部删除。
示例:
127.0.0.1:6379> hset hash1 aa 11
(integer) 1
127.0.0.1:6379> hset hash1 bb 11
(integer) 1
127.0.0.1:6379> hset hash1 cc 11
(integer) 1
# 删除不存在的域
127.0.0.1:6379> hdel hash dd
(integer) 0
# 删除一个域
127.0.0.1:6379> hdel hash1 cc
(integer) 1
# 删除多个域
127.0.0.1:6379> hdel hash1 aa bb
(integer) 2
127.0.0.1:6379> keys *
(empty list or set)
语法:
hexists key region
作用:
查看哈希表key中是否有指定的region域;
如果指定域region存在,则返回1;
如果指定域region不存在,则返回0。
示例:
127.0.0.1:6379> hset hash1 aa 11
(integer) 1
# 查询的域存在时:
127.0.0.1:6379> hexists hash1 aa
(integer) 1
# 查询的域不存在时:
127.0.0.1:6379> hexists hash1 bb
(integer) 0
语法:
hget key region
作用:
查询哈希表key中指定域region对应的值;
如果指定域region存在,则返回对应的值;
如果指定域region不存在,则返回nil。
示例:
127.0.0.1:6379> hset hash1 aa 11
(integer) 1
# 当指定域region存在时:
127.0.0.1:6379> hget hash1 aa
"11"
# 当指定域region不存在时:
127.0.0.1:6379> hget hash1 bb
(nil)
语法:
hgetall key
作用:
查询哈希表key中所有的域以及指定的值;
当哈希表key中有值时,按照:
>>>域
>>>对应值
这种方式返回值;
如果哈希表key中没有值(即哈希表key不存在时),返回一个空列表。
示例:
127.0.0.1:6379> hset hash1 aa 11
(integer) 1
127.0.0.1:6379> hset hash1 bb 22
(integer) 1
# 当哈希表key存在且有值时:
127.0.0.1:6379> hgetall hash1
1) "aa"
2) "11"
3) "bb"
4) "22"
# 当哈希表key不存在时:
127.0.0.1:6379> hgetall hash2
(empty list or set)
语法:
hincrby key region num
作用:
向哈希表key指定域region的值进行增加num运算;
当指定域region对应的值不为数字时,会报错;
当指定域region对应的值为数字时,进行增加num运算,其中num可以为负数,相当于减法运算;
当指定域region不存在时,会先进行初始化值为0,再进行运算。
示例:
127.0.0.1:6379> hgetall hash1
1) "aa"
2) "11"
3) "bb"
4) "abc"
# 指定域region对应的值不为数字时:
127.0.0.1:6379> hincrby hash1 bb 10
(error) ERR hash value is not an integer
# 指定域region对应的值存在且为数字时:
127.0.0.1:6379> hincrby hash1 aa 10
(integer) 21
# 指定域region不存在时:
127.0.0.1:6379> hincrby hash1 cc -10
(integer) -10
语法:
hincrbyfloat key region num
作用:
与hincrby相似,只是其中的num值为浮点型数字,其余相同,具体作用见hincrby。
语法:
hkeys key
作用:
当哈希表存在且有域时,返回哈希表key中所有的域;
当哈希表不存在时,返回空列表。
示例:
# 当哈希表存在且有域时:
127.0.0.1:6379> hkeys hash1
1) "aa"
2) "bb"
3) "cc"
# 当哈希表不存在时:
127.0.0.1:6379> hkeys hash2
(empty list or set)
语法:
hlen key
作用:
当哈希表key存在且有域时,返回key中域的数量;
当哈希表key不存在时,返回0。
示例:
# 当哈希表key存在且有域时:
127.0.0.1:6379> hlen hash1
(integer) 3
# 当哈希表key不存在时:
127.0.0.1:6379> hlen hash2
(integer) 0
语法:
hmget key region1 region2
作用:
返回哈希表key中指定的一个或者多个域;
当指定域不存在时,返回nil;
当哈希表key不存在时,返回查询域个数nil的表。
示例:
# 当哈希表key存在且所查询的域都存在时:
127.0.0.1:6379> hmget hash1 aa bb cc
1) "21"
2) "abc"
3) "-10"
# 当哈希表key存在,但所查询的域有不存在的时候:
127.0.0.1:6379> hmget hash1 aa bb dd
1) "21"
2) "abc"
3) (nil)
# 当哈希表key不存在时:
127.0.0.1:6379> hmget hash2 aa bb cc
1) (nil)
2) (nil)
3) (nil)
语法:
hmset key region1 value1 region2 value2 ...
作用:
给哈希表key中的一个或多个域进行赋值并保存到表中;
当域存在时,会覆盖之前的值;
当哈希表key不存在时,会创建一个空的哈希表并执行后面的赋值与保存。
示例:
127.0.0.1:6379> hmget hash1 aa bb cc
1) "21"
2) "abc"
3) "-10"
# 当哈希表key存在时:
127.0.0.1:6379> hmset hash1 cc 100 dd abcd ee 20
OK
127.0.0.1:6379> hmget hash1 aa bb cc dd ee
1) "21"
2) "abc"
3) "100"
4) "abcd"
5) "20"
# 当哈希表key不存在时:
127.0.0.1:6379> keys *
1) "hash1"
127.0.0.1:6379> hmset hash2 a 1 b 2 c 3
OK
127.0.0.1:6379> hmget hash2 a b c
1) "1"
2) "2"
3) "3"
语法:
hset key region value
作用:
给哈希表key指定域region赋值并保存;
如果域region存在,则会将之前的值覆盖;
如果域region不存在,则会创建一个新的域region并赋值。
示例:
# 当域region存在时:
127.0.0.1:6379> hget hash1 aa
"21"
127.0.0.1:6379> hset hash1 aa 999
(integer) 0
127.0.0.1:6379> hget hash1 aa
"999"
# 当域region不存在时:
127.0.0.1:6379> hget hash1 ff
(nil)
127.0.0.1:6379> hset hash1 ff 10
(integer) 1
127.0.0.1:6379> hget hash1 ff
"10"
语法:
hsetnx key region value
作用:
给哈希表key中不存在的域region赋值并保存;
当域region存在时,操作无效;
当哈希表key不存在时,会创建新的哈希表key,并将域保存到表中。
示例:
当域不存在时:
127.0.0.1:6379> hget hash2 d
(nil)
127.0.0.1:6379> hsetnx hash2 d 999
(integer) 1
127.0.0.1:6379> hget hash2 d
"999"
当域存在时:
127.0.0.1:6379> hget hash2 a
"1"
127.0.0.1:6379> hsetnx hash2 a 999
(integer) 0
127.0.0.1:6379> hget hash2 a
"1"
# 当哈希表key不存在时:
127.0.0.1:6379> keys *
1) "hash2"
2) "hash1"
127.0.0.1:6379> hsetnx hash3 aaa 123
(integer) 1
127.0.0.1:6379> hget hash3 aaa
"123"
语法:
hvals key
作用:
返回哈希表key中所有域的值;
当key不存在时,返回一个空的表。
示例:
# 当哈希表key存在时:
127.0.0.1:6379> hvals hash1
1) "999"
2) "abc"
3) "100"
4) "abcd"
5) "20"
6) "10"
# 当哈希表key不存在时:
127.0.0.1:6379> hvals hash4
(empty list or set)
语法:
hstrlen key region
作用:
返回哈希表key指定域region对应的值的字符串的长度;
如果哈希表key或者指定域region不存在时,返回0。
示例:
# 当哈希表key存在且指定域region有值时:
127.0.0.1:6379> hset hash1 111 abcd123
(integer) 1
127.0.0.1:6379> hstrlen hash1 111
(integer) 7
# 当哈希表存在,但指定域不存在时:
127.0.0.1:6379> hstrlen hash1 112
(integer) 0
# 当哈希表不存在时:
127.0.0.1:6379> hstrlen hash2 111
(integer) 0