字符串(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