redis自身就是键值对结构了,哈希类型是指值本⾝⼜是⼀个键值对结构,形如key="key",value={{field1,value1},...,{fieldN,valueN}}
字符串和哈希类型对⽐
哈希类型中的映射关系通常称为field-value,⽤于区分Redis整体的键值对(key-value),注意这⾥的value是指field对应的值,不是键(key)对应的值,注意value在不同上下⽂的作⽤
设置hash中指定的字段(field)的值(value)
语法:HSET key field value [field value ...]
时间复杂度:插⼊⼀组field为O(1),插⼊N组field为O(N) 返回值:添加成功的字段(filed-value)的个数
获取hash中指定字段的值
语法:HGET key field
返回值:字段对应的值或者nil
判断hash中是否有指定的字段
语法:HEXISTS key field
返回值:1表⽰存在,0表⽰不存在
删除hash中指定的字段
语法:HDEL key field [field ...]
时间复杂度:删除⼀个元素为O(1).删除N个元素为O(N) 返回值:本次操作删除的字段个数
注意:del删除的是key,hdel删除的是key当中的field字段
获取hash中的所有字段
语法:HKEYS key
时间复杂度:O(N),N为field的个数(先根据key找到对应的hash,然后再遍历hash => 有一定的风险,因为不知道某个hash当中是否会存在大量的field) 返回值:字段列表
获取hash中的所有的值
语法:HVALS key
时间复杂度:O(N),N为field的个数 返回值:所有的值
获取hash中的所有字段以及对应的值
语法:HGETALL key
时间复杂度:O(N),N为field的个数 返回值:字段和对应的值
⼀次获取hash中多个字段的值
语法: HMGET key field [field ...]
时间复杂度:只查询⼀个元素为O(1),查询多个元素为O(N),N为查询元素个数 返回值:字段对应的值或者nil
注意:在使⽤HGETALL时,如果哈希元素个数⽐较多,会存在阻塞Redis的可能。如果开发⼈员只需要获取部分field,可以使⽤HMGET,如果⼀定要获取全部field,可以尝试使⽤HSCAN命令,该命令采⽤渐进式遍历哈希类型 =>敲一次命令遍历一小部分,返回下一次从哪个位置开始遍历,连续执行多次就可以完成整个遍历过程,此时时间就是可控的,不会阻塞redis服务器
此时返回的多个value的顺序和field的顺序是匹配的
其实有HMSET进行一次设置多个field和value,但是并不需要,因为hset已经支持一次设置多个field和value了
获取hash中的所有字段的个数
语法:LEN key
时间复杂度:O(1) 返回值:字段个数
在字段(field)不存在的情况下,设置hash中的字段和值,如果存在,则失败
语法:HSETNX key field value
返回值:1表⽰设置成功,0表⽰失败 时间复杂度:O(1)
将hash中字段对应的数值添加指定的值
语法:HINCRBY key field increment #increment只能是整数(正数 负数 0),但是不能是浮点数
返回值:该字段变化之后的值 时间复杂度:O(1)
语法:HINCRBYFLOAT key field increment 本质是HINCRBY的浮点数版本
返回值:该字段变化之后的值 时间复杂度:O(1)