咱们知道在Redis中有5种数据类型,以前的文章中咱们已经介绍过了String类型,也就是字符串类型,今天咱们学习第二种数据类型,哈希类型。大部分语言基本都提供了哈希类型,如Java语言中的Map类型及Python语言中的字典类型等等。虽然语言不一样,但它们基本使用都是同样的。也就是都是键值对结构的。例如:python
value={{field1, value1}
下面咱们经过下图来直观感觉一下字符串类型和哈希类型的区别。redis
Redis中哈希类型都是键值对结构的,因此要特别注意这里的value并非指的是Redis中的key的value,而是Redis中哈希类型中的field所对应的value。学习
下面咱们仍是和介绍字符串类型同样,先是了解一下Redis中哈希类型的相关命令。编码
命令spa
一. 设置值code
hset key field value
咱们看上图执行的命令知道,hset命令也是有返回值的。若是hset命令设置成功,则返回1,不然则返回0。除此以外Redis也为哈希类型提供了hsetnx命令。在字符串那篇文章中,咱们知道,nx命令则表示key不存在的时候,才能设置成功,而在Redis中hsetnx命令则表示field不存在的时候,才能设置成功。ip
二. 获取值utf-8
hget key field
咱们看hget命令和get有很大的不一样,get命令在获取的时候,只要写一个名字就能够了,而hget命令则要写两个名字,第一个名字就是key 第二个名字就是field。除此以外,固然key或者field不存在时,返回的结果都是nil。作用域
三. 删除fieldrem
hdel key field [field ...]
hdel命令删除的时候,也会有返回值,而且这个返回就是成功删除field的个数。当field不存在时,并不会报错,而是直接返回0。
四. 计算field个数
hlen key
hlen命令返回的就是当前key中field的个数,若是key不存在,则返回0。
五. 批量设置或获取field-value
hmget key field [field ...] hmset key field value [field value ...]
hmset命令和hmget命令分别都是批量设置和获取值的,hmset命令没有什么要注意的,但hmget命令要特别注意,当咱们获取一个不存在的key或者不存在的field时,Redis并不会报错,而是返回nil。而且有几个field不存在,则Redis返回几个nil,当整个key都不存在时,则返回所有nil(有几个field返回几个nil)。
六. 判断field是否存在
hexists key field
当执行hexists命令时,若是当前key包括field,则返回1,不然返回0。
七. 获取全部field
hkeys key
八. 获取全部value
hvals key
九. 获取全部的field-value
hgetall key
hgetall命令会返回当前key中的全部field-value,并按照顺序依次返回,也就是field-value field-value等等。
十. hincrby hincrbyfloat
hincrby key field increment hincrbyfloat key field increment
hincrby命令和incrby命令的使用功能基本同样,都是对值进行增量操做的。惟一不一样的就是incrby命令的做用域key,而hincrby命令的做用域则是field。
十一. 计算value的字符串长度
hstrlen key field
hstrlen命令返回的是当前key中field中字符串的长度,若是当前key中没有field则返回0。
哈希类型命令的时间复杂度
命令 | 时间复杂度 |
---|---|
hset key field value | O(1) |
hget key field | O(1) |
hdel key field [field ...] | O(k) ,k是field个数 |
hlen key | O(1) |
hgetall key | O(n) ,n是field总数 |
hmget key field [field ...] | O(k) ,k是field个数 |
hmset key field value [field value ...] | O(k) ,k是field个数 |
hexists key field | O(1) |
hkeys key | O(n) ,n是field总数 |
hvals key | O(n) ,n是field总数 |
hsetnx key field value | O(1) |
hincrby key field increment | O(1) |
hincrbyfloat key field increment | O(1) |
hstrlen key field | O(1) |
内部编码
在Redis哈希类型的内部编码只有两种它们分别是:
下面咱们经过如下命令来演示一下ziplist和hashtable这两种内部编码。
1.当field个数比较少而且value也不是很大时候Redis哈希类型的内部编码为ziplist。
2.当value中的字节数大于64字节时(能够经过hash-max-ziplist-value设置),内部编码会由ziplist变成hashtable。
由于在Redis中中文的字节数比英文的字节数大大,正常来讲,一个中文占用3个字节。
3.当field个数超过512(能够经过hash-max-ziplist-entries参数设置),内部编码也会由ziplist变成hashtable。
因为直接建立512个field不方便,为了更好的验证该功能,我将用程序的方式,动态建立512个field来验证此功能,下面为具体的代码。
import redis r = redis.Redis(host='127.0.0.1', port=6379) print('Key为【userinfo】的字节编码为【%s】' % r.object('encoding', 'userinfo').decode('utf-8')) for i in range(1,513): r.hset('userinfo', i, '吉林乌拉') print('Key为【userinfo】的字节编码为【%s】' % r.object('encoding', 'userinfo').decode('utf-8'))
Key为【userinfo】的字节编码为【ziplist】 Key为【userinfo】的字节编码为【hashtable】
以上就是Redis中哈希类型的相关命令及内部编码,如本文有不正确的地方欢迎指出。