Redis

来源:互联网 发布:优化一个关键词多少钱 编辑:程序博客网 时间:2024/06/06 12:47

一 为什么要用NoSQL

1 简单网站架构
  一个简单的小型网站或者应用背后的架构可以非常简单, 数据存储只需要一个mysql instance就能满足数据读取和写入需求(这里忽略掉了数据备份的实例),处于这个时间段的网站,一般会把所有的信息存到一个database instance里面。由于网站的访问量不大,且大部分都是静态网页,动态交互不多的时候,单个数据库完全可以轻松应付。
这里写图片描述 

  这样的架构下,数据存储会遇到一些瓶颈:
1. 数据量的总大小 一个机器放不下时
2. 数据的索引(B+ Tree)一个机器的内存放不下时
3. 访问量(读写混合)一个实例不能承受

2 垂直拆分
  一般当V1.0 遇到瓶颈时,首先最简便的拆分方法就是垂直拆分,何谓垂直?就是从业务角度来看,将关联性不强的数据拆分到不同的instance上,从而达到消除瓶颈的目标。以图中的为例,将用户信息数据,和业务数据拆分到不同的三个实例上。对于重复读类型比较多的场景,我们还可以加一层cache,来减少对DB的压力。
  这里写图片描述

3 主从架构
  此类架构主要解决V2.0架构下的读问题,通过给Instance挂数据实时备份的思路来迁移读取的压力,在Mysql的场景下就是通过主从结构,主库抗写压力,通过从库来分担读压力,对于写少读多的应用,V3.0主从架构完全能够胜任
这里写图片描述

4 分表分库+水平拆分+MySQL集群
  在缓存,MySQL主从复制,读写分离的基础之上,MySQL主库的写压力开始出现瓶颈。都可以通过水平拆分来解决,水平拆分和垂直拆分有较大区别,垂直拆分拆完的结果,在一个实例上是拥有全量数据的,而水平拆分之后,任何实例都只有全量的1/n的数据,以下图Userinfo的拆分为例,将userinfo拆分为3个cluster,每个cluster持有总量的1/3数据,3个cluster数据的总和等于一份完整数据(注:这里不再叫单个实例 而是叫一个cluster 代表包含主从的一个小mysql集群)
这里写图片描述

5 MySQL的扩展性瓶颈
  MySQL数据库也经常存储一些大文本字段,导致数据库表非常的大,在做数据库恢复的时候就导致非常的慢,不容易快速恢复数据库。比如1000万4kb大小的文本就接近40GB的大小,如果能把这些数据从MySQL省去,MySQL将变得非常小。关系数据库很强大但是它并不能很好的应付所有的应用场景。MySQL的扩展性差(需要复杂的技术来实现),大数据下IO压力大,表结构更改困难,正是当前使用MySQL的开发人员面临的问题。

二 NoSQL的概念

  NoSQL(Not Only SQL),意即“不仅仅是SQL”,泛指非关系型的数据库。NoSQL数据库的产生就是为了解决大规模数据集多重数据种类带来的挑战,尤其是大数据应用难题,包括超大规模数据的存储。这些类型的数据存储不需要固定的模式,无需多余操作就可以横向扩展。
  特点如下:   

  • 易扩展:NoSQL数据库种类繁多,但是一个共同的特点都是去掉关系数据库的关系型特性。数据库之间无关系,这样就非常容易扩展,也无形之间在架构的层面上带来了可扩展的能力。
  • 大数据量高性能:NoSQL数据库都具有非常高的读写性能,尤其在大数据量下,同样表现优秀。一般Mysql使用的Query Cache,每次表的更新Cache就失效,是一种大粒度的Cache,在针对web2.0的交互频繁的应用,Cache性能不高。而NoSQL的Cache是记录级的,是一种细粒度的Cache,所以NoSQL在这个层面上来说就要性能高很多了。
  • 多样灵活的数据模型:NoSQL无需事先为要存储的数据建立字段,随时可以存储自定义的数据格式。而在关系数据库里,增删字段是件非常麻烦的事情,如果是非常大数据量的表,增加字段简直就是一个噩梦。

NoSQL数据库的四大分类

  • KV键值
  • 文档型数据库(bson格式比较多)
  • 列存储数据库
  • 图关系数据库

传统的ACID分别是什么:

  • A(Atomicity)原子性
      事务里的所有操作要么全部做完,要么什么都不做,事务成功的条件是事务里的所有操作都成功,只要有一个操作失败,整个事务就失败,需要回滚。比如从银行转账,从A账户转100元至B账户,分为两个步骤:1)从A账户转100块取100块;2)存入100块至B账户。这两个步骤要么一起完成,要么一起不完成,如果只完成了第一步,第二步失败,钱就会莫名奇妙的少了100块。
  • C(Consistency)一致性
      数据库要一直处于一致的状态,事务的运行不会改变数据库原本的一致性约束。
  • I(Isolation)独立性
      并发的事务之间不会相互影响,如果有一个事务要访问的数据正在被另一个事务修改,只要另外一个事务未提交,它所访问的数据就不受未提交事务的影响。比如现在有个交易是从A账户转100块至B账户,在这个交易还未完成的情况下,如果此时B查询自己的账户,是看不到新增加的100块的。
  • D(Durability)持久性
      持久性是指事务一旦提交后,它所做的修改将会永久的保存在数据库上,即使出现宕机也不会丢失。
      
    NoSQL的CAP+BASE:
    CAP:C (Consistency)强一致性,A(Availability)可用性,P(Partition tolerance)分区容错性。
    CAP理论的核心是:一个分布式系统不可能同时很好的满足一致性,可用性和分区容错性这三个需求,最多只能同时较好的满足两个
    因此,根据CAP原理,将NoSQL数据库分成了满足CA原则,满足CP原则和满足AP原则三大类:
    CA-单点集群,满足一致性,可用性的系统,通常在可扩展性上不太强大。(MySQL、Oracle)
    CP-满足一致性,分区容忍性的系统,通常性能不是特别高。(Redis,MongoDB)
    AP-满足可用性,分区容忍性的系统,通常可能对一致性要求低一些。(大多数网站架构的选择)

    由于当前的网络硬件肯定会出现延迟丢包等问题,所以分区容忍性是我们必须要实现的

BASE是为了解决关系数据库强一致性引起的问题而引起的可用性降低而提出的解决方案。
BASE其实就是基本可用(Basically Available),软状态(Software state)和最终一致(Eventually consistent)。
它的思想是通过让系统放松对某一时刻数据一致性的要求来换取系统整体伸缩性和性能上改观。因为大型系统往往由于地域分布和极高性能的要求,不可能采用分布式事务来完成这些指标,要想获得这些指标,BASE就是解决这个问题的办法。

Redis

Redis(REmote DIctionary Server)远程字典服务器,完全开源免费,用C语言编写,遵守BSD协议,是一个高性能的(key/value)分布式内存数据库,基于内存运行并支持持久化的NoSQL数据库,是当前最热门的NoSQL数据库之一,也被称为数据结构服务器。具有三个特点:

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

功能:

  • 内存存储和持久化:redis支持异步将内存中的数据写到硬盘上,同时不影响继续服务
  • 取最新N个数据的操作,如:可以将最新的10条评论的ID放在Redis的List集合里面
  • 模拟类似于HttpSession这种需要设定过去时间的功能
  • 发布、订阅消息系统
  • 定时器、计数器
原创粉丝点击