1.Redis简介

Redis是一款开源的,基于BSD许可的,高级键值(key-value)缓存(cache)和存储(store)系统。由于Redis的键包括string,hash,list,set,sorted set,bitmap和hyperloglog,所以常常被称为数据结构服务器。你可以在这些类型上面运行原子操作,例如,追加字符串,增加哈希中的值,加入一个元素到列表,计算集合的交集、并集和差集,或者是从有序集合中获取最高排名的元素。为了满足高性能,Redis采用内存(in-memory)数据集(dataset)。根据你的使用场景,你可以通过每隔一段时间转储数据集到磁盘,或者追加每条命令到日志来持久化。持久化也可以被禁用,如果你只是需要一个功能丰富,网络化的内存缓存。 Redis还支持主从异步复制,非常快的非阻塞初次同步、网络断开时自动重连局部重同步。 其他特性包括: 

事务
订阅/发布
Lua脚本
带TTL的键
LRU回收健
自动故障转移(failover)

你可以通过多种语言来使用Redis。Redis是由ANSI C语言编写的,在无需额外依赖下,运行于大多数POSIX系统,如Linux、*BSD、OS X。Redis是在Linux和OS X两款操作系统下开发和充分测试的,我们推荐Linux为部署环境。Redis也可以运行在Solaris派生系统上,如SmartOS,但是支持有待加强。没有官方支持的Windows构建版本,但是微软开发和维护了一个64位Windows的版本。

2.数据类型初探

(1).字符串(Strings) 

字符串是Redis最基本的数据类型。Redis字符串是二进制安全的,也就是说,一个Redis字符串可以包含任意类型的数据,例如一张JPEG图像,或者一个序列化的Ruby对象。一个字符串最大为512M字节。你可以使用Redis的字符串类型做很多有意思的事情,例如,你可以: 

使用INCR命令族(INCR,DECR,INCRBY),将字符串作为原子计数器。
使用APPEND命令追加字符串。
使用GETRANGE和SETRANGE命令,使字符串作为随机访问向量(vectors)

编码大量数据到很小的空间,或者使用GETBIT和SETBIT命令,创建一个基于Redis的布隆(Bloom)过滤器。

(2).列表(Lists) 

Redis列表仅仅是按照插入顺序排序的字符串列表。可以添加一个元素到Redis列表的头部(左边)或者尾部(右边)。 LPUSH命令用于插入一个元素到列表的头部,RPUSH命令用于插入一个元素到列表的尾部。当这两个命令操作在一个不存在的键时,将会创建一个新的列表。同样,如果一个操作会清空列表,那么该键将会从键空间(key space)移除。这些是非常方便的语义,因为列表命令如果使用不存在的键作为参数,就会表现得像命令运行在一个空列表上一样。一些列表操作的例子结果:  

LPUSH mylist a   # now the list is “a”  
LPUSH mylist b # now the list is “b”, ”a”
RPUSH mylist c # now the list is “b”,”a”, ”c”(RPUSH was used this time)

列表的最大长度是223-1个元素(4294967295,超过40亿个元素)。 从时间复杂度的角度看,Redis列表主要的特性是支持以常量时间在列表的头和尾附近插入和删除元素,即使列表中已经插入了上百万的数据。访问列表两端的元素非常的快速,但是访问一个非常大的列表的中间却非常的慢,因为这是一个O(N)时间复杂度的操作。 你可以使用Redis的列表类型做很多有意思的事情,例如,你可以:

为社交网络时间轴(timeline)建模,使用LPUSH命令往用户时间轴插入元素,使用LRANGE命令获得最近事项。
使用LPUSH和LTRIM命令创建一个不会超出给定数量元素的列表,只存储最近的N个元素。
列表可以用作消息传递原语,例如,众所周知的用于创建后台任务的Ruby库Resque。
你可以用列表做更多的事情,这种数据类型支持很多的命令,包括阻塞命令,如BLPOP。
(3).集合(Sets) 

Redis集合是没有顺序的字符串集合(collection)。可以在O(1)的时间复杂度添加、删除和测试元素存在与否(不管集合中有多少元素都是常量时间)。 Redis集合具有你需要的不允许重复成员的性质。多次加入同一个元素到集合也只会有一个拷贝在其中。实际上,这意味着加入一个元素到集合中并不需要检查元素是否已存在。 Redis集合非常有意思的是,支持很多服务器端的命令,可以在很短的时间内和已经存在的集合一起计算并集,交集和差集。 你可以使用Redis的集合类型做很多有意思的事情,例如,你可以: 你可以使用Redis集合追踪唯一性的事情。你想知道访问某篇博客文章的所有唯一IP吗?只要在每次页面访问时使用SADD命令就可以了。你可以放心,重复的IP是不会被插入进来的。Redis集合可以表示关系。你可以通过使用集合来表示每个标签,来创建一个标签系统。然后你可以把所有拥有此标签的对象的ID通过SADD命令,加入到表示这个标签的集合中。你想获得同时拥有三个不同标签的对象的全部ID吗?用SINTER就可以了。你可以使用SPOP或SRANDMEMBER命令来从集合中随机抽取元素。

(4).哈希/散列(Hashes) 

Redis哈希是字符串字段(field)与字符串值之间的映射,所以是表示对象的理想数据类型(例如:一个用户对象有多个字段,像用户名,姓氏,年龄等等):

@cli  
HMSET user:1000 username antirez password P1pp0 age 34
HGETALL user:1000
HSET user:1000 password 12345
HGETALL user:1000

拥有少量字段(少量指的是大约100)的哈希会以占用很少存储空间的方式存储,所以你可以在一个很小的Redis实例里存储数百万的对象。 由于哈希主要用来表示对象,对象能存储很多元素,所以你可以用哈希来做很多其他的事情。每个哈希可以存储多达223-1个字段值对(field-value pair)(多于40亿个)。

(5).有序集合(Sorted sets) 

Redis有序集合和Redis集合类似,是非重复字符串集合(collection)。不同的是,每一个有序集合的成员都有一个关联的分数(score),用于按照分数高低排序。尽管成员是唯一的,但是分数是可以重复的。对有序集合我们可以通过很快速的方式添加,删除和更新元素(在和元素数量的对数成正比的时间内)。由于元素是有序的而无需事后排序,你可以通过分数或者排名(位置)很快地来获取一个范围内的元素。访问有序集合的中间元素也是很快的,所以你可以使用有序集合作为一个无重复元素,快速访问你想要的一切的聪明列表:有序的元素,快速的存在性测试,快速的访问中间元素! 总之,有序集合可以在很好的性能下,做很多别的数据库无法模拟的事情。使用有序集合你可以:

例如多人在线游戏排行榜,每次提交一个新的分数,你就使用ZADD命令更新。你可以很容易地使用ZRANGE命令获取前几名用户,你也可以用ZRANK命令,通过给定用户名返回其排行。同时使用ZRANK和ZRANGE命令可以展示与给定用户相似的用户及其分数。以上这些操作都非常的快。 

有序集合常用来索引存储在Redis内的数据。例如,假设你有很多表示用户的哈希,你可以使用有序集合,用年龄作为元素的分数,用用户ID作为元素值,于是你就可以使用ZRANGEBYSCORE命令很快且轻而易举地检索出给定年龄区间的所有用户了。 

有序集合或许是最高级的Redis数据类型。

(6).位图(Bitmaps)和超重对数(HyperLogLogs) 

Redis还支持位图和超重对数这两种基于字符串基本类型,但有自己语义的数据类型。