专业制作彩铃网站,网页qq空间登录,3月网站备案白名单,wordpress解封hash
哈希类型中的映射关系通常称为field-value#xff0c;⽤于区分 Redis 整体的键值对#xff08;key-value#xff09;#xff0c;注意这⾥的value是指field对应的值#xff0c;不是键#xff08;key#xff09;对应的值#xff0c;请注意 value 在不同上下⽂的作⽤…hash
哈希类型中的映射关系通常称为field-value⽤于区分 Redis 整体的键值对key-value注意这⾥的value是指field对应的值不是键key对应的值请注意 value 在不同上下⽂的作⽤。
hash常用命令
hset
作用设置 hash 中指定的字段field的值value 语法HSET key field value [field value ...] 返回值添加的字段的个数。
hget
作用获取 hash 中指定字段的值。 语法HGET key field 返回值字段对应的值或者 nil。
hexists
作用判断hash中是否有指定的 field 语法HEXISTS key field 返回值1 表⽰存在0 表⽰不存在。
hdel
作用删除 hash 中指定的字段hdel删除的是field 返回值本次操作删除的字段个数 语法HDEL key field [field ...] 注意 del 删除的是 key hdel 删除的是 field
hkeys
作用获取hash中的所有字段field。 这个操作先根据 key 找到对应的 hash, 然后再遍历 hash 语法HKEYS key
hvals
作用获取 hash 中的所有的 field 对应的value值。 语法HVALS key
hgetall
作用hgetall相当于是hkeys和hvals的结合用来获取 hash 中的所有 field以及对应的value。 语法HGETALL key
hmget
在使⽤ hgetall时如果哈希元素个数⽐较多会存在阻塞Redis的可能。如果开发⼈员只需要获取部分field可以使⽤ hmget 作用⼀次获取 hash 中多个 field 对应的 value 语法HMGET key field [field …]
hlen
作用获取hash中 field 的个数。 语法HLEN key
hsetnx
作用类似于 setnx 在字段不存在的情况下才能设置成功如果存在则失败 语法HSETNX key field value
hincrby
作用把hash这里的value也可以当作成数字来处理进行加减整数 语法HINCRBY key field increment
hincrbyfloat
作用进行加减小数 语法HINCRBYFLOAT key field increment
编码方式
在redis 6 版本之前哈希的内部编码有两种 ziplist压缩列表当哈希类型元素个数小于hash-max-ziplist-entries配置默认512个同时所有值都⼩于hash-max-ziplist-value配置默认64字节时Redis会使⽤ziplist作为哈希的内部实现ziplist使⽤更加紧凑的结构实现多个元素的连续存储所以在节省内存⽅⾯⽐hashtable更加优秀。 hashtable哈希表当哈希类型⽆法满⾜ziplis的条件时Redis会使⽤hashtable 作为哈希的内部实现因为此时ziplist的读写效率会下降⽽hashtable的读写时间复杂度为O(1)。
在redis 6 之后哈希的内部编码新增了listpack编码用来替代ziplist编码。
应用
缓存
string 虽然也是可以作为缓存使用但是存储结构化的数据使用 hash 类型更合适一些~~
下图为关系型数据表记录的两条用户信息用户的属性表现为表的列每条⽤⼾信息表现为⾏。
uidnameagecity1James28Beijing2Johnathan30Xian
如果映射关系表⽰这两个用户信息其中先根据user和uid来作为 hash 的 key值来区分每个不同的用户多对field-value对应用户的各个属性则如下图所示 上述场景中使用 string 类型也能做到缓存但是就需要使用到 json 这样的数据结构
但是如果使用 string (json)这种的格式来做缓存万一只想获取其中的某个 field 时就需要把整个 json 都要读取出来并解析构成一个对象来操作 field最后在重新序列化 json 字符串最后写回 redis。如果使用 hash 的方式来表示上述用户信息就可以使用 field 表示对象的每个属性(数据表的每个列)此时就可以非常方便的修改/获取任何一个属性的值。
但是需要注意的是哈希类型和关系型数据库有两点不同之处
哈希类型是稀疏的⽽关系型数据库是完全结构化的例如哈希类型每个键可以有不同的 field⽽关系型数据库⼀旦添加新的列所有⾏都要为其设置值即使为 null。关系数据库可以做复杂的关系查询而 Redis 去模拟关系型复杂查询例如联表查询、聚合查询等基本不可能维护成本⾼。