今天第一次开通,写的不好,请谅解

 

redis并不是简单的key-value存储,实际上它是一个数据结构服务器,支持不同类型的值,也就是说,我们不仅仅把字符串当作键所指向的值,

 

如下这些数据类型都可以作为值类型:

 

二进制安全的字符串:string;

 

二进制安全的字符串列表:list of string;

 

二进制安全的字符串集合:set of string,换言之:它是一组无重复未排序的element; 可以把它看成Ruby中的hash-其key等于element,value都等于'true'。

 

有序集合:sorted set of string,类似于集合set,但其中每个元素都和一个浮点数score(评分)关联。element根据score排序,可以把它看成Ruby中的hash-其key等于element,value等于score,但元素总是按score的顺序排序,无需额外的排序操作

 

 

Redis 键

 

Redis key值是二进制安全的,这意味着可以可以用任何二进制序列作为key值,从形如"foo"的简单字符串到一个JPEG文件的内容都可以。

空字符串也是有效key值。

 

key的规则:

 

太长的键值不是好主意,例如1024字节的键值就不是好主意,不仅因为消耗内存,而且在数据中查找这类键值的计算成本很高;

 

太短的键值通常也不是好主意,如果你要用"u:1000:pwd"来代替"user:1000:password",这没有什么问题,但后者更易阅读,并由此增加的空间消耗相对于key object和value object本身来说很小,也没有人去阻止您一定要用更短的键值节省一丁点空间;

 

最好坚持一种模式。如:"object-type:id:field"就是个不错的注意,像这样"user:1000:password"。在多单词的字段名中加上一个点,就像:"comment:1234:reply.to"

 


字符串是Redis的基本值类型

字符串类型:Redis就像一个可以持久化的memcached服务器(注:memcache的数据仅保存在内存中,服务器重启后,数据将丢失)。

 

用SET command 和 GET command来设置和获取字符串值。值可以是任何种类的字符串(包括二进制数据),例如你可以在一个键下保存一副jpeg图片。值的长度不能超过1GB。

 

原子递增:

$ redis-cli set counter 100 
 OK $ redis-cli incr counter 
 (integer) 101 
 $ redis-cli incr counter 
 (integer) 102 
 $ redis-cli incrby counter 10 
 (integer) 112

 

INCR 命令将字符串值解析成整型,将其加一,最后将结果保存为新的字符串值,类似的命令有INCRBY, DECR and DECRBY。实际上他们在内部就是同一个命令,只是看上去有点儿不同。

 

GETSET命令:为key设置新值并且返回原值,如果我们的系统中有新的用户访问时就用INCR命令操作一个Redis key,但如果我们希望每小时对这个信息收集一次,那么我们就可以用GETSET这个key并给其赋值0并读取原值

 

 

列表类型:一般来讲,列表就是有序元素的序列:10,20,1,2,3就是一个列表,但用数组实现的List和用Linked List实现的List,在属性方面大不相同。

 

Redis Lists用linked list实现的原因是:对于数据库系统来说,至关重要的特性是:能非常快的在很大的列表上添加元素。另一个重要因素是,正如你将要看到的:Redis lists能在常数时间取得常数长度。

 

 

Redis的七种特性:

 

一 Strings数据结构

 

简单的key-value类型,value其实不仅是String,也可以是数字。

 

使用Strings类型,你可以完全实现目前 Memcached 的功能,并且效率更高。

 

还可以享受Redis的定时持久化,操作日志及 Replication等功能。

 

除了提供与 Memcached 一样的get、set、incr、decr 等操作外,

Redis还提供了下面一些操作:

 

获取字符串长度

 

往字符串append内容

设置和获取字符串的某一段内容

 

设置及获取字符串的某一位(bit)

批量设置一系列字符串的内容

 

二 Hashs

 

在Memcached中,我们经常将一些结构化的信息打包成hashmap,在客户端序列化后存储为一个字符串的值,比如用户的昵称、年龄、性别、积分等,这时候在需要修改其中某一项时,通常需要将所有值取出反序列化后,修改某一项的值,再序列化存储回去。

 

这样不仅增大了开销,也不适用于一些可能并发操作的场合(比如两个并发的操作都需要修改积分)。

 

而Redis的Hash结构可以使你像在数据库中Update一个属性一样只修改某一项属性值。

 

三 Lists

 

Lists 就是链表,相信略有数据结构知识的人都应该能理解其结构。

 

使用Lists结构,我们可以轻松地实现最新消息排行等功能。

 

Lists的另一个应用就是消息队列,可以利用Lists的PUSH操作,将任务存在Lists中,然后工作线程再用POP操作将任务取出进行执行。

 

Redis还提供了操作Lists中某一段的api,你可以直接查询,删除Lists中某一段的元素。

 

四 Sets

 

Sets 就是一个集合,集合的概念就是一堆不重复值的组合。

 

利用Redis提供的Sets数据结构,可以存储一些集合性的数据,比如在微博应用中,可以将一个用户所有的关注人存在一个集合中,将其所有粉丝存在一个集合。

 

Redis还为集合提供了求交集、并集、差集等操作,可以非常方便的实现如共同关注、共同喜好、二度好友等功能,对上面的所有集合操作,你还可以使用不同的命令选择将结果返回给客户端还是存集到一个新的集合中。

 

五 Sorted Sets

 

和Sets相比,Sorted Sets增加了一个权重参数score,使得集合中的元素能够按score进行有序排列,比如一个存储全班同学成绩的Sorted Sets,其集合value可以是同学的学号,而score就可以是其考试得分,这样在数据插入集合的时候,就已经进行了天然的排序。

 

另外还可以用Sorted Sets来做带权重的队列,比如普通消息的score为1,重要消息的score为2,然后工作线程可以选择按score的倒序来获取工作任务。让重要的任务优先执行。

 

六 Pub/Sub

 

Pub/Sub 从字面上理解就是发布(Publish)与订阅(Subscribe),在Redis中,你可以设定对某一个key值进行消息发布及消息订阅,当一个key值上进行了消息发布后,所有订阅它的客户端都会收到相应的消息。

 

这一功能最明显的用法就是用作实时消息系统,比如普通的即时聊天,群聊等功能。

 

七 Transactions

 

谁说NoSQL都不支持事务,虽然Redis的Transactions提供的并不是严格的ACID的事务(比如一串用EXEC提交执行的命令,在执行中服务器宕机,那么会有一部分命令执行了,剩下的没执行),

 

但是这个Transactions还是提供了基本的命令打包执行的功能(在服务器不出问题的情况下,可以保证一连串的命令是顺序在一起执行的,中间有会有其它客户端命令插进来执行)。

 

Redis还提供了一个Watch功能,你可以对一个key进行Watch,然后再执行Transactions,

 

在这过程中,如果这个Watched的值进行了修改,那么这个Transactions会发现并拒绝执行。