【redis】hash根本下令和内部编码

打印 上一主题 下一主题

主题 987|帖子 987|积分 2961

表现情势

Redis 自身已经是键值对布局了
Redis 自身的键值对就是通过哈希的方式来构造的
把 key 这一层构造完成之后,到了 value 这一层,value 这一层也可以是哈希



  • 哈希范例中的映射关系通常称为 field-value,用于区分 Redis 团体的键值对(key-value),注意这里的 value 是指 field 对应的值,不是 key 对应的值,注意 value 在差别上下文的作用
下令

HSET 和 HGET

设置/获取 hash 中指定的字段(field)的值(value)

语法:
  1. HSET key field value [field value...]
  2. HGET key field
复制代码


  • HSET 的返回值是设置成功的键值对(field-value)的个数
  • 时间复杂度:                                        O                            (                            1                            )                                  O(1)                     O(1)

HEXISTS

判断 hash 中是否有指定的字段

语法:
  1. HEXISTS key field
复制代码


  • 返回值:1 表现存在,0 表现不存在
  • 时间复杂度:                                        O                            (                            1                            )                                  O(1)                     O(1)

HDEL

删除 hash 中指定的字段


  • del 删除的是 key
  • hdel 删除的是 field

语法:
  1. HDEL key field [field...]
复制代码


  • 返回值是本次删除的字段个数
  • 时间复杂度:删除一个元素为                                         O                            (                            1                            )                                  O(1)                     O(1),删除                                         N                                  N                     N 个位                                         O                            (                            N                            )                                  O(N)                     O(N)(几十几百个就视为 1)

   

  • HDEL 是删除 key 对应的 value(field-value) 中的键值对 field
  • DEL 是直接删除 key 对应的 value(里面全部的键值对全删)
  HKEYS

获取 hash 中的全部字段

语法:
  1. HKEYS key
复制代码


  • 这个操作,会先根据 key 找到对应的 hash(                                        O                            (                            1                            )                                  O(1)                     O(1)),然后再遍历 hash(                                        O                            (                            N                            )                                  O(N)                     O(N),                                        N                                  N                     N 为 hash 的元素个数)
   谈到                                         O                            (                            N                            )                                  O(N)                     O(N),有的时候,                                        N                                  N                     N 表现:
  

  • Redis 团体 key 的个数
  • 当前下令中 key 的个数 (由于我们一般不会弄太多 key,所以一般可以直接看做                                              O                               (                               1                               )                                      O(1)                        O(1))
  • 当前 key 对应的 value 里面的元素个数

  HVALS

获取 hash 中的全部的值

语法:
  1. HVALS key
复制代码


  • 时间复杂度:                                         O                            (                            N                            )                                  O(N)                     O(N)(                                        N                                  N                     N 是哈希的元素个数,假如哈希非常大,这个操作就可能导致 Redis 服务器被阻塞住)

HGETALL

获取 hash 中的全部字段以及对应的值


  • 相当于联合了 HKEYS 和 HVALS

语法:
  1. HGETALL key
复制代码


  • 时间复杂度:                                         O                            (                            N                            )                                  O(N)                     O(N)(                                        N                                  N                     N 是哈希的元素个数,假如哈希非常大,这个操作就可能导致 Redis 服务器被阻塞住)

   这个操作,还是风险比较大。多数情况下,不须要查询全部的 field,可能只查此中的几个 key
  HMGET

一次获取 hash 中多个字段的值

语法:
  1. HMGET key field [field...]
复制代码


  • 时间复杂度:删除一个元素为                                         O                            (                            1                            )                                  O(1)                     O(1),删除                                         N                                  N                     N 个位                                         O                            (                            N                            )                                  O(N)                     O(N)(几十几百个就视为 1)
  • 返回值:字段对应的值或者 nil

   

  • 上述 HKEYS、HVALS、HGETALL 都是存在一定风险的。hash 元素个数太多,实行的时间就会比较长,从而阻塞 Redis

    • 一条下令,就能完成全部的遍历操作

  • HSCAN 遍历 Redis 的 hash,“渐进式遍历

    • 敲一次下令,遍历一小部门
    • 再敲一次下令,再遍历一小部门

    • 连续实行多次,就可以完成整个遍历过程(化整为零

  ConcurrentHashMap 线程安全的哈希表
HLEN

获取 hash 中的全部字段的个数

语法:
  1. HLEN key
复制代码


  • 时间复杂度:                                         O                            (                            1                            )                                  O(1)                     O(1)
  • 返回值:字段个数

HSETNX

在字段不存在的情况下,设置 hash 中的字段和值

语法:
  1. HSETNX key field value
复制代码


  • 时间复杂度:                                         O                            (                            1                            )                                  O(1)                     O(1)
  • 返回值:1 表现成功,0 表现失败

HINCRBY

将 hash 中字段对应的数字添加指定的值

语法:
  1. HINCRBY key field increment
复制代码


  • 时间复杂度:                                         O                            (                            1                            )                                  O(1)                     O(1)
  • 返回值:该字段变化后的值

HINCRBYFLOAT

HINCRBY 的浮点数版本

语法:
  1. HINCRBYFLOAT key field increment
复制代码


  • 时间复杂度:                                         O                            (                            1                            )                                  O(1)                     O(1)
  • 返回值:该字段变化后的值

下令小结


内部编码

哈希的内部编码有两种:

  • ziplist:压缩列表
  • hashtable:哈希表

压缩:


  • rar
  • zip
  • gzip
  • 7z

  • 这是一些具体的压缩算法。
压缩的本质,是针对数据举行重新编码。差别的数据,有差别的特点,联合这些特点,举行精妙的设计,重新编码之后,就能够缩小体积
   比如,现在有字符串:abcccddddeeeee
  

  • 重新编码表现:1a2b3c4d5e
  • 重新编码后的结果就比原来的短了(粗糙)
  ziplist 内部的数据布局也是精心设计的(目标是节省内存空间)


  • 表现一个普通的 hash 表,可能会浪费一定的空间(hash 首先是一个数组,数组上有些位置有元素,有些没有元素)
  • 付出的代价是举行读写元素,速率是比较慢的。假如元素个数少,慢的不明显,但假如元素多了,慢就会雪上加霜

假如:

  • 哈希中的元素个数比较少,使用 ziplist 表现;元素较多,就用 hashtable 来表现
  • 每个 value 的值,长度都比较短,使用 ziplist 表现;假如某个 value 的长度太长了,也会转换成 hashtable



  • 可以在 redis。conf 文件中,调整 hash-max-ziplist-entries 配置和 hash-max-ziplist-value 配置


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

干翻全岛蛙蛙

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表