Redis的全称是REmote Dictionary Server,它主要提供了5种数据结构:字符串、哈希、列表、集合、有序集合,同时在字符串的基础之上演变 出了位图(Bitmaps)和HyperLogLog两种神奇的“数据结构”,并且随着 LBS(Location Based Service,基于位置服务)的不断发展,Redis3.2版本中 加入有关GEO(地理信息定位)的功能
哈希几乎所有的编程语言都提供了哈希(hash)类型,它们的叫法可能是哈 希、字典、关联数组。在Redis中,哈希类型是指键值本身又是一个键值对 结构,形如value={{field1,value1},...{fieldN,valueN}}
注意
哈希类型中的映射关系叫作field-value,注意这里的value是指field对应 的值,不是键对应的值
设置值,获取值
设置值
hset key field value
获取值
hget key field
实例
127.0.0.1:6379> hset user1 name nerrys
(integer) 1
127.0.0.1:6379> hget user1 name
"nerrys"
键或field不存在
如果键或field不存在,会返回nil:
127.0.0.1:6379> hget user2 name
(nil)
删除field
hdel key field [field ...]
实例
127.0.0.1:6379> hdel user1 name
(integer) 1
127.0.0.1:6379> hget user1 name
(nil)
计算field个数
hlen key
实例
127.0.0.1:6379> hget user1 name
"nerrys"
127.0.0.1:6379> hget user1 age
"22"
127.0.0.1:6379> hget user1 sex
"man"
127.0.0.1:6379> hget user1 city
"beijing"
127.0.0.1:6379> hlen user1
(integer) 4
批量设置或获取field-value
hmget key field [field ...]
hmset key field value [field value ...]
hmset和hmget分别是批量设置和获取field-value,
hmset需要的参数是key 和多对field-value,hmget需要的参数是key和多个field。
实例
127.0.0.1:6379> hmget user name user2 22 sex
"nerrys"
"age"
"user3"
"man"
127.0.0.1:6379> hmset user1 name nerrys age 22 sex man city beijing
OK
127.0.0.1:6379> hmget user1 name age sex city
"nerrys"
"22"
"man"
"beijing"
判断field是否存在
hexists key field
实例
127.0.0.1:6379> hexists user1 name
(integer) 1
获取所有field
hkeys key
实例
127.0.0.1:6379> hkeys user1
"name"
"age"
"sex"
"city"
获取所有value
hvals key
实例
127.0.0.1:6379> hvals user1
"nerrys"
"22"
"man"
"beijing"
获取所有的field-value
hgetall key
实例
127.0.0.1:6379> hgetall user1
"name"
"nerrys"
"age"
"22"
"sex"
"man"
"city"
"beijing"
注意:
在使用hgetall时,如果哈希元素个数比较多,会存在阻塞Redis的可能
hincrby hincrbyfloat
hincrby key field
hincrbyfloat key field
hincrby和hincrbyfloat,就像incrby和incrbyfloat命令一样,但是它们的作用域是filed。
实例
127.0.0.1:6379> hincrby user1 age 1
(integer) 23
127.0.0.1:6379> hget user1 age
"23"
计算value的字符串长度
hstrlen key field
实例
127.0.0.1:6379> hstrlen user1 name
(integer) 6
127.0.0.1:6379> hget user1 name
"nerrys"
哈希类型的内部编码有两种:
·ziplist(压缩列表):当哈希类型元素个数小于hash-max-ziplist-entries 配置(默认512个)、同时所有值都小于hash-max-ziplist-value配置(默认64 字节)时,Redis会使用ziplist作为哈希的内部实现,ziplist使用更加紧凑的 结构实现多个元素的连续存储,所以在节省内存方面比hashtable更加优秀。
·hashtable(哈希表):当哈希类型无法满足ziplist的条件时,Redis会使 用hashtable作为哈希的内部实现,因为此时ziplist的读写效率会下降,而 hashtable的读写时间复杂度为O(1)。
测试
127.0.0.1:6379> object encoding user1
"ziplist"
当有value大于64字节,内部编码会由ziplist变为hashtable:
127.0.0.1:6379> hset hashkey f1 thishashkeyisbetterthan64byteisisisisisiisisisisisiisisisisisisisiisisisisiisisisisiisisisisisisisiisisisisisiisis
(integer) 1
127.0.0.1:6379> object encoding hashkey
"hashtable"
当field个数超过512,内部编码也会由ziplist变为hashtable:
127.0.0.1:6379> hmset hashkey f1 v1 f2 v2 f3 v3 ...忽略... f513 v513(太长了)
使用场景1.对关系型数据库的数据存储