在线咨询
有事点这里
有事点这里
看不懂这篇文章?联系我们
("麦洛克菲"长期致力于内核安全的推广与普及,我们更专业!)
求职QQ群:223902435。讨论各种求职笔试面试问题
作者:admin 时间:2015-10-31
标题:nosql-redis

NoSQL(NoSQL = Not Only SQL ),意即“不仅仅是SQL”,泛指非关系型的数据库。。NoSQL数据库的四大分类:

 

键值(Key-Value)存储数据库

这一类数据库主要会使用到一个哈希表,这个表中有一个特定的键和一个指针指向特定的数据。Key/value模型对于IT系统来说的优势在于简单、易部署。但是如果DBA只对部分值进行查询或更新的时候,Key/value就显得效率低下了。[3]  举例如:Tokyo Cabinet/Tyrant, Redis, Voldemort, Oracle BDB.

列存储数据库。

这部分数据库通常是用来应对分布式存储的海量数据。键仍然存在,但是它们的特点是指向了多个列。这些列是由列家族来安排的。如:Cassandra, HBase, Riak.

 

文档型数据库

文档型数据库的灵感是来自于Lotus Notes办公软件的,而且它同第一种键值存储相类似。该类型的数据模型是版本化的文档,半结构化的文档以特定的格式存储,比如JSON。文档型数据库可 以看作是键值数据库的升级版,允许之间嵌套键值。而且文档型数据库比键值数据库的查询效率更高。如:CouchDB, MongoDb. 国内也有文档型数据库SequoiaDB,已经开源。

 

图形(Graph)数据库

图形结构的数据库同其他行列以及刚性结构的SQL数据库不同,它是使用灵活的图形模型,并且能够扩展到多个服务器上。NoSQL数据库没有标准的查询语言(SQL),因此进行数据库查询需要制定数据模型。许多NoSQL数据库都有REST式的数据接口或者查询API[2]  如:Neo4J, InfoGrid, Infinite Graph.

 

因此,我们总结NoSQL数据库在以下的这几种情况下比较适用:1、数据模型比较简单;2、需要灵活性更强的IT系统;3、对数据库性能要求较高;4、不需要高度的数据一致性;5、对于给定key,比较容易映射复杂值的环境。

 

Redis(官网:redis.io)是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API

 

redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)list(链表)set(集合)zset(sorted set --有序集合)hash(哈希类型)。这些数据类型都支持push/popadd/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。

 

很多语言如JavaC/C++C#PHPJavaScriptPerlObject-CPythonRubyErlang等都提供了redis的开发接口支持。

 

Redis的外围由一个键、值映射的字典构成。与其他非关系型数据库主要不同在于:Redis中值的类型,不仅限于字符串,还支持如下抽象数据类型:

字符串列表

无序不重复的字符串集合

有序不重复的字符串集合

键、值都为字符串的哈希表

 

redis提供五种数据类型:stringhashlistsetzset(sorted set)

 

REDIS常用命令:

Redis根本是使用内存存储,持久化的关键是这三条指令:SAVE BGSAVE LASTSAVE

当接收到SAVE指令的时候,Redis就会dump数据到一个文件里面。

 

值得一说的是它的独家功能:存储列表和集合:

TYPE key 用来获取某key的类型

KEYS pattern 匹配所有符合模式的key,比如KEYS * 就列出所有的key了,当然,复杂度O(n)

RANDOMKEY - 返回随机的一个key

RENAME oldkeynewkey key也可以改名

列表操作

RPUSH key string 将某个值加入到一个key列表末尾

LPUSH key string 将某个值加入到一个key列表头部

LLEN key 列表长度

LRANGE key start end 返回列表中某个范围的值,相当于mysql里面的分页查询那样

LTRIM key start end 只保留列表中某个范围的值

LINDEX key index 获取列表中特定索引号的值,要注意是O(n)复杂度

LSET key index value 设置列表中某个位置的值

LPOP key

RPOP key 和上面的LPOP一样,就是类似栈或队列的那种取头取尾指令,可以当成消息队列来使用了

集合操作

SADD key member 增加元素

SREM key member 删除元素

SCARD key 返回集合大小

SISMEMBER key member 判断某个值是否在集合中

SINTER key1 key2 ... keyN 获取多个集合的交集元素

SMEMBERS key 列出集合的所有元素

还有Multiple DB的命令,可以更换db,数据可以隔离开,默认是存放在DB 0