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 range2.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) 08.SETRANGE
SETRANGE key offset value
用value参数覆写(overwrite)给定key所储存的字符串值,从偏移量offset开始。
不存在的key当作空白字符串处理。
SETRANGE命令会确保字符串够长以便将value设置在指定偏移量上,如果给定key原来储存的字符串长度比偏移量小(比如字符串只有5个字符长,但你设置的offset是10),那么原字符串和偏移量之间的空白将用零字节(“\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!"模式
因为有了SETRANGE和GETRANGE命令,你可以将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
- Redis数据类型之string
- redis之string----INCR
- redis之string
- redis之string
- Redis之String类型
- Redis之String
- redis之string命令
- redis之string(3)
- Redis数据类型之String
- redis学习之Redis 字符串(String)
- redis教程(六)之redis String
- redis基础之数据类型string
- Redis数据类型之string类型
- 03. redis 数据类型之String
- Redis数据结构命令之String
- Redis数据类型之String类型
- Redis之String 字符串类型
- Redis基础之数据类型(String)
- Android APP启动时出现白屏或者黑屏怎么办?
- C++删除空指针的一个坑
- 理解闭包(二)
- 《超智能体》提供下载项
- 全排列
- redis之string
- 水面无人艇局部危险避障算法研究 中英文摘要
- CCF 201403-4 无线网络(spfa+dp)
- 机器学习算法
- 字符串系列---最长公共子串
- Generating Sets
- c++ primer 课后练习 9.28
- 第五十六天学习笔记
- PAT B1004