目录
基本介绍
哈希类型中的映射关系是field-value,用于区分redis整体的键值对(key-value)
命令
HSET
设置hash中指定的字段(field)和值(value)
语法:
HSET key field value [field value ..]
时间复杂度:O(1);
返回值:添加的字段的个数。
HGET
获取hash中指定字段的值
语法:
HGET key field
时间复杂度:O(1)
返回值:如果查询的key或者field不存在,返回nil
HEXISTS
判断hash中是否有指定的字段
语法:
HEXISTS key field
时间复杂度:O(1)
返回值:1表示存在,0表示不存在
HDEL
删除hash中指定的字段
语法:
HDEL key field [field ....]
时间复杂度:O(1);
返回值:本次删除字段的个数。
和del区分,del删除的是key,hdel删除的是field
HKEYS
获取hash中的所有字段
语法:
HKEYS key
时间复杂度:O(N),这个操作先根据key找到对应的hash,然后再遍历hash,这里的N是hash的元素个数
返回值:字段列表field
注意!这个操作也是存在一定的风险,与key * 类似,如果元素多的话,遍历的时间就比较久,就会把我们的redis阻塞很久。
HVALS
获取hash中所有的值
语法:
HVALS key
时间复杂度:O(N)
返回值:所有的值
HGETALL
获取hash中的所有字段以及对应的值
语法:
HGETALL key
时间复杂度:O(N)
返回值:字段和对应的值。
HMGET
一次查询多个field对应的值
语法:
HMGET key field1 field2 ..
返回值:多个value的顺序和field的顺序是匹配的。
HLEN
获取hash中所有字段的个数
语法:
HLEN key
时间复杂度:O(1)
返回值:字段个数
HSETNX
在字段不存在的情况下,设置hash中的字段和值
语法:
HSETNX key field value
时间复杂度:O(1)
返回值:1表示设置成功,0表示失败
HINCRBY
将hash中字段对应的数值添加指定的值(整数)
语法:
HINCRBY key field increment
时间复杂度:O(1)
返回值:该字段变化之后的值
HINCRBYFLOAT
将hash中字段对应的数值添加指定的值(小数)
语法:
HINCRBYFLOAT key field increment
时间复杂度:O(1)
返回值:该字段变化之后的值
HSTRLEN
计算value的字符串长度
语法:
HSTRLEN key field
内部编码
哈希的内部编码有两种:
ziplist(压缩列表):当哈希类型元素个数小于hash-max-ziplist-entries配置(默认512个)、同时所有值都小于hash-max-ziplist-value配置(默认64字节)时,redis会使用ziplist作为哈希的内部实现,ziplist使用更加紧凑的结构实现多个元素的连续存储,所以在节省内存方面比hashtable更加优秀。
hashtable(哈希表):当哈希类型无法满足ziplist 的条件时,redis会使用hashtable作为哈希的内部实现,因为此时ziplist的读写效率会下降,而hashtable的读写时间复杂度是O(1)。
原生字符串类型、哈希类型、序列化字符串json作缓存的区别
1、原生字符串类型--使用字符串类型,每个属性一个键
set user:1:name James
set user:1:age 23
- 优点:实现简单,针对个别属性变更也很灵活。
- 缺点:占用过多的键,内存占用量较大,同时用户信息在redis中比较分散,缺少内聚性,没有实用性。
2、序列化字符串类型,例如json格式
- 优点:针对总是以整体作为操作的信息比较合适,编程也简单,同时,如果序列化方式合理的话,内存利用率也比较高。
- 缺点:本身序列化和反序列需要一定开销,同时如果总是操作个别属性则非常不灵活。
3、哈希类型
- 优点:简单、直观、灵活,尤其针对信息局部的修改或获取操作。
- 缺点:需要控制哈希在ziplist和hashtable两种编码之间的转换,可能会造成较大的内存损耗