共计 7182 个字符,预计需要花费 18 分钟才能阅读完成。
本篇内容主要讲解“redis 数据类型 strings 的详细介绍”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让丸趣 TV 小编来带大家学习“redis 数据类型 strings 的详细介绍”吧!
1. String(字符串)
string 是最简单的类型,你可以理解成与 Memcached 一模一样的类型,一个 key 对应一个 value,其上支持的操作与 Memcached 的操作类似。但它的功能更丰富。
redis 采用结构 sdshdr 和 sds 封装了字符串,字符串相关的操作实现在源文件 sds.h/sds.c 中。在 Redis 中字符串类型的 Value 最多可以容纳的数据长度是 512M
在 Redis 中是二进制安全的,这便意味着该类型可以接受任何格式的数据,如 JPEG 图像数据或 Json 对象描述信息等
数据结构定义如下:
typedefchar*sds;
structsdshdr{
longlen;
longfree;
charbuf[];
};
1.1. SET
Set key value [EX seconds] [PXmilliseconds] [NX|XX]
将字符串值 value 关联到 key。如果 key 已经持有其他值,SET 就覆写旧值,无视类型。对于某个原本带有生存时间(TTL)的键来说,当 SET 命令成功在这个键上执行时,这个键原有的 TTL 将被清除。
可选参数
从 Redis 2.6.12 版本开始,SET 命令的行为可以通过一系列参数来修改:
EXsecond:设置键的过期时间为 second 秒。SET key value EX second 效果等同于 SETEXkey second value。
PXmillisecond:设置键的过期时间为 millisecond 毫秒。SET key value PX millisecond 效果等同于 PSETEXkey millisecond value。
NX:只在键不存在时,才对键进行设置操作。SETkey value NX 效果等同于 SETNX key value。
XX:只在键已经存在时,才对键进行设置操作。
#赋值与取值
127.0.0.1:6379 set dbredis
OK
127.0.0.1:6379 get db
redis
#使用 ex 选项
127.0.0.1:6379 set dbredis ex 20
OK
127.0.0.1:6379 ttl db
(integer) 16
127.0.0.1:6379 get db
redis
127.0.0.1:6379 ttl db
(integer) 5
127.0.0.1:6379 get db
redis
127.0.0.1:6379 get db
redis
127.0.0.1:6379 get db
(nil)
# 使用 PX 选项
127.0.0.1:6379 set db redis px 20000
OK
127.0.0.1:6379 PTTL db
(integer)15674
127.0.0.1:6379 PTTL db
(integer)8974
127.0.0.1:6379 PTTL db
(integer)8045
127.0.0.1:6379 get db
redis
127.0.0.1:6379 PTTL db
(integer)2482
127.0.0.1:6379 get db
redis
127.0.0.1:6379 get db
(nil)
# 使用 NX 选项
127.0.0.1:6379 set db oracle NX
OK
127.0.0.1:6379 get db
oracle
127.0.0.1:6379 set db redis NX — 键存在,失败
(nil)
127.0.0.1:6379 get db
oracle
# 使用 XX 选项
127.0.0.1:6379 exists name
(integer)0
127.0.0.1:6379 get name
(nil)
127.0.0.1:6379 set name hunt1574 XX — 键不存在,失败
(nil)
127.0.0.1:6379 set name redis
OK
127.0.0.1:6379 set name hunt1574 XX
OK
127.0.0.1:6379 get name
hunt1574
1.2. SETEX
Setex key seconds value
将值 value 关联到 key,并将 key 的生存时间设为 seconds (以秒为单位)。
如果 key 已经存在,SETEX 命令将覆写旧值。
这个命令类似于以下两个命令:
SETkey value
EXPIREkey seconds # 设置生存时间
不同之处是,SETEX 是一个原子性 (atomic) 操作,关联值和设置生存时间两个动作会在同一时间内完成,该命令在 Redis 用作缓存时,非常实用。
#key 不存在赋值
127.0.0.1:6379 EXISTS user
(integer)0
127.0.0.1:6379 setex user 30 root
OK
127.0.0.1:6379 get user
root
127.0.0.1:6379 ttl user
(integer)15
127.0.0.1:6379 get user
(nil)
#key 存在赋值
127.0.0.1:6379 setex user 20 admin
OK
127.0.0.1:6379 get user
admin
127.0.0.1:6379 ttl user
(integer)14
127.0.0.1:6379 get user
(nil)
1.3. SETNX
SETNX key value
将 key 的值设为 value,当且仅当 key 不存在。
若给定的 key 已经存在,则 SETNX 不做任何动作。
SETNX 是『SET if Not eXists』(如果不存在,则 SET)的简写。
# 赋值与取值
127.0.0.1:6379 EXISTS www
(integer)0
127.0.0.1:6379 setnx www code.google.com
(integer)1
127.0.0.1:6379 setnx www redis.io
(integer)0
127.0.0.1:6379 get www
code.google.com
127.0.0.1:6379
1.4. SETRANGE
SETRANGE key offset value
用 value 参数覆写 (overwrite) 给定 offset 的 key 所储存的字符串值
127.0.0.1:6379 set www code.google.com
OK
127.0.0.1:6379 get www
code.google.com
127.0.0.1:6379 SETRANGE www 0 mail
(integer)15
127.0.0.1:6379 get www
mail.google.com
127.0.0.1:6379 SETRANGE www 0 gmail
(integer)15
127.0.0.1:6379 get www
gmailgoogle.com
1.5. MSET
MSET key value [key value …]
同时设置一个或多个 key-value 对。
如果某个给定 key 已经存在,那么 MSET 会用新值覆盖原来的旧值,如果这不是你所希望的效果,请考虑使用 MSETNX 命令:它只会在所有给定 key 都不存在的情况下进行设置操作。
MSET 是一个原子性 (atomic) 操作,所有给定 key 都会在同一时间内被设置,某些给定 key 被更新而另一些给定 key 没有改变的情况,不可能发生。
# 赋值与取值
127.0.0.1:6379 mset os linux db redis date 2015-03-17
OK
127.0.0.1:6379 mget os db date
1) linux
2) redis
3) 2015-03-17
# 值覆盖
127.0.0.1:6379 mset os linux db oracle date 2015-03-17
OK
127.0.0.1:6379 mget os db date
1) linux
2) oracle
3) 2015-03-17
127.0.0.1:6379
1.6. MSETNX
MSETNX key value [key value …]
同时设置一个或多个 key-value 对,当且仅当所有给定 key 都不存在。
即使只有一个给定 key 已存在,MSETNX 也会拒绝执行所有给定 key 的设置操作。MSETNX 是原子性的,因此它可以用作设置多个不同 key 表示不同字段 (field) 的唯一性逻辑对象(unique logic object),所有字段要么全被设置,要么全不被设置。
# 赋值与取值
127.0.0.1:6379 mget os db date
1) linux
2) redis
3) 2015-03-17
127.0.0.1:6379 msetnx os linux db oracle date 2015-03-17
(integer)0
127.0.0.1:6379 mget os db date
1) linux
2) redis
3) 2015-03-17
127.0.0.1:6379
1.7. GET
GET key
返回 key 所关联的字符串值。
如果 key 不存在那么返回特殊值 nil。
假如 key 储存的值不是字符串类型,返回一个错误,因为 GET 只能用于处理字符串值。
127.0.0.1:6379 set dbname redis
OK
127.0.0.1:6379 get dbname
redis
127.0.0.1:6379 get dbversion
(nil)
127.0.0.1:6379 lpush db redis mysql mongodb
(integer)3
127.0.0.1:6379 get db
(error)WRONGTYPE Operation against a key holding the wrong kind of value
1.8. MGET
MGET key [key …]
返回所有 (一个或多个) 给定 key 的值。
如果给定的 key 里面,有某个 key 不存在,那么这个 key 返回特殊值 nil。因此,该命令永不失败。
# 赋值与取值
127.0.0.1:6379 set date 2015-03-17
OK
127.0.0.1:6379 set time 10:00
OK
127.0.0.1:6379 mget date time
1) 2015-03-17
2) 10:00
127.0.0.1:6379 mget date time week —week 不存在,返回 nil
1) 2015-03-17
2) 10:00
3)(nil)
1.9. GETRANGE
GETRANGE key startend
返回 key 中字符串值的子字符串,字符串的截取范围由 start 和 end 两个偏移量决定(包括 start 和 end 在内)。负数偏移量表示从字符串最后开始计数,-1 表示最后一个字符,-2 表示倒数第二个,以此类推。范围超过字符串最大下标值以最大下标值为准。
# 赋值与取值
127.0.0.1:6379 set www redis.io
OK
127.0.0.1:6379 GETRANGE www 0 4
redis
127.0.0.1:6379 GETRANGE www -2 -1
io
127.0.0.1:6379 GETRANGE www -100 -1
redis.io
1.10. GETSET
GETSET key value
将给定 key 的值设为 value,并返回 key 的旧值(old value)。
当 key 存在但不是字符串类型时,返回一个错误。
127.0.0.1:6379 getset dbname mysql
(nil)
127.0.0.1:6379 get dbname
mysql
127.0.0.1:6379 getset dbname redis
mysql
127.0.0.1:6379 get dbname
redis
1.11. INCR
INCR key
将 key 中储存的数字值增一。
如果 key 不存在,那么 key 的值会先被初始化为 0,然后再执行 INCR 操作。如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误。
本操作的值限制在 64 位 (bit) 有符号数字表示之内。
127.0.0.1:6379 EXISTS pages
(integer)0
127.0.0.1:6379 incr pages
(integer)1
127.0.0.1:6379 get pages
1
127.0.0.1:6379 set rows 0
OK
127.0.0.1:6379 incr rows
(integer)1
127.0.0.1:6379 incr rows
(integer)2
127.0.0.1:6379 incr rows
(integer)3
127.0.0.1:6379 get rows
3
127.0.0.1:6379
1.12. INCRBY
INCRBY keyincrement
将 key 所储存的值加上增量 increment。
如果 key 不存在,那么 key 的值会先被初始化为 0,然后再执行 INCRBY 命令。
如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误。
本操作的值限制在 64 位 (bit) 有符号数字表示之内
# 键存在
127.0.0.1:6379 get rows
3
127.0.0.1:6379 INCRBY rows 3
(integer)6
127.0.0.1:6379 INCRBY rows 3
(integer)9
127.0.0.1:6379 INCRBY rows 3
(integer)12
# 键不存在
127.0.0.1:6379 get num
(nil)
127.0.0.1:6379 INCRBY num -2
(integer)-2
127.0.0.1:6379 INCRBY num -2
(integer)-4
127.0.0.1:6379 INCRBY num -2
(integer)-6
1.13. INCRBYFLOAT
INCRBYFLOAT keyincrement
为 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)。
127.0.0.1:6379 set price 45.99
OK
127.0.0.1:6379 INCRBYFLOAT price 4.5
50.49
127.0.0.1:6379 INCRBYFLOAT price 4.5
54.99
127.0.0.1:6379 get num
(nil)
127.0.0.1:6379 INCRBYFLOAT num 5.3
5.3
127.0.0.1:6379 INCRBYFLOAT num 5.3
10.6
1.14. DECR
DECR key
将 key 中储存的数字值减一。
如果 key 不存在,那么 key 的值会先被初始化为 0,然后再执行 DECR 操作。
如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误。
127.0.0.1:6379 set price 398.99
OK
127.0.0.1:6379 decr price
(error)ERR value is not an integer or out of range
127.0.0.1:6379 set pages 98
OK
127.0.0.1:6379 decr pages
(integer)97
127.0.0.1:6379 decr pages
(integer)96
1.15. DECRBY
DECRBY keydecrement
将 key 所储存的值减去减量 decrement。
如果 key 不存在,那么 key 的值会先被初始化为 0,然后再执行 DECRBY 操作。
如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误。
127.0.0.1:6379 get pages
96
127.0.0.1:6379 decrby pages 5
(integer)91
127.0.0.1:6379 decrby pages 5
(integer)86
127.0.0.1:6379 decrby pages -5
(integer)91
127.0.0.1:6379 decrby pages -5
(integer)96
127.0.0.1:6379
1.16. APPEND
APPEND key value
如果 key 已经存在并且是一个字符串,APPEND 命令将 value 追加到 key 原来的值的末尾。
如果 key 不存在,APPEND 就简单地将给定 key 设为 value,就像执行 SET key value 一样。
127.0.0.1:6379 get db
(nil)
127.0.0.1:6379 APPENDdb redis
(integer) 5
127.0.0.1:6379 APPENDdb .io
(integer) 8
127.0.0.1:6379 get db
redis.io
127.0.0.1:6379
1.17. STRLEN
STRLEN key
返回 key 所储存的字符串值的长度。
当 key 储存的不是字符串值时,返回一个错误。
127.0.0.1:6379 getpages
96
127.0.0.1:6379 STRLENpages
(integer) 2
127.0.0.1:6379 get db
redis.io
127.0.0.1:6379 STRLENdb
(integer) 8
127.0.0.1:6379
到此,相信大家对“redis 数据类型 strings 的详细介绍”有了更深的了解,不妨来实际操作一番吧!这里是丸趣 TV 网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!