redis字符串的实现机制(全网都在找的redis字符串命令)

概述

redis一般用来做缓存,可能很多朋友都没有深入去学习redis的相关命令,只是涉及到安装部署而已,所以今天主要总结介绍一下redis字符串的一些命令。


SET

语法:SET key value [EX seconds] [PX milliseconds] [NX|XX]

将字符串值 value 关联到 key 。

如果 key 已经持有其他值, SET 就覆写旧值, 无视类型。

当 SET 命令对一个带有生存时间(TTL)的键进行设置之后, 该键原有的 TTL 将被清除。

ps:因为 SET 命令可以通过参数来实现 SETNX 、 SETEX 以及 PSETEX 命令的效果, 所以 Redis 将来的版本可能会移除并废弃 SETNX 、 SETEX 和 PSETEX 这三个命令。

返回值

在 Redis 2.6.12 版本以前, SET 命令总是返回 OK 。

从 Redis 2.6.12 版本开始, SET 命令只在设置操作成功完成时才返回 OK ; 如果命令使用了 NX或者 XX 选项, 但是因为条件没达到而造成设置操作未执行, 那么命令将返回空批量回复(NULL Bulk Reply)。

实例:

对不存在的键进行设置:

redis字符串的实现机制(全网都在找的redis字符串命令)(1)

对已存在的键进行设置

redis字符串的实现机制(全网都在找的redis字符串命令)(2)


SETNX key value

只在键 key 不存在的情况下, 将键 key 的值设置为 value 。

若键 key 已经存在, 则 SETNX 命令不做任何动作。

SETNX 是『SET if Not eXists』(如果不存在,则 SET)的简写。

返回值

命令在设置成功时返回 1 , 设置失败时返回 0 。

实例:

redis字符串的实现机制(全网都在找的redis字符串命令)(3)


SETEX key seconds value

将键 key 的值设置为 value , 并将键 key 的生存时间设置为 seconds 秒钟。

如果键 key 已经存在, 那么 SETEX 命令将覆盖已有的值。

SETEX 命令的效果和以下两个命令的效果类似:

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

SETEX 和这两个命令的不同之处在于 SETEX 是一个原子(atomic)操作, 它可以在同一时间内完成设置值和设置过期时间这两个操作, 因此 SETEX 命令在储存缓存的时候非常实用。

返回值

命令在设置成功时返回 OK 。 当 seconds 参数不合法时, 命令将返回一个错误。

实例

在键 key 不存在的情况下执行 SETEX:

redis字符串的实现机制(全网都在找的redis字符串命令)(4)

键 key 已经存在, 使用 SETEX 覆盖旧值

redis字符串的实现机制(全网都在找的redis字符串命令)(5)


PSETEX key milliseconds value

这个命令和 SETEX 命令相似, 但它以毫秒为单位设置 key 的生存时间, 而不是像 SETEX 命令那样以秒为单位进行设置。

返回值:命令在设置成功时返回 OK

实例:

redis字符串的实现机制(全网都在找的redis字符串命令)(6)


GET key

返回与键 key 相关联的字符串值。

返回值

如果键 key 不存在, 那么返回特殊值 nil ; 否则, 返回键 key 的值。

如果键 key 的值并非字符串类型, 那么返回一个错误, 因为 GET 命令只能用于字符串值。

实例

对不存在的键 key 或是字符串类型的键 key 执行 GET 命令

redis字符串的实现机制(全网都在找的redis字符串命令)(7)

对不是字符串类型的键 key 执行 GET 命令

redis字符串的实现机制(全网都在找的redis字符串命令)(8)


GETSET key value

将键 key 的值设为 value , 并返回键 key 在被设置之前的旧值。

返回值

返回给定键 key 的旧值。

如果键 key 没有旧值, 也即是说, 键 key 在被设置之前并不存在, 那么命令返回 nil 。

当键 key 存在但不是字符串类型时, 命令返回一个错误。

实例

redis字符串的实现机制(全网都在找的redis字符串命令)(9)


STRLEN key

返回键 key 储存的字符串值的长度。

返回值

STRLEN 命令返回字符串值的长度。

当键 key 不存在时, 命令返回 0 。

当 key 储存的不是字符串值时, 返回一个错误。

实例

获取字符串值的长度

redis字符串的实现机制(全网都在找的redis字符串命令)(10)


APPEND key value

如果键 key 已经存在并且它的值是一个字符串, APPEND 命令将把 value 追加到键 key 现有值的末尾。

如果 key 不存在, APPEND 就简单地将键 key 的值设为 value , 就像执行 SET key value 一样。

返回值

追加 value 之后, 键 key 的值的长度。

实例

对不存在的 key 执行 APPEND :

redis字符串的实现机制(全网都在找的redis字符串命令)(11)

对已存在的字符串进行 APPEND

redis字符串的实现机制(全网都在找的redis字符串命令)(12)


SETRANGE key offset value

从偏移量 offset 开始, 用 value 参数覆盖(overwrite)键 key 储存的字符串值。

不存在的键 key 当作空白字符串处理。

SETRANGE 命令会确保字符串足够长以便将 value 设置到指定的偏移量上, 如果键 key 原来储存的字符串长度比偏移量小(比如字符串只有 5 个字符长,但你设置的 offset 是 10 ), 那么原字符和偏移量之间的空白将用零字节(zerobytes, "\x00" )进行填充。

因为 Redis 字符串的大小被限制在 512 兆(megabytes)以内, 所以用户能够使用的最大偏移量为 2^29-1(536870911) , 如果你需要使用比这更大的空间, 可以考虑使用多个 key 。

注意:当生成一个很长的字符串时, Redis 需要分配内存空间, 该操作有时候可能会造成服务器阻塞(block)。 在2010年出产的Macbook Pro上, 设置偏移量为 536870911(512MB 内存分配)将耗费约 300 毫秒, 设置偏移量为 134217728(128MB 内存分配)将耗费约 80 毫秒, 设置偏移量 33554432(32MB 内存分配)将耗费约 30 毫秒, 设置偏移量为 8388608(8MB 内存分配)将耗费约 8 毫秒。

返回值

SETRANGE 命令会返回被修改之后, 字符串值的长度。

实例

对非空字符串执行 SETRANGE 命令

redis字符串的实现机制(全网都在找的redis字符串命令)(13)


GETRANGE key start end

返回键 key 储存的字符串值的指定部分, 字符串的截取范围由 start 和 end 两个偏移量决定 (包括 start 和 end 在内)。

负数偏移量表示从字符串的末尾开始计数, -1 表示最后一个字符, -2 表示倒数第二个字符, 以此类推。

GETRANGE 通过保证子字符串的值域(range)不超过实际字符串的值域来处理超出范围的值域请求。

返回值

GETRANGE 命令会返回字符串值的指定部分。

实例

redis字符串的实现机制(全网都在找的redis字符串命令)(14)


INCR key

为键 key 储存的数字值加上一。

如果键 key 不存在, 那么它的值会先被初始化为 0 , 然后再执行 INCR 命令。

如果键 key 储存的值不能被解释为数字, 那么 INCR 命令将返回一个错误。

本操作的值限制在 64 位(bit)有符号数字表示之内。

返回值

INCR 命令会返回键 key 在执行加一操作之后的值。

实例

redis字符串的实现机制(全网都在找的redis字符串命令)(15)


INCRBY key increment

为键 key 储存的数字值加上增量 increment 。

如果键 key 不存在, 那么键 key 的值会先被初始化为 0 , 然后再执行 INCRBY 命令。

如果键 key 储存的值不能被解释为数字, 那么 INCRBY 命令将返回一个错误。

本操作的值限制在 64 位(bit)有符号数字表示之内。

返回值

在加上增量 increment 之后, 键 key 当前的值。

实例

键存在,并且值为数字:

redis字符串的实现机制(全网都在找的redis字符串命令)(16)

键不存在

redis字符串的实现机制(全网都在找的redis字符串命令)(17)


INCRBYFLOAT key increment

为键 key 储存的值加上浮点数增量 increment 。

如果键 key 不存在, 那么 INCRBYFLOAT 会先将键 key 的值设为 0 , 然后再执行加法操作。

如果命令执行成功, 那么键 key 的值会被更新为执行加法计算之后的新值, 并且新值会以字符串的形式返回给调用者。

无论是键 key 的值还是增量 increment , 都可以使用像 2.0e7 、 3e5 、 90e-2 那样的指数符号(exponential notation)来表示, 但是, 执行 INCRBYFLOAT 命令之后的值总是以同样的形式储存, 也即是, 它们总是由一个数字, 一个(可选的)小数点和一个任意长度的小数部分组成(比如 3.14 、 69.768 ,诸如此类), 小数部分尾随的 0 会被移除, 如果可能的话, 命令还会将浮点数转换为整数(比如 3.0 会被保存成 3 )。

此外, 无论加法计算所得的浮点数的实际精度有多长, INCRBYFLOAT 命令的计算结果最多只保留小数点的后十七位。

返回值

在加上增量 increment 之后, 键 key 的值。

实例

redis字符串的实现机制(全网都在找的redis字符串命令)(18)


DECR key

为键 key 储存的数字值减去一。

如果键 key 不存在, 那么键 key 的值会先被初始化为 0 , 然后再执行 DECR 操作。

如果键 key 储存的值不能被解释为数字, 那么 DECR 命令将返回一个错误。

本操作的值限制在 64 位(bit)有符号数字表示之内。

关于递增(increment) / 递减(decrement)操作的更多信息, 请参见 INCR 命令的文档。

返回值

DECR 命令会返回键 key 在执行减一操作之后的值。

实例

对储存数字值的键 key 执行 DECR 命令:

redis字符串的实现机制(全网都在找的redis字符串命令)(19)

对不存在的键执行 DECR 命令

redis字符串的实现机制(全网都在找的redis字符串命令)(20)


DECRBY key decrement

将键 key 储存的整数值减去减量 decrement 。

如果键 key 不存在, 那么键 key 的值会先被初始化为 0 , 然后再执行 DECRBY 命令。

如果键 key 储存的值不能被解释为数字, 那么 DECRBY 命令将返回一个错误。

本操作的值限制在 64 位(bit)有符号数字表示之内。

关于更多递增(increment) / 递减(decrement)操作的更多信息, 请参见 INCR 命令的文档。

返回值

DECRBY 命令会返回键在执行减法操作之后的值。

实例

redis字符串的实现机制(全网都在找的redis字符串命令)(21)


MSET key value [key value …]

同时为多个键设置值。

如果某个给定键已经存在, 那么 MSET 将使用新值去覆盖旧值, 如果这不是你所希望的效果, 请考虑使用 MSETNX 命令, 这个命令只会在所有给定键都不存在的情况下进行设置。

MSET 是一个原子性(atomic)操作, 所有给定键都会在同一时间内被设置, 不会出现某些键被设置了但是另一些键没有被设置的情况。

返回值

MSET 命令总是返回 OK 。

实例

同时对多个键进行设置:

redis字符串的实现机制(全网都在找的redis字符串命令)(22)

覆盖已有的值:

redis字符串的实现机制(全网都在找的redis字符串命令)(23)


MSETNX key value [key value …]

当且仅当所有给定键都不存在时, 为所有给定键设置值。

即使只有一个给定键已经存在, MSETNX 命令也会拒绝执行对所有键的设置操作。

MSETNX 是一个原子性(atomic)操作, 所有给定键要么就全部都被设置, 要么就全部都不设置, 不可能出现第三种状态。

返回值

当所有给定键都设置成功时, 命令返回 1 ; 如果因为某个给定键已经存在而导致设置未能成功执行, 那么命令返回 0 。

实例

对不存在的键执行 MSETNX 命令

redis字符串的实现机制(全网都在找的redis字符串命令)(24)

对某个已经存在的键进行设置

redis字符串的实现机制(全网都在找的redis字符串命令)(25)


MGET key [key …]

返回给定的一个或多个字符串键的值。

如果给定的字符串键里面, 有某个键不存在, 那么这个键的值将以特殊值 nil 表示。

返回值

MGET 命令将返回一个列表, 列表中包含了所有给定键的值。

实例

redis字符串的实现机制(全网都在找的redis字符串命令)(26)


后面会分享更多devops和DBA方面的内容,感兴趣的朋友可以关注下!

redis字符串的实现机制(全网都在找的redis字符串命令)(27)

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页