为您推荐:
精华内容
最热下载
问答
  • 5星
    4.5MB GJZGRB 2021-04-13 10:37:48
  • 59KB weixin_38649657 2020-09-10 17:26:19
  • 5KB lex999 2014-07-10 09:48:21
  • 236KB weixin_38656462 2021-01-30 04:08:35
  • 都知道redis是非常强大的内存数据库, 由于所有的数据都存储在内存中,其操作非常的快。但是由于内存比较昂贵,不可能把所有的数据都放到内存中,因此往往redis都用来做缓存。 这带来什么问题呢,缓存的有效性如何...

    redis

    c语言实现
    都知道redis是非常强大的内存数据库, 由于所有的数据都存储在内存中,其操作非常的快。但是由于内存比较昂贵,不可能把所有的数据都放到内存中,因此往往redis都用来做缓存。
    这带来什么问题呢,缓存的有效性如何保证,在持久化存储的更新发生时,需要同步更新缓存,在高并发的情况下,很可能带来不一致性的问题。(当然得有一定的并发量)

    如果redis可以把持久化存储的工作干了,是不是就不需要做同步更新了呢?来看下leveldb

    leveldb

    c++语言实现
    leveldb是一款key-value NoSql数据库,基于内存的写入 + 基于内存和磁盘的读取,实现高效的Get Put操作
    具体是如何工作的呢?

    1. 首先介绍下skiplist:
      我们都知道linkedlist,linkedlist的查询/修改复杂度为O(n),对于linkedlist我们如何能实现类似于二分法,复杂度为O(log(n))的算法呢?
      linkedlist是实现不了,其变异版本skiplist可以实现,欲了解详情自行百度,这里只是介绍下 它是一种能够实现高效查询和修改的类链表结构
    2. leveldb的数据存储分为内存和磁盘,在内存中数据存储在2个skiplist,一个只读一个读写
    3. 数据在写入leveldb的时候数据,会写入wskiplist以及磁盘日志(类似于wal机制),在wskiplist达到一定大小,wskiplist变成新的rskiplist,老的rskiplist会被异步写入磁盘,生成sst文件(sorted string table)
    4. 生成新的wskiplist用于写入数据
    5. 在读取数据的时候,其顺序依次为wskiplist-> rskiplist -> sst文件
    6. sst文件分层存储,从而每层文件个数不同,大小类似

    rocksdb

    基于leveldb开发,在leveldb代码的基础上进行优化,主要用于服务器嵌入式db的使用。我们平常使用db,是应用通过网络访问db中心,facebook为了减少这50微妙的网络延时而开发的优化的嵌入式db。改进点在于充分应用闪存的优势,利用多核服务器的特点,加快db的存取。其工作原理和leveldb类似。

    Cassandra

    java语言实现
    来自 Apache 的分布式数据库,理论依据:Amazon Dynamo和Google Big Table论文
    数据模型类似于hbase,是rowkey-列族-列 结构
    单节点的读写原理跟leveldb类似,跟rocks不同的是,其只是原理类似,不是基于leveldb实现
    也就是说Cassandra 类似于 leveldb集群。集群中的节点通过gossip协议协调,数据通过在节点间的冗余存储实现节点故障容忍。

    hbase

    java语言实现
    来自于Apache的分布式数据库,理论依据:Google Big Table论文
    hbase跟cassandra类似都是分布式数据库,数据模型也都是rowkey-列族-列,不过Cassandra采用gossip协议实现集群内通信和协调,较为负载,hbase采用zk作为集群信息协调,实现较为简单。并且提供强一致性。
    其使用范围比Cassandra更广,在国内外更多的公司采用hbase

    展开全文
    weixin_37512224 2020-03-16 14:11:12
  • Redis是一个开源的 C语言编写的Key-Value数据库,并提供多种语言的API。 它通常被称为数据结构服务器,因为值(value)可以是 字符串(String), 哈希(Hash), 列表(list), 集合(sets) 和 有序集合(sorted sets)等类型...

    1、Redis 简介

    1.1、简述

    Redis是一个开源的 C语言编写的Key-Value数据库,并提供多种语言的API。
    它通常被称为数据结构服务器,因为值(value)可以是 字符串(String), 哈希(Hash), 列表(list), 集合(sets) 和 有序集合(sorted sets)等类型。

    1.2、特点

    Redis 与其他 Key - Value 缓存产品有以下三个特点:

    • Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
    • Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
    • Redis支持数据的备份,即master-slave模式的数据备份。

    Redis有着更为复杂的数据结构并且提供对他们的原子性操作,这是一个不同于其他数据库的进化路径。Redis的数据类型都是基于基本数据结构的同时对程序员透明,无需进行额外的抽象。

    Redis运行在内存中但是可以持久化到磁盘,所以在对不同数据集进行高速读写时需要权衡内存,因为数据量不能大于硬件内存。在内存数据库方面的另一个优点是,相比在磁盘上相同的复杂的数据结构,在内存中操作起来非常简单,这样Redis可以做很多内部复杂性很强的事情。同时,在磁盘格式方面他们是紧凑的以追加的方式产生的,因为他们并不需要进行随机访问。

    1.3、优势

    • 性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。
    • 丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
    • 原子 – Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来。
    • 丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。

    2、CentOS 操作 Redis

    2.1、安装启动

    2.1.1、安装

    Redis下载地址:http://download.redis.io/releases/

    以4.0.9版本为例:

    wget http://download.redis.io/releases/redis-4.0.9.tar.gz
    

    解压安装包并安装:

    tar xzf redis-4.0.9.tar.gz
    cd redis-4.0.9
    make -j grep processor /proc/cpuinfo | wc -l
    make install
    

    注:通过”grep processor /proc/cpuinfo | wc -l”查看系统最大cpu核心数,通过最大核数编译可以更有效的利用CPU资源。

    2.1.2、改配置

    修改配置文件 etc/redis.conf :

    • 如果允许外网访问,记得修改绑定的IP,把 bind 127.0.0.1 改为:
    bind 0.0.0.0
    
    • 如果修改端口就把 port 6379 进行修改,如果开多个端口,就生成多个配置文件,把每个配置文件的端口进行修改即可
    • 如果配置文件启动多个端口的配置文件,别忘了修改这里(默认的是6379):
    pidfile /var/run/redis_6379.pid
    

    如果想给redis加密码,再配置文件种添加 ( 如果密码是123456 ) ,默认是没有密码的:

    requirepass 123456
    

    2.1.3、启动

    redis-server redis.conf 
    

    如果多个端口就开启多个redis-server+配置文件即可

    2.2、常用命令

    2.2.1、redis-cli

    利用一下命令在服务器打开redis

    redis-cli -p 端口
    

    例如:
    在这里插入图片描述

    2.2.2、auth命令

    进入后,auth + 密码,如果输入正确,就可以进行后续操作了,例如:
    在这里插入图片描述

    2.2.3、PING 命令

    用于检测 redis 服务是否启动,例如:
    在这里插入图片描述

    2.2.4、Key命令

    用于正则匹配检测符合条件的有哪些key,例如:
    在这里插入图片描述

    2.2.5、GET命令

    get key 获取指定 key 的值,例如:
    在这里插入图片描述

    2.2.6、SET命令

    set key value ,设置指定 key 的值,例如:
    在这里插入图片描述

    2.2.7、DEL命令

    del key,设置指定 key 的值,例如:
    在这里插入图片描述

    3、Python3 操作 Redis

    3.1、连接 Redis 的 4 种方式

    在这里插入图片描述

    3.1.1、创建 redis 链接对象

    import redis
    
    def connectRedis(h,pt,pw):
        try:
            r = redis.Redis(host=h, port=pt, password=pw) # host后的IP是需要连接的ip,本地是127.0.0.1或者localhost
            print("Redis connection successful...")
            return r
        except:
            print("Redis connection refused...")
            return "error"
    
    if __name__ and "__main__":
        redis = connectRedis('47.105.196.123', 6379, "QNzs@.root_1347908642")
    

    3.1.2、创建 StrictRedis 链接对象

    from redis import StrictRedis
    
    def connectRedis(h,pt,pw):
        try:
            r = StrictRedis(host=h, port=pt, password=pw)
            print("Redis connection successful...")
            return r
        except:
            print("Redis connection refused...")
            return "error"
    
    if __name__ and "__main__":
        redis = connectRedis('47.105.196.123', 6379, "QNzs@.root_1347908642")
    

    3.1.3、创建 ConnectionPool 连接池 链接对象

    from redis import StrictRedis, ConnectionPool
    
    def connectRedis(h,pt,pw):
        try:
            pool = ConnectionPool(host=h, port=pt, password=pw)
            r = StrictRedis(connection_pool=pool)
            print("Redis connection successful...")
            return r
        except:
            print("Redis connection refused...")
            return "error"
    
    if __name__ and "__main__":
        redis = connectRedis('47.105.196.123', 6379, "QNzs@.root_1347908642")
    

    3.1.4、创建 ConnectionPool 连接池 链接 url 对象

    from redis import StrictRedis, ConnectionPool
    
    def connectRedis(h,pt,pw):
        try:
            url = "redis://:"+pw+"@"+h+":"+str(pt)+"/0"
            pool = ConnectionPool.from_url(url)
            r = StrictRedis(connection_pool=pool)
            print("Redis connection successful...")
            return r
        except:
            print("Redis connection refused...")
            return "error"
    
    if __name__ and "__main__":
        redis = connectRedis('47.105.196.123', 6379, "QNzs@.root_1347908642")
    

    3.2、常用方法

    示例说明结果
    redis.dbsize()获取当前数据库中key的数目返回长度
    redis.keys(’*’)获取所有符合规则的key返回列表
    redis.exists(key)判断一个key是否存在返回 1 存在
    redis.set(‘name’, ‘value’)给数据库中key为name的string赋予值value返回 True 成功
    redis.get(‘name’)返回数据库中key为name的string的value返回 name 的值
    redis.type(‘XY_KEY_Name’)判断key类型返回类型
    redis.rename(‘name1’, ‘name2’)将name1重命名为name2返回 True 成功
    redis.delete(‘name’)删除名为name的key返回 1 成功
    redis.flushdb()删除当前选择数据库中的所有key返回 True 成功
    redis.flushall()删除所有数据库中所有的key返回 True 成功

    3.3、源码

    把上述的常用方法都写到一个python3的源代码中,如下:

    def connectRedis(h,pt,pw):
        try:
            # import redis
            # r = redis.Redis(host=h, port=pt, password=pw) # host后的IP是需要连接的ip,本地是127.0.0.1或者localhost
    
            # from redis import StrictRedis
            # r = StrictRedis(host=h, port=pt, password=pw)
    
            from redis import StrictRedis, ConnectionPool
            # pool = ConnectionPool(host=h, port=pt, password=pw)
            url = "redis://:"+pw+"@"+h+":"+str(pt)+"/0"
            print(url)
            pool = ConnectionPool.from_url(url)
            r = StrictRedis(connection_pool=pool)
    
            print("Redis connection successful...")
            return r
        except:
            print("Redis connection refused...")
            return "error"
    
    if __name__ and "__main__":
        redis = connectRedis('47.105.196.123', 6379, "QNzs@.root_1347908642")
        if redis != "error":
            # 获取当前数据库中key的数目
            dbSize = redis.dbsize()
            print("dbSize:", dbSize)
    
            # 获取所有符合规则的key
            list = redis.keys('XY_KEY_20181229083554_*')
            print("Rule-compliant size:", len(list))
            print("Rule-compliant key:", list)
    
            # 判断一个key是否存在
            key = "XY_KEY_20181229083554_L400000093"
            isExists = redis.exists(key)
            if isExists == 1:
                print("Is exists:", key)
            else:
                print("Non-existent:", key)
    
            # 给数据库中key为name的string赋予值Sha Shi Di
            redis.set('XY_KEY_Name', 'Sha Shi Di')
    
            # 返回数据库中key为name的string的value
            name = redis.get('XY_KEY_Name')
            print("Name:", name)
    
            # 判断key类型
            type = redis.type('XY_KEY_Name')
            print("Type:", type)
    
            # 将XY_KEY_Name重命名为XY_KEY_NickName
            rename_result = redis.rename('XY_KEY_Name', 'XY_KEY_NickName')
            print("Rename_result:", rename_result)
    
            # 删除XY_KEY_NickName这个key
            delete_result = redis.delete('XY_KEY_NickName')
            if delete_result == 1:
                print("Delete_result successful")
            else:
                print("Delete_result refused")
    
            # 删除当前选择数据库中的所有key
            # delete_current_db_key_result = redis.flushdb()
            # print("Delete_current_db_key_result:", delete_current_db_key_result)
    
            # 删除所有数据库中所有的key
            # delete_all_db_key_result = redis.flushall()
            # print("Delete_all_db_key_result:", delete_all_db_key_result)
    

    3.4、效果图

    在这里插入图片描述

    4、源码分享Github

    https://github.com/ShaShiDiZhuanLan/Demo_SQL_Python

    展开全文
    u014597198 2019-06-13 17:06:17
  • 传统的文件系统中,需要维护目录的层次...使用数据库来保存这些元数据的key-value对是一个不错的选择,相比传统的关系型数据库,key-value数据库在这方面更贴近应用需求,因为,保存元数据的数据库往往不会有复杂的关

           传统的文件系统中,需要维护目录的层次结构,使用dentry,inode,directory等复杂结构保存元数据的信息;而面对更多定制文件系统的需求,越来越多的系统考虑使用key-value形式保存文件系统中的元数据信息。使用数据库来保存这些元数据的key-value对是一个不错的选择,相比传统的关系型数据库,key-value数据库在这方面更贴近应用需求,因为,保存元数据的数据库往往不会有复杂的关系操作,仅仅需要提供高效的读写性能,可靠性和持久化。

    Berkeley DB

    比较经典的key-value数据库,C语言开发,能够提供较高的读写性能,支持海量存储应用,数据库自身实现了备份机制,支持两种备份开发机制,接口简单。开源,但是貌似现在没有人维护了,据说在持久化上做得不太好。

     

    SQLite

    1. ACID事务
    2. 零配置 – 无需安装和管理配置
    3. 储存在单一磁盘文件中的一个完整的数据库
    4. 数据库文件可以在不同字节顺序的机器间自由的共享
    5. 支持数据库大小至2TB
    6. 足够小, 大致3万行C代码, 250K
    7. 比一些流行的数据库在大部分普通数据库操作要快
    8. 简单, 轻松的API
    9. 包含TCL绑定, 同时通过Wrapper支持其他语言的绑定
    10. 良好注释的源代码, 并且有着90%以上的测试覆盖率
    11. 独立: 没有额外依赖
    12. Source完全的Open, 你可以用于任何用途, 包括出售它
    13. 支持多种开发语言,C, PHP, Perl, Java, ASP .NET,Python


    相关文章:http://www.sqlite.com.cn/


    Redis
    Redis是一个很新的项目。Redis本质上是一个Key-Value类型的内存数据库,很像memcached,整个数据库统加载在内存当中进行操作,定期通过异步操作把数据库数据flush到硬盘上进行保存。因为是纯内存操作,Redis的性能非常出色,每秒可以处理超过 10万次读写操作。Redis的出色之处不仅仅是性能,Redis最大的魅力是支持保存List链表和Set集合的数据结构,而且还支持对List进行各种操作,它的值可以是string,list,sets,或者是ordered sets。
    例如 从List两端push和pop数据,取List区间,排序等等,对Set支持各种集合的并集交集操作,此外单个value的最大限制是1GB,不像 memcached只能保存1MB的数据,因此Redis可以用来实现很多有用的功能,比方说用他的List来做FIFO双向链表,实现一个轻量级的高性 能消息队列服务,用他的Set可以做高性能的tag系统等等。另外Redis也可以对存入的Key-Value设置expire时间,因此也可以被当作一 个功能加强版的memcached来用。

    Redis的主要缺点是数据库容量受到物理内存的限制,不能用作海量数据的高性能读写,并且它没有原生的可扩展机制,不具有scale(可扩展)能力,要依赖客户端来实现分布式读写,因此Redis适合的场景主要局限在较小数据量的高性能操作和运算上。根据Redis的官网测试报告,50个并发请求,10w次访问,写速度为11x10e4/s,读速度为8100次/s.目前使用Redis的网站有 github,Engine Yard。

    基本数据类型介绍:http://www.cnblogs.com/xhan/archive/2011/02/02/1948891.html

    http://timyang.net/data/redis-misunderstanding/

     交互命令:http://redis.io/commands



    Tokyo Cabinet和Tokoy Tyrant
    TC和TT的开发者是日本人Mikio Hirabayashi,主要被用在日本最大的SNS网站mixi.jp上,TC发展的时间最早,现在已经是一个非常成熟的项目,也是Kye-Value 数据库领域最大的热点,现在被广泛的应用在很多很多网站上。TC是一个高性能的存储引擎,而TT提供了多线程高并发服务器,性能也非常出色,每秒可以处理 4-5万次读写操作。TC除了支持Key-Value存储之外,还支持保存Hashtable数据类型,因此很像一个简单的数据库表,并且还支持基于column的条件 查询,分页查询和排序功能,基本上相当于支持单表的基础查询功能了,所以可以简单的替代关系数据库的很多操作。TC/TT在mixi的实际应用当中,存储了2000万条以上的数据,同时支撑了上万个并发连接,是一个久经考验的项目。TC在保证了极高的并发读写性能的同时,具有可靠的数据持久化机制,同时还支持类似关系数据库表结构的hashtable以及简单的条件,分页和排序操作,是一个很棒的NoSQL 数据库。

    TC的主要缺点是在数据量达到上亿级别以后,并发写数据性能会大幅度下降,NoSQL: If Only It Was That Easy提到,他们发现在TC里面插入1.6亿条2-20KB数据的时候,写入性能开始急剧下降。看来是当数据量上亿条的时候,TC性能开始大幅度下降, 从TC作者自己提供的mixi数据来看,至少上千万条数据量的时候还没有遇到这么明显的写入性能瓶颈。Flare,是对TC和TT的改进,主要是支持可扩展性。

     

    MongoDB
    满足海量存储需求,Mongo主要解决的是海量数据的访问效率问题,根据官方的文档,当数据量达到50GB以上的时候,Mongo的数据库访问速度是MySQL的10 倍以上。Mongo的并发读写效率不是特别出色,根据官方提供的性能测试表明,大约每秒可以处理0.5万-1.5次读写请求

     

    CouchDB
    支持海量存储,CouchDB仅仅提供了基于HTTP REST的接口,因此CouchDB单纯从并发读写性能来说,是非常糟糕的。

     

    Cassandra

    满足高可扩展性和可用性的面向分布式计算的数据库,被看做是一个开源的google的big table。Facebook,twitter和digg.com都在使用Cassandra。Cassandra的主要特点就是它不是一个数据库,而是由一堆数据库节点共同构成的一个分布式网络服务,对Cassandra的一个写操作,会被 复制到其他节点上去,对Cassandra的读操作,也会被路由到某个节点上面去读取。对于一个Cassandra群集来说,扩展性能是比较简单的事情, 只管在群集里面添加节点就可以了。看到有文章说Facebook的Cassandra群集有超过100台服务器构成的数据库群集。Cassandra以单个节点来衡量,其节点的并发读写性能不是特别好,有文章说评测下来Cassandra每秒大约不到1万次读写请求,其并发性 能取决于整个系统的节点数量,路由效率,而不仅仅是单节点的并发负载能力。

     

    Voldemort

    和Cassandra类似,也是提供高可扩展性和可用性的面向分布式计算的数据库。Voldemort官方给出Voldemort的并发读写 性能也很不错,每秒超过了1.5万次读写。

     

    LevelDB

    google开发的数据库,LevelDB是一个嵌入式的key-value数据库。它的键和关联值可以是任意的字节数组,并且按照键值排序,排序机制是可以被重载的。数据存储机制非常简单,仅仅支持Put,Get和Delete命令,然后还有前向和后向迭代遍历。数据会自动使用Snappy压缩,这是一个压缩库,Google将其用于BigTable,MapReduce和RPC中,并且宣布开源。LevelDB也有一些局限:不支持 SQL查询和索引,支持多线程单进程访问,并且可以用于嵌入式设备。LevelDB优化了批量写操作。它将多个修改请求有序缓存在内存中,在累计到配置文件预设置的阈值之后再写入到磁盘中。对于顺序和随机写操作,以及顺序读操作来说,它的性能非常优秀,根据Google的性能基准测试,它能在某些测试项目中得分领先SQLite两个数量级。SQLite在随机读操作中比LevelDB稍好,而在写入较大数据的时候速度两倍快于LevelDB。LevelDB同样也表现得比Kyoto Cabinet优秀,Kyoto Cabinet也是一个key-value数据库,不过Google并没有像SQLite那样在所有测试项目中均进行比较。同样,Riak进行了一些测试对比LevelDB和InnoDB,在一些测试项目中,Google的LevelDB要比InnoDB要优秀或者能达到相同性能。LevelDB是使用C++编写,一些外部的依赖库已经成功地移植到Windows、Mac OS X、Android和各种Unix上。在实际的应用中,Chrome的一些实验性版本中已经使用了LevelDB,将其作为IndexDB API的实现。而Riak则将其用于节点级的存储。

     

    nosql

    常规关系型数据库仅仅支持每秒数千次或是数万次的访问,内存数据库的访问速度可以达到几万次到十多万次,支持高并发,海量存储,高可扩展性和高可用性

     

     

     

    参考资料:

    http://blog.csdn.net/21aspnet/article/details/6614013

    http://blog.evanweaver.com/articles/2009/07/06 /up-and-running-with-cassandra

    http://hb.qq.com/a/20110823/000019.htm

    http://www.docin.com/p-115838909.html

    http://www.iteye.com/topic/617156

    http://blog.s135.com/dtcc/

     

    展开全文
    yarsen 2014-03-07 15:00:21
  • Key-value数据库是一种以键值对存储数据的一种数据库,类似java中的map。可以将整个数据库理解为一个大的map,每个键都会对应一个唯一的值。Key-value数据库代表的有redis。Redis是一个Key-Value存储系统。和...

    1.1.1 NoSQL简介
           对于不了解NoSQL的人都会认为NoSQL为No SQL,即不是SQL。但是这种理解是错误的,NoSQL应该是Not Only SQL,翻译过来为不仅仅是SQL。从这个翻译中我们可以看出来,NoSQL仍然还是SQL。
    NoSQL是一场反SQL的革命性的数据库运动,在很早就有人提出来,但是一直没有很好地发展,直到互联网web2.0网站的兴起,传统的关系数据库在应付web2.0网站,特别是超大规模和高并发的SNS类型的web2.0纯动态网站已经显得力不从心,暴露了很多难以克服的问题,而非关系型的数据库则由于其本身的特点得到了非常迅速的发展。
    今天NoSQL泛指这样一类数据库和数据存储,它们不遵循经典关系型数据库(RDBMS)原理,且常与Web规模的大型数据集有关。
          1.1.2 NoSQL发展背景及优势
    随着互联网web2.0网站的兴起,传统的关系数据库在应付web2.0网站,暴漏许多问题,例如:
    1、 High performance - 对数据库高并发读写的需求
    web2.0网站要根据用户个性化信息来实时生成动态页面和提供动态信息,所以基本上无法使用动态页面静态化技术,因此数据库并发负载非常高,往往要达到每秒上万次读写请求。关系数据库应付上万次SQL查询还勉强顶得住,但是应付上万次SQL写数据请求,硬盘IO就已经无法承受了。其实对于普通的BBS网站,往往也存在对高并发写请求的需求。
    2、 Huge Storage - 对海量数据的高效率存储和访问的需求
    对于大型的SNS网站,每天用户产生海量的用户动态,以国外的Friendfeed为例,一个月就达到了2.5亿条用户动态,对于关系数据库来说,在一张2.5亿条记录的表里面进行SQL查询,效率是极其低下乃至不可忍受的。再例如大型web网站的用户登录系统,
    3、 High Scalability && High Availability- 对数据库的高可扩展性和高可用性的需求
    在基于web的架构当中,数据库是最难进行横向扩展的,当一个应用系统的用户量和访问量与日俱增的时候,你的数据库却没有办法像web server和app server那样简单的通过添加更多的硬件和服务节点来扩展性能和负载能力。对于很多需要提供24小时不间断服务的网站来说,对数据库系统进行升级和扩展是非常痛苦的事情,往往需要停机维护和数据迁移,为什么数据库不能通过不断的添加服务器节点来实现扩展呢?
    在上面提到的“三高”需求面前,关系数据库遇到了难以克服的障碍,而对于web2.0网站来说,关系数据库的很多主要特性却往往无用武之地,例如:
    1 数据库事务一致性需求
    2 数据库的写实时性和读实时性需求
    3 对复杂的SQL查询,特别是多表关联查询的需求
    因此,关系数据库在这些越来越多的应用场景下显得不那么合适了,为了解决这类问题的非关系数据库应运而生。
    NoSQL 是非关系型数据存储的广义定义。它打破了长久以来关系型数据库与ACID理论大一统的局面。NoSQL 数据存储不需要固定的表结构,通常也不存在连接操作。在大数据存取上具备关系型数据库无法比拟的性能优势。该术语在 2009 年初得到了广泛认同。
    NoSQL数据库有以下优点:
    1 简单的扩展
    2 快速的读写
    3 低廉的成本
    4 灵活的数据类型
    NoSQL虽然优点众多,但是它还是有缺点的,例如:
    1 不提供对SQL的支持

    2 产品混乱,许多缺乏厂商的支持


    Key-value数据库是一种以键值对存储数据的一种数据库,类似java中的map。可以将整个数据库理解为一个大的map,每个键都会对应一个唯一的值。Key-value数据库代表的有redis。Redis是一个Key-Value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)和zset(有序集合)。另外redis是一种内存型的数据库,所以可以对外提供很好地读写操作,但是同样也暴露出内存占用高,数据持久化不易等问题。

    展开全文
    a18826408828 2014-11-05 23:06:41
  • nowadaysall 2016-01-05 21:06:19
  • qq892618896 2016-04-21 16:11:30
  • yilovexing 2016-07-13 12:13:34
  • turkeyzhou 2010-11-21 01:06:00
  • 21aspnet 2011-07-18 13:45:12
  • OnlyQi 2013-03-14 14:46:35
  • blade2001 2010-08-12 19:09:00
  • gunri_tianjin 2018-10-20 18:00:53
  • lldouble 2018-05-30 09:31:47

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,301,464
精华内容 520,585
关键字:

value数据库