泛览天下

阅读,看尽天下事

探究Redis 02:基本操作与字符串

2022-08-04 02:27:59


类似的PERSIST 命令可以撤销超时营销,使Redis键值长期保存). 我们也可以在Redis键创建时指定超时,通过启用SET 选项实现:> set key 100 ex 10OK> ttl key(integer) 9上面示例中,字符串


Redis键

Redis键是二进制安全的,也就是说可以用任何二进制数据作为Redis键,比如字符串“foo”或者一个JEPG文件。空字符串也是有效的Redis键。

其他的注意事项包括:

  • 不推荐太长的Redis键,例如:1024字节的键内容既浪费内存,也耗费计算资源,如果键内容较多,建议首先计算HASH值(SHA1),再作为Redis键存储。
  • 避免太短的Redis键。例如:不建议用"u1000flw" 替换 "user:1000:followers"。因为后者可读性更好,且并无明显开销。键设计需要平衡可读性和内存占用。
  • 推荐通过统一分隔符定义键格式,例如:"comment:1234:reply.to" 或者 "comment:1234:reply-to"。
  • Redis键最大长度为512MB。

Redis字符串(strings)

Redis字符串是一种简单的值数据,可以关联到Redis键。在Memcached中,是唯一支持的数据类型,也是Redis新手很容易理解的类型。因为Redis键是字符串,当使用字符串作为值时,其实我们关联了两个字符串。这种字符串类型通常可以被用于缓存HTML片段或页面。字符串类型可以存储任何二进制数据, 例如:jpeg图像。字符串不能超过512 MB大小。

示例:

> set mykey somevalue
OK
> get mykey
"somevalue"

正如你看到的, SET GET 可用于设置和获取字符串值。需要注意的是即便之前Redis键保存的值不是字符串类型, SET 也会替换Redis键对应的值。所以 SET 可以被看做赋值操作。

SET 可以通过额外的参数支持有趣的操作选项。例如:可以要求 SET 在键已存在时返回操作失败,或者相反,只在键存在时成功。

> set mykey newval nx
(nil)
> set mykey newval xx

OK

即便字符串只是基本Redis值类型, 仍然仍然实现了一些有趣的操作,例如:原子递增。

> set counter 100
OK
> incr counter
(integer) 101
> incr counter
(integer) 102
> incrby counter 50
(integer) 152

INCR 命令可以将字符串视作整数,对其做加1操作,并保存到原值。类似的操作还包括: INCRBY , DECR DECRBY 。在内部,这些命令功能类似,只是逻辑稍有不同。

那么INCR的原子性又是指什么呢?你可以理解成多个客户同时向同一个Redis键内容发起INCR命令时,并不存在相互竞争。比如说:对于同一个Redis键,client 1 读取到"10"的同时client 2 也读取到"10",两个client同时发起INCR,使得新的键值为11的可能性并不存在。也就是说,操作结果只能是12,因为Redis会保证一个client自增操作时,其他client对此Redis键的操作不会同时进行。

字符串类型还支持很多其他操作。例如: GETSET 设置新值的同时, 将旧值作为返回结果。你可以在通过 INCR 命令统计网站访客数量时使用这个命令。你也许需要每小时统计一次数量,但不想丢失一个访客数量统计。这种情况下,你可以 GETSET Redis统计键, 将新值设置为"0",并获取之前的统计值作为上一小时的统计数量。

可以在一条命令里同时设置或获取多个Redis键值的操作也可以显著降低操作延时。 你可以使用 MSET MGET 命令实现这个效果:

> mset a 10 b 20 c 30
OK
> mget a b c
1) "10"
2) "20"
3) "30"

当使用 MGET 时,Redis返回值数组。

键空间命令

有些命令不限于特定数据类型,这些命令可以实现一些键空间的交互操作,可以在任何数据类型上使用。例如: EXISTS 命令通过返回1或0来表示给定Redis键在数据库中是否存在, DEL 命令可以删除任何类型的键值对。

> set mykey hello
OK
> exists mykey
(integer) 1
> del mykey
(integer) 1
> exists mykey
(integer) 0

上面的示例中,你可以看到 DEL 也返回1或0来表示Redis键是否成功移除,删除前已存在返回1,否则返回0。

Redis支持各种键空间相关命令,但上面两个是基础命令。和他们一样常见的 TYPE 命令,可以返回值对应的数据类型。

> set mykey x
OK
> type mykey
string
> del mykey
(integer) 1
> type mykey
none

Redis超时: 有限生存期的Redis键

在继续探讨更复杂的数据结构前,我们需要了解另一个与数据类型无关的Redis特性,成为 Redis 超时 。一般来说你可以为Redis键设置一个超时时间,来表示它的生存周期。超时后,Redis键值将自动销毁,效果类似执行 DEL 命令。

以下简要说明Redis 超时:

  • 支持设置秒或毫秒作为计时单位。
  • 超时最终精确到毫秒精度。
  • 超时信息会持久到磁盘,即便Redis停机仍保持计时。 (Redis通过记录键过期时间实现此效果)。

设置超时十分简单,且开销很小:

> set key some-value
OK
> expire key 5
(integer) 1
> get key (immediately)
"some-value"
> get key (after some time)
(nil)

两次 GET 操作之间Redis键因5秒超时自动消失。
在上面示例中,我们用 EXPIRE 命令设置超时。(这个命令还能在已经存在超时时间的Redis键上实现变更超时时间。类似的 PERSIST 命令可以撤销超时营销,使Redis键值长期保存). 我们也可以在Redis键创建时指定超时,通过启用 SET 选项实现:

> set key 100 ex 10
OK
> ttl key
(integer) 9

上面示例中,字符串被设置为 100 ,10秒超时。之后的 TTL 命令用来检测剩余的存活时间。

如果希望使用毫秒计时单位, 请查看 PEXPIRE PTTL 命令, 以及 SET 命令的选项列表。