zoukankan      html  css  js  c++  java
  • Redis---Hash

    哈希常用的命令复习
    命令 功能
    hset key field value 设置哈希值
    hsetnx 设置哈希值,field或键必须不存在
    hget 获取某个file对应的值
    hdel 删除一个或多个field-value
    hlen 计算field的个数
    hmset 批量设置field-value
    hmget 批量获取field-value
    hexists 判断某个field是否存在
    hkeys 获取所有的field
    hvals 获取所有的value
    hgetall 获取所有的field-value
    hincrby 自增整数
    hincrbyfloat 自增浮点数
    hstrlen  计算value字符串的长度

    几乎所有的编程语言都提供了哈希(hash)类型,它们的叫法可能是哈希、字典、关联数组。

    在Redis中,哈希类型是指键值本身又是一个键值对结构,形如value={{field1,value1},...{fieldN,valueN}},

    Redis键值对和哈希类型二者的关系可以用下图来表示:

    注意:哈希类型中的映射关系叫做field-value,注意这里的value是指field对应的值,不是键对应的值,一定要注意value在不同上下文的作用。

    下面介绍一些哈希常用的命令。

    1)设置值

    命令:hset key field value

    127.0.0.1:6379> hset user:1 name kebi
    (integer) 1
    127.0.0.1:6379> hset user:1 age 26
    (integer) 1

    如果设置成功会返回1,反之会返回0。

    此外Redis提供了hsetnx命令,它们的关系就像set和setnx命令一样,只不过作用域由键变为field。

    复制代码
    127.0.0.1:6379> hexists user:1 name
    (integer) 1    #user:1 name存在
    127.0.0.1:6379> hsetnx user:1 name xiaoniao
    (integer) 0    #没有设置成功
    127.0.0.1:6379> hget user:1 name
    "kebi"
    127.0.0.1:6379> hsetnx user:4 name xiaoniao
    (integer) 1
    127.0.0.1:6379> hget user:4 name
    "xiaoniao"  #field不存在才行
    复制代码

    2)获取值

    命令:hget key field

    127.0.0.1:6379> hget user:1 name
    "kebi"
    127.0.0.1:6379> hget user:1 dorm
    (nil)

    如果键的field不存在或者或键本身就不存在,会返回nil。

    3)删除field

    命令:hdel key field [field ...]

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

    复制代码
    127.0.0.1:6379> hkeys user:1
    1) "name"
    2) "age"
    3) "sex"
    127.0.0.1:6379> hdel user:1 name
    (integer) 1
    127.0.0.1:6379> hkeys user:1
    1) "age"
    2) "sex"
    复制代码

    注意如果要删除键,还是使用del:

    127.0.0.1:6379> del user:1
    (integer) 1
    127.0.0.1:6379> exists user:1
    (integer) 0

    并没有说能单独删除哈希的value,因为没有意义。

    4)计算field的个数

    命令:hlen key

    复制代码
    127.0.0.1:6379> hset user:1 name kebi
    (integer) 1
    127.0.0.1:6379> hset user:1 age 26
    (integer) 1
    127.0.0.1:6379> hset user:1 sex boy
    (integer) 1
    127.0.0.1:6379> hlen user:1
    (integer) 3
    复制代码

    5)批量设置或获取field-value

    命令:

    hmget key field [field ...]
    hmset key field value [field value ...]

    hmset和hmget分别是批量设置和获取field-value,hmset需要的参数是key和多对field-value,hmget需要的参数是key和多个field:

    复制代码
    127.0.0.1:6379> hmget user:1 name age sex
    1) "kebi"
    2) "26"
    3) "boy"
    127.0.0.1:6379> hmset user:2 name maoxian age 25 sex boy
    OK
    127.0.0.1:6379> hmget user:2 name age sex
    1) "maoxian"
    2) "25"
    3) "boy"
    复制代码

    6)判断field是否存在

    命令:hexists key field

    127.0.0.1:6379> hexists user:1 name
    (integer) 1
    127.0.0.1:6379> hexists user:1 dorm
    (integer) 0

    如果field存在,返回结果为1,如果不存在返回0.

    7)获取所有的field

    命令:hkeys key

    hkeys命令应该叫hfields更为恰当,它返回指定哈希键所有的field:

    复制代码
    127.0.0.1:6379> keys *  #返回所有的键
    1) "user:2"
    2) "user:1"
    127.0.0.1:6379> hkeys user:1 #返回键user:1所有的field
    1) "name"
    2) "age"
    3) "sex"
    127.0.0.1:6379> hkeys user:2
    1) "name"
    2) "age"
    3) "sex"
    复制代码

    8)获取所有value

    命令:hvals key

    复制代码
    127.0.0.1:6379> hvals user:1
    1) "kebi"
    2) "26"
    3) "boy"
    127.0.0.1:6379> hvals user:2
    1) "maoxian"
    2) "25"
    3) "boy"
    复制代码

    9)获取所有的field-value

    命令:hgetall key

    复制代码
    127.0.0.1:6379> hgetall user:1
    1) "name"
    2) "kebi"
    3) "age"
    4) "26"
    5) "sex"
    6) "boy"
    复制代码

    注意:在使用hgetall时,如果哈希元素个数比较多,会存在阻塞Redis的可能。

      如果只需要获取部分field,可以使用hmget,如果一定要回去全部的field-value,可以使用hscan命令,该命令会渐进式遍历哈希类型。

    10)hincrby hincrbyfloat

    命令:

    hincrby key field
    hincrbyfloat key field

    hincrby和hincrbyfloat命令一样,但是它们的作用域是field。

    11)计算value的字符长度(需要Redis3.2版本以上)

    命令:hstrlen key field

    下面提供一张哈希类型命令的时间复杂度,可以根据自身的需求选择合适的命令。

    哈希类型命令的时间复杂度
    命令                             时间复杂度
    hset key field value O(1)
    hget key field O(1)
    hdel key field [field ...] O(k),k是field个数
    hlen key O(1)
    hgetall key O(n),n是field总数
    hmget field [field ...] O(k),k是field个数
    hmset field value [field value...] O(k),k是field个数
    hexists key field O(1)
    hkeys key O(n),n是field总数
    hvals key O(n),n是field总数
    hsetnx key field value O(1)
    hincrby key field increment O(1)
    hincrbyfloat key field increment  O(1)
    hstrlen key field O(1)
     
  • 相关阅读:
    CodeForces 156B Suspects(枚举)
    CodeForces 156A Message(暴力)
    CodeForces 157B Trace
    CodeForces 157A Game Outcome
    HDU 3578 Greedy Tino(双塔DP)
    POJ 2609 Ferry Loading(双塔DP)
    Java 第十一届 蓝桥杯 省模拟赛 19000互质的个数
    Java 第十一届 蓝桥杯 省模拟赛 19000互质的个数
    Java 第十一届 蓝桥杯 省模拟赛 19000互质的个数
    Java 第十一届 蓝桥杯 省模拟赛十六进制转换成十进制
  • 原文地址:https://www.cnblogs.com/JavaHxm/p/10690434.html
Copyright © 2011-2022 走看看