Redis-2 数据类型详解之String和key space操作

时间:2015-03-21 02:15:04   收藏:0   阅读:424

1. String 类型

String 类型是Redis 中最简单的值类型,这也是memcached 中唯一的数据类型。所以对于新手来说在Redis中使用也是非常自然的。

因为Redis的Key是字符串,值也可以是String类型的,所以,我们可以把两个字符串匹配在一起。字符串类型也有很多使用案例,比如缓存HTML片段或者页面。

?

首先来一个基本的例子:

Java代码?
  1. 127.0.0.1:6666>?set?mykey?shang??
  2. OK??
  3. 127.0.0.1:6666>?get?mykey??
  4. "shang"??
  5. 127.0.0.1:6666>???
?

?

1. 如上所示,SET?和?SET?命令可以用来设置和获取字符串值。并且,SET?会替换掉对应key的任何已经存进的值。

Value 可以示任何种类的字符串(包括二进制数据),比如你可以为一个键存储 jpeg 图片。值最大不能超过512MB 。

?

SET?命令有一些又去的选项,他们作为额外的参数存在。比如,我可以让 SET 命令在键存在的时候失败,或者相反的,仅仅在key存在的时候才成功,如下所示:

Java代码?
  1. 127.0.0.1:6666>?set?mykey?henushang?nx??
  2. (nil)??
  3. 127.0.0.1:6666>?set?mykey?henushang?xx??
  4. OK??
  5. 127.0.0.1:6666>?set?newmykey?henushang?xx??
  6. (nil)??

?

?

?

虽然String 示Redis的基本值,但是你仍然可以对他们执行有趣的操作。例如,原子增长:

Java代码?
  1. 127.0.0.1:6666>?set?mynum?100??
  2. OK??
  3. 127.0.0.1:6666>?incr?mynum??
  4. (integer)?101??
  5. 127.0.0.1:6666>?incr?mynum??
  6. (integer)?102??
  7. 127.0.0.1:6666>?incrby?mynum?48??
  8. (integer)?150??
?

2. INCR 命令把字符串值转化为整型,然后增加1,并且最后把获得的值设为新的值。还有一些类似的命令,比如:INCRBY、DECR 和 DECRBY 等。在内部他们除了一点点不同外,算是相同的命令。至于什么是原子的操作字符串,就不再多做解释。

?

3. 还有很多操作字符串的命令。比如 GETSET 命令,它为一个key设置一个新的值,并且返回原来的老值。

?

4. 在单个命令中设置或者检索多个键的值对于减少延迟时间也是非常有用的。因此而诞生了 MSET 和 MGET 命令:

Java代码?
  1. 127.0.0.1:6666>?mset?a?10?b?20?c?30??
  2. OK??
  3. 127.0.0.1:6666>?mget?a?b?c??
  4. 1)?"10"??
  5. 2)?"20"??
  6. 3)?"30"??

当使用 MGET 的时候,Redis返回一个值的数组。

?

2. 修改或查询键空间

有一些命令不是为某个类别而单独设计的,他们是为了与键空间(key space)交互的,因此,可以被用于任何类型的键。

例如,EXISTS 命令会返回1或者0以标志一个键在数据库中存在或者不存在。DEL 命令会删除一个键和与其相关联的值,无论值是什么类型的。

Java代码?
  1. 127.0.0.1:6666>?set?mykey?shang??
  2. OK??
  3. 127.0.0.1:6666>?exists?mykey??
  4. (integer)?1??
  5. 127.0.0.1:6666>?del?mykey??
  6. (integer)?1??
  7. 127.0.0.1:6666>?exists?mykey??
  8. (integer)?0??
  9. 127.0.0.1:6666>?del?mykey??
  10. (integer)?0??

?

从上例中你可以看出,DEL 删除成功会返回1,删除失败会返回0。

有很多与键空间相关的命令,但是上面两个和TYPE 是重要的几个命令,TYPE 命令可以返回与某个键相关联的值的类型:

?
Java代码?
  1. 127.0.0.1:6666>?set?mykey?x??
  2. OK??
  3. 127.0.0.1:6666>?type?mykey??
  4. string??
  5. 127.0.0.1:6666>?del?mykey??
  6. (integer)?1??
  7. 127.0.0.1:6666>?type?mykey??
  8. none??
  9. 127.0.0.1:6666>?set?mykey?1??
  10. OK??
  11. 127.0.0.1:6666>?type?mykey??
  12. string??
?

由上例可以看出TYPE的作用,但是得注意一点,set key 1 的时候,Redis是把 1 当作字符串处理的,这个恰恰与上面解释 INCR 的时候的第一步是吻合的:先把字符串转为整形。

?

?3. Redis 过期:限制了生存时间的键

在讨论更加复杂的数据结构之前,我们需要讨论Redis的另一个与值类型无关的特性:Redis 过期(expires)。最基本的是你可以为一个 key 设置一个超时时间,它可以限制 key 的生存时间。当生存时间到的时候,这个 key 会自动的销毁,就好像用户调用了 DEL 命令一样。

?

快速浏览一下有关 Redis 过期的信息:

设置过期是非常简单的:

Java代码?
  1. 127.0.0.1:6666>?set?mykey?shang??
  2. OK??
  3. 127.0.0.1:6666>?expire?mykey?5??
  4. (integer)?1??
  5. 127.0.0.1:6666>?get?mykey??
  6. "shang"??
  7. 127.0.0.1:6666>?get?mykey??
  8. (nil)??

?

在两次 GET 调用中间那个key消失了,因为第二次调用已经超过了5秒。在上例中,使用EXPIRE 是为了设置过期时间(它也可以用作修改一个已经设置了过期时间的key的过期时间,正如PERSIST可以被用于移除过期时间使key可以永久的保存)。我们也可以使用其他Redis命令创建设置了过期时间的键,例如使用SET的选项:

Java代码?
  1. 127.0.0.1:6666>?set?mykey?100?ex?10??
  2. OK??
  3. 127.0.0.1:6666>?ttl?mykey??
  4. (integer)?7??

?

上例中创建了一个值字符串的100的key,并且过期时间是10秒。然后调用TTL命令来查看key剩下的生存时间。

想要使用毫秒精度来设置和查看过期时间,可以查看查看PEXPIRE 和 PTTL 命令,以及SET选项的全部列表。

?

额。。。下面依然是我建的一个公众帐号,可以关注一下哦,谢谢

bubuko.com,布布扣

原文:http://1358440610-qq-com.iteye.com/blog/2194125

评论(0
© 2014 bubuko.com 版权所有 - 联系我们:wmxa8@hotmail.com
打开技术之扣,分享程序人生!