zoukankan      html  css  js  c++  java
  • Redis数据结构-hash

    Redis数据结构-hash

    redis中,哈希类型的值是一个键值对结构,如key:value={{field1,val1},{field2,val2}...}

    命令

    设置值

    设置成功返回1

    hset key field value
    ----------------------
    > hset user:1 name tom
    1
    > hset user:1 name kitty
    0
    > hsetnx user:1 name Leg
    0
    

    redis还提供了hsetnx命令,类似set和setnx的关系,只不过作用域由key变为field

    获取值

    hget key field
    ----------------------
    > hget user:1 name
    tom
    > hget user:1 age
    null
    > hget user:2 name
    null
    

    如果没有对应的field,返回null

    删除field

    hdel key field[field ...]
    ----------------------
    > hdel user:1 name
    1
    

    hdel会删除一个或多个field,结果返回删除成功的个数

    计算field个数

    hlen key
    -----------------------
    > hset user:1 name tom
    1
    > hset user:1 age 18
    1
    > hset user:1 sex male
    1
    > hlen user:1
    3
    

    批量设置或获取field-value

    hmget key field [field...]
    hmset key field value [field value ...]
    --------------------------------
    > hmset user:2 name laura age 22 sex femal
    OK
    > hmget user:2 name age sex
    laura
    22
    femal
    

    判断field是否存在

    hexists key field
    -----------------------
    > hexists user:1 name
    1
    

    user:1 包含name域,返回1,不包含返回0

    获取所有的field

    hkeys key
    -----------------
    > hkeys user:1
    name
    age
    sex
    

    其实叫hfields更恰当,它返回所有的field

    获取所有value

    hvals key
    -----------------
    > hvals user:1
    tom
    18
    male
    

    获取所有的field-value

    hgetall key
    -----------------
    > hgetall user:1
    name
    tom
    age
    18
    sex
    male
    

    注意:使用hgetall时,如果哈希元素比较多,存在阻塞redis的可能。如果只使用部分field,可以使用hmget。如果一定要获取全部field-value,可以用hscan命令,该命令会渐进式遍历哈希类型

    hincrny hincrbyfloat

    hincrby key field
    ---------------------
    > HINCRBY user:1 age 1
    19
    

    field自增,就行incrby和incrbyfloat一样,只是作用在field上

    计算value的字符串长度

    hstrlen key field 
    ----------------------
    > hget user:1 name
    tom
    > hstrlen user:1 name
    3
    

    内部编码

    • ziplist(压缩列表)
      • 哈希元素个数小于hash-max-ziplist-entries(默认512个)
      • 同时所有值小于hash-max-ziplist-value配置(默认64字节)
      • ziplist更加紧凑的结构实现多个元素的连续存储,更加节省内存
    • hashtable(哈希表)
      • 无法使用ziplist的时候,用hashtable,hashtable的读写效率O(1),当然更占空间
    > object encoding user:1
    ziplist
    

    使用场景

    场景:缓存用户对象信息,如User{name:Tom,age:18,sex:male},User{name:Kitty,age:18,sex:female}

    可以用几种方案来做缓存

    1 序列化字符串

    set user:1 serialize(userInfo)

    优点:简化编程

    缺点:序列化有性能损耗;每次更新必须序列化和反序列化整体

    2 哈希类型缓存

    key和上面一样,只是用每个field-value存对象的属性和值

    hmset user:1 name tom age 18 sex male

    优点:简单直观,合理使用减少内存的占用;操作也简单直接

    缺点:控制ziplist和hashtable两种内部编码的转换,hashtable会消耗更多内存

  • 相关阅读:
    js数组根据对象中的元素(相同的属性值)去重
    nginx设置add_header 跨域依旧失败解决
    canvas前端压缩图片和视频首屏缩略图并上传到服务器
    纯前端下载文件的方法
    vue多文件上传进度条 进度不更新问题
    jquery中attr和prop的区别
    为什么我认为数据结构与算法对前端开发很重要?
    CSS2.0实现面包屑
    Vue是如何渲染页面的,渲染过程以及原理代码
    js 事件驱动原理
  • 原文地址:https://www.cnblogs.com/SimonZ/p/14891768.html
Copyright © 2011-2022 走看看