hash命令
因为在redis的哈希数据结构中,是存在两个key的,所以我们把哈希value里的key称为field。

hset,hget,hexist,hdel
hset:这个里面设置的value就只能设置字符串类型了,返回值表示成功插入几个值。
bash
hset key field1 value1 [fieldN valueN....]

hget:如果查找的key存在,则再次进行哈希查询field是否存在,如果存在则返回对应的value,如果不存在则返回nil,时间复杂度为O(1)。
bash
hget key field

hexists:判定hash中是否存在对应的字段,如果存在返回1,不存在返回0。
bash
hexist key field

hdel:del删除的是key,而hdel删除的是field,返回值返回的是删除的字段个数,如果删除一个不存在的值,则返回0。
bash
hdel key field [fieldN....]

hkeys和hvals
hkeys:先根据key找到对应的哈希,再遍历哈希,就可以获取到哈希里所有的field。
bash
hkeys key

hvals:和hkeys类似,但这个指令是获取到哈希中所有的value。
bash
hvals key

hgetall和hmget
hgetall:可以获取到所有的key和value。
bash
hgetall key

hmget:hgetall的风险还是比较大的,如果我们只想查询其中几个命令,可以使用hmget,可以一次查询多个field。
bash
hmget key field1[field2 field3 ....]

hscan也可以遍历redis里的数据,但它属于渐进式遍历,敲一次命令,遍历一小部分,就可以保证时间可控,不会阻塞服务器。
hlen,hsetnx,hincrby,hincrbyfloat
hlen:可以获取此key对应的哈希value里对应的元素个数,时间复杂度为O(1)。
bash
hlen key

hsetnx:当field不存在的时候,可以设置成功,如果field存在,则设置失败,当设置成功返回1,设置失败返回0。
bash
hsetnx key field value

hincrby:哈希这里的value也可以当作数字来处理,这个可以用于加减整数,返回值为加完之后的数。
bash
hincrby key field 整数

hincrbyfloat:和hincrby很类似,但主要是用于加减小数,返回值为加完之后的数。
bash
hincrbyfloat key field 小数

编码方式
哈希内部编码有两种,一种是ziplist(压缩列表),另外一种是hashtable(哈希表)的方式,当哈希列表中的元素较少,小于hash-max-ziplist-entries(默认为512个),并且其中的元素值均小于hash-max-ziplist-value(默认为64字节),就会使用ziplist编码,ziplist使用更加紧凑的结构连续存储元素,所以在节省内存方面比较优秀。当哈希类型无法满足ziplist条件时,redis就会使用更为复杂的hashtable进行存储。

应用
- 可以用于存储一些类似于关系型数据库的内容,比如说有一个用户的id,对应的value哈希就可以存储名字,年龄,城市等和此用户有关的信息。如果想使用字符串类型存储也是可以的,但这需要用到json格式。

- 关系型数据库的稀疏性:在MySQL中存储数据,如果一个属性是不存在的,那么就需要用null标识,而在redis中,如果一个属性不存在,我们可以不用特地标识出来,比如说用户1可以有名字,年龄和城市三种属性,而用户2可以有名字,性别,学校三种属性,不需要完全一样,这样的稀疏性可以减少空间的消耗。