Redis 的作者 antirez(Salvatore Sanfilippo)曾经发表了一篇名为 Redis 宣言(Redis Manifesto)
的文章,文中列举了 Redis 的七个原则,以向大家阐明 Redis 的思想。
1、Redis 是一个操作数据结构的语言工具,它提供基于 TCP 的协议以操作丰富的数据结构。
在 Redis 中,数据结构这个词的意义不仅表示在某种数据结构上的操作,更包括了结构本身
及这些操作的时间空间复杂度。
2、Redis 定位于一个内存数据库,正是由于内存的快速访问特性,才使得 Redis 能够有如此
高的性能,才使得 Redis 能够轻松处理大量复杂的数据结构,Redis 会尝试其它的存储方面
的选择,但是永远不会改变它是一个内存数据库的角色。
3、Redis 使用基础的 API 操作基础的数据结构,Redis 的 API 与数据结构一样,都是一些最基
础的元素,你几乎可以将任何信息交互使用此 API 格式表示。作者调侃说,如果有其它非人
类的智能生物存在,他们也能理解 Redis 的 API。因为它是如此的基础。
4、Redis 有着诗一般优美的代码,经常有一些不太了解 Redis 有的人会建议 Redis 采用一些
其它人的代码,以实现一些 Redis 未实现的功能,但这对我们来说就像是非要给《红楼梦》
接上后四十回一样。
5、Redis 始终避免复杂化,我们认为设计一个系统的本质,就是与复杂化作战。我们不会为了一个小功能而往源码里添加上千行代码,解决复杂问题的方法就是让复杂问题永远不要提复杂的问题。
6、Redis 支持两个层成的 API,第一个层面包含部分操作 API,但它支持用于分布式环境下
的 Redis。第二个层面的 API 支持更复杂的 multi-key 操作。它们各有所长,但是我们不会推
出两者都支持的 API,但我们希望能够提供实例间数据迁移的命令,并执行 multi-key 操作。
7、我们以优化代码为乐,我们相信编码是一件辛苦的工作,唯一对得起这辛苦的就是去享
受它。如果我们在编码中失去了乐趣,那最好的解决办法就是停下来。我们决不会选择让Redis 不好玩的开发模式。
Redis 的作者 antirez 曾笑称 Redis 为一个数据结构服务器(data structures server)
,这是一个非常准确的表述,Redis 的所有功能就是将数据以其固有的几种结构来保存,并提供
给用户操作这几种结构的接口。本文将介绍 Redis 支持的各种数据类型及其操作接口。
strings 类型及操作
string 是最简单的类型,你可以理解成与 Memcached 是一模一样的类型,一个 key 对应一个
value,其上支持的操作与 Memcached 的操作类似。但它的功能更丰富。
string 类型是二进制安全的。意思是 redis 的 string 可以包含任何数据,比如 jpg 图片或者序
列化的对象。从内部实现来看其实 string 可以看作 byte 数组,最大上限是 1G 字节,下面是
string 类型的定义:
1
2
3
4
5
|
struct sdshdr {
long len;
long free ;
char buf[];
}; |
len 是 buf 数组的长度。
free 是数组中剩余可用字节数,由此可以理解为什么 string 类型是二进制安全的了,因为它
本质上就是个 byte 数组,当然可以包含任何数据了
buf 是个 char 数组用于存贮实际的字符串内容,其实 char 和 c#中的 byte 是等价的,都是一
个字节。
另外 string 类型可以被部分命令按 int 处理.比如 incr 等命令,如果只用 string 类型,redis 就
可以被看作加上持久化特性的 memcached。
当然 redis 对 string 类型的操作比 memcached 还是多很多的,具体操作方法如下:
set:
设置 key 对应的值为 string 类型的 value。
例如我们添加一个 name= HongWan 的键值对,可以这样做:
setnx:
设置 key 对应的值为 string 类型的 value。
如果 key 已经存在,返回 0, nx是 not exist 的意思。
例如我们添加一个 name= HongWan_new 的键值对,可以这样做:
setex:
设置 key 对应的值为 string 类型的 value,并指定此键值对应的有效期。
例如我们添加一个 haircolor= red 的键值对,并指定它的有效期是 10 秒,可以这样做:
可见由于最后一次的调用是 10 秒以后了,所以取不到 haicolor 这个键对应的值。
setrange:
设置指定 key 的 value 值的子字符串。
例如我们希望将 HongWan 的 126 邮箱替换为 gmail 邮箱,那么我们可以这样做:
其中的 5 是指从下标为 5(包含 5)的字符开始替换
mset:
一次设置多个 key 的值,成功返回 ok 表示所有的值都设置了,失败返回 0 表示没有任何值被设置。
msetnx:
一次设置多个 key 的值,成功返回 ok 表示所有的值都设置了,失败返回 0 表示没有任何值
被设置,但是不会覆盖已经存在的 key。
可以看出如果这条命令返回 0,那么里面操作都会回滚,都不会被执行。
get:
获取 key 对应的 string 值,如果 key 不存在返回 nil。
getset:
可见,如果 key 不存在,设置成功,但是将返回 nil
getrange:
字符串左面下标是从 0 开始的
字符串右面下标是从-1 开始的
当下标超出字符串长度时,将默认为是同方向的最大下标
mget:
一次获取多个 key 的值,如果对应 key 不存在,则对应返回 nil。
incr:
对 key 的值做加加操作,并返回新的值。注意 incr 一个不是 int 的 value 会返回错误,incr 一
个不存在的 key,则设置 key 为 1
incrby:
同 incr 类似,加指定值 ,key 不存在时候会设置 key,并认为原来的 value 是 0
decr:
对 key 的值做的是减减操作,decr 一个不存在 key,则设置 key 为-1
decrby:
减指定值
decrby 完全是为了可读性,我们完全可以通过 incrby 一个负值来实现同样效果,反之一样。
append:
给指定 key 的字符串值追加 value,返回新字符串值的长度。
例如我们向 name 的值追加一个@126.com 字符串,那么可以这样做:
strlen:
本文转自shayang8851CTO博客,原文链接:http://blog.51cto.com/janephp/1336767,如需转载请自行联系原作者