Redis基本数据结构之字符串(Strings)

字符串(Strings)

基本命令

APPEND

append key value      #返回值为key所对应value字符串的长度

如果 key 已经存在并且是一个字符串, APPEND 命令将 value 追加到 key 原来的值的末尾。如果 key 不存在, APPEND 就简单地将给定 key 设为 value ,就像执行 SET key value 一样。

示例:

#对不存在的key执行append
exists mykey      #先判断key是否存在

append mykey "Hello" # 对不存在的 key 进行 APPEND ,等同于 SET mykey "Hello"

append mykey "World"   #对已经存在的key进行append操作。

模式:时间序列

APPEND 可以为一系列定长(fixed-size)数据(sample)提供一种紧凑的表示方式,通常称之为时间序列。每当一个新数据到达的时候,执行以下命令:

APPEND timeseries "fixed-size sample"

然后可以通过以下的方式访问时间序列的各项属性:

  • STRLEN 给出时间序列中数据的数量;
  • GETRANGE 可以用于随机访问;
  • SETRANGE 可以用于覆盖或修改已存在的的时间序列。

示例:

append time "0043"    #返回结果4
append time "0035"    #返回结果8
GETRANGE time 0 3     #返回结果0043

BITCOUNT

BITCOUNT key [start] [end]  #计算给定字符串中,被设置为 1 的比特位的数量

一般情况下,给定的整个字符串都会被进行计数,通过指定额外的 start 或 end 参数,可以让计数只在特定的位上进行。start 和 end 参数的设置和 GETRANGE 命令类似,都可以使用负数值:比如 -1 表示最后一个位,而 -2 表示倒数第二个位,以此类推。不存在的 key 被当成是空字符串来处理,因此对一个不存在的 key 进行 BITCOUNT 操作,结果为 0 。

该数据结构操作时间复杂度:O(n)

返回值:被设置为 1 的位的数量。

示例:

BITCOUNT bits #返回结果0
SETBIT bits 0 1   #0001
BITCOUNT bits  #返回结果1

实战应用:使用 bitmap 实现用户上线次数统计

假设现在我们希望记录自己网站上的用户的上线频率,比如说,计算用户 A 上线了多少天,用户 B 上线了多少天,诸如此类,以此作为数据,从而决定让哪些用户参加 beta 测试等活动 —— 这个模式可以使用 SETBIT 和 BITCOUNT 来实现。

比如说,每当用户在某一天上线的时候,我们就使用 SETBIT ,以用户名作为 key ,将那天所代表的网站的上线日作为 offset 参数,并将这个 offset 上的为设置为 1 。举个例子,如果今天是网站上线的第 100 天,而用户 peter 在今天阅览过网站,那么执行命令 SETBIT peter 100 1 ;如果明天 peter 也继续阅览网站,那么执行命令 SETBIT peter 101 1 ,以此类推。当要计算 peter 总共以来的上线次数时,就使用 BITCOUNT 命令:执行 BITCOUNT peter ,得出的结果就是 peter 上线的总天数。

DECR

DECR key   #返回值:执行 DECR 命令之后 key 的值

将 key 中储存的数字值减一。如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 DECR 操作。如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误。

示例:

SET mykey 10
DECR mykey   #返回结果9
EXISTS count   #返回0
DECR count #返回结果-1

DECRBY

DECRBY key decrement   #将 key 所储存的值减去减量 decrement

如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 DECRBY 操作。如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误。

返回值:减去 decrement 之后, key 的值

示例:

SET count 100
DECRBY count 20   #返回:80

GET

GET key  #返回 key 所关联的字符串值

如果 key 不存在那么返回特殊值 nil 。假如 key 储存的值不是字符串类型,返回一个错误,因为 GET 只能用于处理字符串值。

返回值:当 key 不存在时,返回 nil ,否则,返回 key 的值。
如果 key 不是字符串类型,那么返回一个错误。

示例:

GET mykey

GETBIT

GETBIT key offset  
#对 key 所储存的字符串值,获取指定偏移量上的位(bit),当 offset 比字符串值的长度大,或者 key 不存在时,返回 0

返回值:字符串值指定偏移量上的位(bit)

示例:

SETBIT bit 10086 1
GETBIT bit 10086    #返回结果1

GETRANGE

GETRANGE key start end

返回 key 中字符串值的子字符串,字符串的截取范围由 start 和 end 两个偏移量决定(包括 start 和 end 在内)。负数偏移量表示从字符串最后开始计数, -1 表示最后一个字符, -2 表示倒数第二个,以此类推。

返回值:截取得出的子字符串

示例:

SET mykey "Hello,World"
GETRANGE mykey 0 4   #返回结果Hello

GETSET

GETSET key value

将给定 key 的值设为 value ,并返回 key 的旧值(old value)。当 key 存在但不是字符串类型时,返回一个错误。

返回值:返回给定 key 的旧值。当 key 没有旧值时,也即是, key 不存在时,返回 nil。

示例:

GETSET mykey "hello"  #没有旧值,返回 nil

INCR

INCR key

将 key 中储存的数字值增一。如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 INCR 操作。如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误。

返回值:执行 INCR 命令之后 key 的值

示例:

SET count 0
INCR count  #返回值:1

INCRBY

INCRBY key increment

将 key 所储存的值加上增量 increment 。如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 INCRBY 命令。如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误.

返回值:加上 increment 之后, key 的值

示例:

SET count 10
INCRBY count 10   #返回值20

INCRBYFLOAT

INCRBYFLOAT key increment

为 key 中所储存的值加上浮点数增量 increment 。如果 key 不存在,那么 INCRBYFLOAT 会先将 key 的值设为 0 ,再执行加法操作。如果命令执行成功,那么 key 的值会被更新为(执行加法之后的)新值,并且新值会以字符串的形式返回给调用者.

示例:

SET mykey 10.50
INCRBYFLOAT mykey 0.1   #返回结果:10.6

MGET

MGET key [key ...]

返回所有(一个或多个)给定 key 的值。如果给定的 key 里面,有某个 key 不存在,那么这个 key 返回特殊值 nil 。因此,该命令永不失败。

返回值:一个包含所有给定 key 的值的列表

示例:

SET redis redis.com
SET mongodb mongodb.org
MGET redis mongodb

MSET

MSET key value [key value ...]

同时设置一个或多个 key-value 对。

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

MSET 是一个原子性(atomic)操作,所有给定 key 都会在同一时间内被设置,某些给定 key 被更新而另一些给定 key 没有改变的情况,不可能发生。

返回值:总是返回 OK (因为 MSET 不可能失败)

示例:

MSET date "2012.3.30" time "11:00 a.m." weather "sunny"
MGET date time weather

MSETNX

MSETNX key value [key value ...]

同时设置一个或多个 key-value 对,当且仅当所有给定 key 都不存在。
即使只有一个给定 key 已存在, MSETNX 也会拒绝执行所有给定 key 的设置操作。MSETNX 是原子性的,因此它可以用作设置多个不同 key 表示不同字段(field)的唯一性逻辑对象(unique logic object),所有字段要么全被设置,要么全不被设置.

返回值:当所有 key 都成功设置,返回 1 。
如果所有给定 key 都设置失败(至少有一个 key 已经存在),那么返回 0 。

示例:

MSETNX rmdbs "MySQL" nosql "MongoDB" key-value-store "redis"

PSETEX

PSETEX key milliseconds value

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

示例:

PSETEX mykey 1000 "Hello"

SET

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

将字符串值 value 关联到 key 。

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

对于某个原本带有生存时间(TTL)的键来说, 当 SET 命令成功在这个键上执行时, 这个键原有的 TTL 将被清除。

可选参数

从 Redis 2.6.12 版本开始, SET 命令的行为可以通过一系列参数来修改:

  • EX second :设置键的过期时间为 second 秒。 SET key value EX second 效果等同于 SETEX key second value 。
  • PX millisecond :设置键的过期时间为 millisecond 毫秒。 SET key value PX millisecond 效果等同于 PSETEX key millisecond value
  • NX :只在键不存在时,才对键进行设置操作。 SET key value NX 效果等同于 SETNX key value
  • XX :只在键已经存在时,才对键进行设置操作

返回值: SET 在设置操作成功完成时,才返回 OK 。
如果设置了 NX 或者 XX ,但因为条件没达到而造成设置操作未执行,那么命令返回空批量回复(NULL Bulk Reply)。

示例:

SET key-with-expire-and-NX "hello" EX 10086 NX

SETBIT

SETBIT key offset value

对 key 所储存的字符串值,设置或清除指定偏移量上的位(bit)。
位的设置或清除取决于 value 参数,可以是 0 也可以是 1 。
当 key 不存在时,自动生成一个新的字符串值。
字符串会进行伸展(grown)以确保它可以将 value 保存在指定的偏移量上。当字符串值进行伸展时,空白位置以 0 填充。

返回值:指定偏移量原来储存的位

示例:

SETBIT bit 10086 1
GETBIT bit 10086   #返回值:1

SETEX

SETEX key seconds value

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

该命令类似于:

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

不同之处是, SETEX 是一个原子性(atomic)操作,关联值和设置生存时间两个动作会在同一时间内完成,该命令在 Redis 用作缓存时,非常实用。

返回值:设置成功时返回 OK 。当 seconds 参数不合法时,返回一个错误

示例:

SETEX mykey 60 10086

SETNX

SETNX key value

将 key 的值设为 value ,当且仅当 key 不存在。若给定的 key 已经存在,则 SETNX 不做任何动作。SETNX 是『SET if Not eXists』(如果不存在,则 SET)的简写.

返回值:设置成功,返回 1 。设置失败,返回 0 。

示例:

SETNX mykey "hello"

SETRANGE

SETRANGE key offset value

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

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

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

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

返回值:被 SETRANGE 修改之后,字符串的长度

示例:

SET mykey "hello world"
SETRANGE mykey 6 "Redis"

STRLEN

STRLEN key

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

返回值:字符串值的长度。当 key 不存在时,返回 0 。

示例:

SET mykey "Hello world"
STRLEN mykey

参考文章:http://doc.redisfans.com/string/index.html

你可能感兴趣的:(Redis基本数据结构之字符串(Strings))