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

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"

正如你看到的,SETGET 可用于设置和获取字符串值。需要注意的是即便之前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, DECRDECRBY。在内部,这些命令功能类似,只是逻辑稍有不同。

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

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

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

> 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 命令用来检测剩余的存活时间。

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,826评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,968评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,234评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,562评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,611评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,482评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,271评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,166评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,608评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,814评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,926评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,644评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,249评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,866评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,991评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,063评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,871评论 2 354

推荐阅读更多精彩内容