redis之string

来源:互联网 发布:2016最新编程语言 编辑:程序博客网 时间:2024/06/07 09:04

1.INCRBY

INCRBY key increment

key所储存的值加上增量increment

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

如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误。

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

返回值:

加上increment之后,key的值。

命令:

# key 存在且是数字值redis> SET rank 50OKredis> INCRBY rank 20(integer) 70redis> GET rank"70"# key 不存在时redis> EXISTS counter(integer) 0redis> INCRBY counter 30(integer) 30redis> GET counter"30"# key 不是数字值时redis> SET book "long long ago..."OKredis> INCRBY book 200(error) ERR value is not an integer or out of range
2.INCRBYFLOAT

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的计算结果也最多只能表示小数点的后十七位。

当以下任意一个条件发生时,返回一个错误:

key的值不是字符串类型(因为redis中的数字和浮点数都是以字符串的形式保存,所以它们都属于字符串类型)

key当前的值或者给定的增量increment不能解释(parse)为双精度。

返回值:

执行命令之后key的值。

命令:

# 值和增量都不是指数符号redis> SET mykey 10.50OKredis> INCRBYFLOAT mykey 0.1"10.6"# 值和增量都是指数符号redis> SET mykey 314e-2OKredis> GET mykey      # 用 SET 设置的值可以是指数符号"314e-2"redis> INCRBYFLOAT mykey 0   # 但执行 INCRBYFLOAT 之后格式会被改成非指数符号"3.14"# 可以对整数类型执行redis> SET mykey 3OKredis> INCRBYFLOAT mykey 1.1"4.1"# 后跟的 0 会被移除redis> SET mykey 3.0OKredis> GET mykey      # SET 设置的值小数部分可以是 0"3.0"redis> INCRBYFLOAT mykey 1.000000000000000000000    # 但 INCRBYFLOAT 会将无用的 0 忽略掉,有需要的话,将浮点变为整数"4"redis> GET mykey"4"
3.MGET

MGET key [key...]

返回所有(一个或多个)给定key的值。

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

返回值:

一个包含所有给定key的值的列表。

命令:

redis> SET redis redis.comOKredis> SET mongodb mongodb.orgOKredis> MGET redis mongodb1) "redis.com"2) "mongodb.org"redis> MGET redis mongodb mysql     # 不存在的 mysql 返回 nil1) "redis.com"2) "mongodb.org"3) (nil)
4.MSET

MSET key value [key value ....]

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

如果某个给定的key已经存在,那么MSET会用新值覆盖原来的旧值。

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

返回值:

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

命令:

redis> MSET date "2012.3.30" time "11:00 a.m." weather "sunny"OKredis> MGET date time weather1) "2012.3.30"2) "11:00 a.m."3) "sunny"# MSET 覆盖旧值例子redis> SET google "google.hk"OKredis> MSET google "google.com"OKredis> GET google"google.com"
5.MSETNX

MSETNX key value [key value....]

同时设置一个或多个key-value对,当且仅当所有给定的key都不存在。

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

MSETNX是原子性的,因为它可以用作设置多个不同key表示不同字段(field)的唯一性逻辑对象(unique logic object),所有字段要么全被设置,要么全不被设置。

返回值:

当所有key都成功设置,返回1

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

命令:

# 对不存在的 key 进行 MSETNXredis> MSETNX rmdbs "MySQL" nosql "MongoDB" key-value-store "redis"(integer) 1redis> MGET rmdbs nosql key-value-store1) "MySQL"2) "MongoDB"3) "redis"# MSET 的给定 key 当中有已存在的 keyredis> MSETNX rmdbs "Sqlite" language "python"  # rmdbs 键已经存在,操作失败(integer) 0redis> EXISTS language   # 因为 MSET 是原子性操作,language 没有被设置(integer) 0redis> GET rmdbs       # rmdbs 也没有被修改"MySQL"
6.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 命令可以通过参数来实现和 SETNX SETEX PSETEX 三个命令的效果,所以将来的Redis 版本可能会废弃并最终移除SETNX SETEX PSETEX 这三个命令。

返回值:

redis2.6.12版本以前,SET命令总是返回OK

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

命令:

# 对不存在的键进行设置redis 127.0.0.1:6379> SET key "value"OKredis 127.0.0.1:6379> GET key"value"# 对已存在的键进行设置redis 127.0.0.1:6379> SET key "new-value"OKredis 127.0.0.1:6379> GET key"new-value"# 使用 EX 选项redis 127.0.0.1:6379> SET key-with-expire-time "hello" EX 10086OKredis 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 123321OKredis 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" NXOK      # 键不存在,设置成功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) 0redis 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" XXOK      # 设置新值成功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 NXOKredis 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) 10063redis 127.0.0.1:6379> SET key-with-pexpire-and-XX "old value"OKredis 127.0.0.1:6379> SET key-with-pexpire-and-XX "new value" PX 123321OKredis 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 5000000OKredis 127.0.0.1:6379> TTL key(integer) 4993  # 这是 PX 参数设置的值redis 127.0.0.1:6379> SET another-key "value" PX 5000000 EX 1000OKredis 127.0.0.1:6379> TTL another-key(integer) 997   # 这是 EX 参数设置的值
使用模式

命令SET resource-name anystring NX EX max-lock-time是一种在redis中实现锁的简单方法。

客户端执行以上的命令:

①如果服务器返回OK,那么这个客户端获得锁。

②如果服务器返回NIL,那么客户端获取锁失败,可以在稍后再重试。

设置的过期时间到达之后,锁将自动释放。

可以通过以下修改,让这个锁实现更健壮:

①不使用固定的字符串作为键的值,而是设置一个不可预测(non-guessable)的长随机字符串,作为口令串(token)

②不使用DEL命令释放锁,而是发送一个Lua脚本,这个脚本只在客户端传入的值和键的口令相匹配时,才对键进行删除。

这两个改动可以防止持有过期锁的客户端误删现有锁的情况出现。

以下是一个简单的解锁脚本示例:

if redis.call(“get”,KEYS[1]) == ARGV[1]thenreturn redis.call(“del”,KEYS[1])elsereturn 0end
这个脚本可以通过 EVAL ...script... 1 resource-name token-value命令来调用。

7.SETBIT

SETBIT key offset value

key所储存的字符串值,设置或清除指定偏移量上的位(bit)

位的设置或清除取决于value参数,可以是0也可以是1

key不存在时,自动生成一个新的字符串的值。

字符串会进行伸展(grown)以确保它可以将value保存在指定的偏移量上。当字符串值进行伸展时,空白位置以0填充。

Offset参数必须大于或等于0,小于2^32(bit映射被限制在512MB之内)

返回值:

指定偏移量原来储存的位。

命令:

redis> SETBIT bit 10086 1(integer) 0redis> GETBIT bit 10086(integer) 1redis> GETBIT bit 100   # bit 默认被初始化为 0(integer) 0
8.SETRANGE

SETRANGE key offset value

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

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

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

返回值:

SETRANGE修改值,字符串的长度。

命令:

# 对非空字符串进行 SETRANGEredis> SET greeting "hello world"OKredis> SETRANGE greeting 6 "Redis"(integer) 11redis> GET greeting"hello Redis"# 对空字符串/不存在的 key 进行 SETRANGEredis> EXISTS empty_string(integer) 0redis> SETRANGE empty_string 5 "Redis!"   # 对不存在的 key 使用 SETRANGE(integer) 11redis> GET empty_string                   # 空白处被"\x00"填充"\x00\x00\x00\x00\x00Redis!"
模式

因为有了SETRANGEGETRANGE命令,你可以将redis字符串用作具有o(1)随机访问时间的线性数组,这在很多真实用例中都是非常快速且高效的储存方式。

9.STRLEN

STRLEN key

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

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

返回值:

字符串值的长度。

key不存在时,返回0

命令:

# 获取字符串的长度redis> SET mykey "Hello world"OKredis> STRLEN mykey(integer) 11# 不存在的 key 长度为 0redis> STRLEN nonexisting(integer) 0127.0.0.1:6379> lpush kk 11 22 33(integer) 3127.0.0.1:6379> STRLEN kk #当key储存的不是字符串值时,返回一个错误。(error) WRONGTYPE Operation against a key holding the wrong kind of value

0 0
原创粉丝点击