REDIS Sting

REDIS Sting

APPEND

  • 如果 key 已经存在并且是一个字符串, APPEND 命令将 value 追加到 key 原来的值的末尾。
  • 如果 key 不存在, APPEND 就简单地将给定 key 设为 value ,就像执行 SET key value 一样。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    127.0.0.1:6379> EXISTS myphone
    (integer) 0
    # 对不存在的key进行append 等同直接set
    127.0.0.1:6379> APPEND myphone "nokia"
    (integer) 5
    #对存在的keyappend 直接追加后边
    127.0.0.1:6379> APPEND myphone " - 1110"
    (integer) 12
    127.0.0.1:6379> GET myphone
    "nokia - 1110"

APPEND timeseries

  • APPEND 可以为一系列定长(fixed-size)数据(sample)提供一种紧凑的表示方式,通常称之为时间序列。
    APPEND timeseries "fixed-size sample"
  • 可以考虑使用 UNIX 时间戳作为时间序列的键名,这样一来,可以避免单个 key 因为保存过大的时间序列而占用大量内存,另一方面,也可以节省下大量命名空间。
    1
    2
    3
    4
    5
    6
    7
    8
    127.0.0.1:6379> APPEND ts "0043"
    (integer) 4
    127.0.0.1:6379> APPEND ts "0035"
    (integer) 8
    127.0.0.1:6379> GETRANGE ts 0 3
    "0043"
    127.0.0.1:6379> GETRANGE ts 4 7
    "0035"

DECR

  • 将 key 中储存的数字值减一
  • 如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 DECR 操作。
  • 如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误。
  • 值限制在 64 位(bit)有符号数字表示之内。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#对存在的数字值 key 进行 DECR
127.0.0.1:6379> SET failure_times 10
OK
127.0.0.1:6379> DECR failure_times
(integer) 9

# 对不存在的key进行DECR
127.0.0.1:6379> EXISTS count
(integer) 0
127.0.0.1:6379> DECR count
(integer) -1

# 对存在但不是数值的 key 进行 DECR
127.0.0.1:6379> SET company YOUR_CODE_SUCKS.LLC
OK
127.0.0.1:6379> DECR company
(error) ERR value is not an integer or out of range
127.0.0.1:6379> DECR failure_times
(integer) 8
127.0.0.1:6379> DECR failure_times
(integer) 7
127.0.0.1:6379> DECR failure_times
(integer) 6
127.0.0.1:6379> DECR failure_times
(integer) 5

DECRBY

  • 将 key 所储存的值减去减量 decrement 。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    127.0.0.1:6379> SET count 100
    OK
    127.0.0.1:6379> DECRBY count 20
    (integer) 80
    # 不存在的key
    127.0.0.1:6379> EXISTS pages
    (integer) 0
    127.0.0.1:6379> DECRBY pages 10
    (integer) -10

GET

  • 返回key所关联的字符串值

GETBIT

  • 对key所存储的字符串值,获取指定偏移量上的位(bit)
  • 当 offset 比字符串值的长度大,或者 key 不存在时,返回 0
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    对不存在的 key 或者不存在的 offset 进行 GETBIT, 返回 0
    127.0.0.1:6379> EXISTS bit
    (integer) 0
    127.0.0.1:6379> GETBIT bit 10086
    (integer) 0
    # 对已存在的 offset 进行 GETBIT
    127.0.0.1:6379> SETBIT bit 10086 1
    (integer) 0
    127.0.0.1:6379> GETBIT bit 10086
    (integer) 1

GETSET

  • 将给定 key 的值设为 value ,并返回 key 的旧值(old value)
  • 当 key 存在但不是字符串类型时,返回一个错误
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    127.0.0.1:6379> GETSET db mongodb
    (nil)
    127.0.0.1:6379> GET db
    "mongodb"
    127.0.0.1:6379> GETSET db redis
    "mongodb"
    127.0.0.1:6379> GET db
    "redis"
    127.0.0.1:6379>

    #
    127.0.0.1:6379> INCR mycount
    (integer) 1
    127.0.0.1:6379> GETSET mycount 0
    "1"
    127.0.0.1:6379> GET mycount
    "0"

INCR

  • 将key中存储的数字增加一
    1
    2
    3
    4
    5
    6
    7
    "0"
    127.0.0.1:6379> set age 20
    OK
    127.0.0.1:6379> incr age
    (integer) 21
    127.0.0.1:6379> get age
    "21"

INCRBY

  • 将key所存储的值增加增量
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    #key 存在且是数字
    127.0.0.1:6379> SET rank 50
    OK
    127.0.0.1:6379> INCRBY rank 20
    (integer) 70
    #key不存在
    127.0.0.1:6379> GET rank
    "70"
    127.0.0.1:6379> EXISTS counter
    (integer) 0
    127.0.0.1:6379> INCRBY counter 30
    (integer) 30
    127.0.0.1:6379> GET counter
    "30"
    #eky存在不是数字
    127.0.0.1:6379> SET book "long long ago..."
    OK
    127.0.0.1:6379> INCRBY book 200
    (error) ERR value is not an integer or out of range

INCRBYFLOAT

  • 为 key 中所储存的值加上浮点数增量
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    # 值和增量都不是指数符号
    127.0.0.1:6379> SET mykey 10.50
    OK
    127.0.0.1:6379> INCRBYFLOAT mykey 0.1
    "10.6"
    # 值和增量都是指数符号
    127.0.0.1:6379> SET mykey 314e-2
    OK
    127.0.0.1:6379> GET mykey
    "314e-2"
    127.0.0.1:6379> INCRBYFLOAT mykey 0
    "3.14"
    # 可以对整数类型执行
    127.0.0.1:6379> SET mykey 3
    OK
    127.0.0.1:6379> INCRBYFLOAT mykey 1.1
    "4.1"
    # 后跟的 0 会被移除
    127.0.0.1:6379> SET mykey 3.0
    OK
    127.0.0.1:6379> GET mykey
    "3.0"
    127.0.0.1:6379> INCRBYFLOAT mykey 1.000000000000000000000
    "4"
    127.0.0.1:6379> GET mykey
    "4"

MGET

  • 返回所有(一个或多个)给定key的值
  • 如果给定的 key 里面,有某个 key 不存在,那么这个 key 返回特殊值 nil 。因此,该命令永不失败。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    127.0.0.1:6379> SET redis redis.com
    OK
    127.0.0.1:6379> SET mongodb mongodb.org
    OK
    127.0.0.1:6379> MGET redis mongodb
    1) "redis.com"
    2) "mongodb.org"
    127.0.0.1:6379> MGET redis mongodb mysql # 不存在的 mysql 返回 nil
    1) "redis.com"
    2) "mongodb.org"
    3) (nil)

MSET

  • 同时设置一个或多个key-value对
    1
    2
    3
    4
    5
    6
    127.0.0.1:6379> MSET date "2012.3.30" time "11:00 a.m." weather "sunny"
    OK
    127.0.0.1:6379> MGET date time weather
    1) "2012.3.30"
    2) "11:00 a.m."
    3) "sunny"

MSETNX

  • 同时设置一个或多个 key-value 对,当且仅当所有给定 key 都不存在。
  • 即使只有一个给定 key 已存在, MSETNX 也会拒绝执行所有给定 key 的设置操作。
    1
    2
    3
    4
    5
    6
    127.0.0.1:6379> MSETNX rmdbs "MySQL" nosql "MongoDB" key-value-store "redis"
    (integer) 1
    127.0.0.1:6379> MGET rmdbs nosql key-value-store
    1) "MySQL"
    2) "MongoDB"
    3) "redis"

PSETEX

  • 这个命令和 SETEX 命令相似,但它以毫秒为单位设置 key 的生存时间,而不是像 SETEX 命令那样,以秒为单位。
    1
    2
    3
    4
    5
    6
    127.0.0.1:6379> PSETEX mykey 100000 "Hello"
    OK
    127.0.0.1:6379> PTTL mykey
    (integer) 98648
    127.0.0.1:6379> GET mykey
    "Hello"

SET

  • 将字符串值value关联到key
  • 如果key存在,覆盖操作,无视类型
  • 对于某个原本带有生存时间(TTL)的键来说, 当 SET 命令成功在这个键上执行时, 这个键原有的 TTL 将被清除。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    # 对不存在的键进行设置

    redis 127.0.0.1:6379> SET key "value"
    OK

    redis 127.0.0.1:6379> GET key
    "value"


    # 对已存在的键进行设置

    redis 127.0.0.1:6379> SET key "new-value"
    OK

    redis 127.0.0.1:6379> GET key
    "new-value"


    # 使用 EX 选项

    redis 127.0.0.1:6379> SET key-with-expire-time "hello" EX 10086
    OK

    redis 127.0.0.1:6379> GET key-with-expire-time
    "hello"

    redis 127.0.0.1:6379> TTL key-with-expire-time
    (integer) 10069


    # 使用 PX 选项

    redis 127.0.0.1:6379> SET key-with-pexpire-time "moto" PX 123321
    OK

    redis 127.0.0.1:6379> GET key-with-pexpire-time
    "moto"

    redis 127.0.0.1:6379> PTTL key-with-pexpire-time
    (integer) 111939


    # 使用 NX 选项

    redis 127.0.0.1:6379> SET not-exists-key "value" NX
    OK # 键不存在,设置成功

    redis 127.0.0.1:6379> GET not-exists-key
    "value"

    redis 127.0.0.1:6379> SET not-exists-key "new-value" NX
    (nil) # 键已经存在,设置失败

    redis 127.0.0.1:6379> GEt not-exists-key
    "value" # 维持原值不变


    # 使用 XX 选项

    redis 127.0.0.1:6379> EXISTS exists-key
    (integer) 0

    redis 127.0.0.1:6379> SET exists-key "value" XX
    (nil) # 因为键不存在,设置失败

    redis 127.0.0.1:6379> SET exists-key "value"
    OK # 先给键设置一个值

    redis 127.0.0.1:6379> SET exists-key "new-value" XX
    OK # 设置新值成功

    redis 127.0.0.1:6379> GET exists-key
    "new-value"


    # NX 或 XX 可以和 EX 或者 PX 组合使用

    redis 127.0.0.1:6379> SET key-with-expire-and-NX "hello" EX 10086 NX
    OK

    redis 127.0.0.1:6379> GET key-with-expire-and-NX
    "hello"

    redis 127.0.0.1:6379> TTL key-with-expire-and-NX
    (integer) 10063

    redis 127.0.0.1:6379> SET key-with-pexpire-and-XX "old value"
    OK

    redis 127.0.0.1:6379> SET key-with-pexpire-and-XX "new value" PX 123321
    OK

    redis 127.0.0.1:6379> GET key-with-pexpire-and-XX
    "new value"

    redis 127.0.0.1:6379> PTTL key-with-pexpire-and-XX
    (integer) 112999


    # EX 和 PX 可以同时出现,但后面给出的选项会覆盖前面给出的选项

    redis 127.0.0.1:6379> SET key "value" EX 1000 PX 5000000
    OK

    redis 127.0.0.1:6379> TTL key
    (integer) 4993 # 这是 PX 参数设置的值

    redis 127.0.0.1:6379> SET another-key "value" PX 5000000 EX 1000
    OK

    redis 127.0.0.1:6379> TTL another-key
    (integer) 997 # 这是 EX 参数设置的值

SETEX

  • 将值 value 关联到 key ,并将 key 的生存时间设为 seconds (以秒为单位)
  • 如果 key 已经存在, SETEX 命令将覆写旧值。

    等同 :
    SET key value
    EXPIRE key seconds # 设置生存时间

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    # 在 key 不存在时进行 SETEX

    redis> SETEX cache_user_id 60 10086
    OK

    redis> GET cache_user_id # 值
    "10086"

    redis> TTL cache_user_id # 剩余生存时间
    (integer) 49


    # key 已经存在时,SETEX 覆盖旧值

    redis> SET cd "timeless"
    OK

    redis> SETEX cd 3000 "goodbye my love"
    OK

    redis> GET cd
    "goodbye my love"

    redis> TTL cd
    (integer) 2997

SETNX

  • 将key的值设为value,当且仅当key不存在。
  • 若key存在则setnx不做任何操作
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    redis> EXISTS job                # job 不存在
    (integer) 0

    redis> SETNX job "programmer" # job 设置成功
    (integer) 1

    redis> SETNX job "code-farmer" # 尝试覆盖 job ,失败
    (integer) 0

    redis> GET job # 没有被覆盖
    "programmer"

STRLEN

  • 返回key所存储的字符串长度
  • 若存储不是字符串,返回错误
    1
    2
    3
    4
    127.0.0.1:6379> set mykey "www.qipajun.com"
    OK
    127.0.0.1:6379> strlen mykey
    (integer) 15