zoukankan      html  css  js  c++  java
  • 【Redis】01 NoSQL概述 & Redis

    NoSQL概述:

    1、什么是NoSQL

    NoSQL 是 Not Only SQL 的缩写,意即"不仅仅是SQL"的意思,泛指非关系型的数据库。强调Key-Value Stores和文档数据库的优点。

    NoSQL产品是传统关系型数据库的功能阉割版本,通过减少用不到或很少用的功能,来大幅度提高产品性能

    2、NoSQL起源

    过去,关系型数据库(SQL Server、Oracle、MySQL)是数据持久化的唯一选择,但随着发展,关系型数据库存在以下问题。

    问题1:不能满足高性能查询需求
      我们使用:Java、.Net等语言编写程序,是面向对象的。
     但用数据库都是关系型数据库。存储结构是面向对象的,
     但是数据库却是关系的,所以在每次存储或者查询数据时,我们都需要做转换。
    类似Hibernate、Mybatis这样的ORM框架确实可以简化这个过程,但是在对高性能查询需求时,这些ORM框架就捉襟见肘了。 问题2:应用程序规模的变大 网络应用程序的规模变大,需要储存更多的数据、服务更多的用户以及需求更多的计算能力。
     为了应对这种情形,我们需要不停的扩展。 扩展分为两类: 一种是纵向扩展,即购买更好的机器,更多的磁盘、更多的内存等等。 另一种是横向扩展,即购买更多的机器组成集群。
    在巨大的规模下,纵向扩展发挥的作用并不是很大。 首先单机器性能提升需要巨额的开销并且有着性能的上限,在Google和Facebook这种规模下,永远不可能使用一台机器支撑所有的负载。
    鉴于这种情况,我们需要新的数据库,因为关系数据库并不能很好的运行在集群上

    3、NoSQL数据库类型

    ①键值(Key-Value)数据库[Redis/Memcached]
    适用场景:
    
    储存用户信息,比如会话、配置文件、参数、购物车等等。这些信息一般都和ID(键)挂钩,这种情景下键值数据库是个很好的选择。
    
    不适用场景:
    
    1.取代通过键查询,而是通过值来查询。Key-Value数据库中根本没有通过值查询的途径
    
    2.需要储存数据之间的关系。在Key-Value数据库中不能通过两个或以上的键来关联数据。
    
    3.事务的支持。在Key-Value数据库中故障产生时不可以进行回滚。
    ②面向文档(Document
    -Oriented)数据库[MongoDB] 数据可以使用XML、JSON或者JSONB等多种形式存储。 适用场景:1.日志 2.分析 不适用场景:不支持事务 ③列存储(Wide Column Store/Column-Family)数据库[HBASE] 列存储数据库将数据储存在列族(column family)中,一个列族存储经常被一起查询的相关数据。举个例子,如果我们有一个Person类,我们通常会一起查询他们的姓名和年龄而不是薪资。这种情况下,姓名和年龄就会被放入一个列族中,而薪资则在另一个列族中。 适用场景:1.日志 2.博客平台,我们储存每个信息到不同的列族中。举个例子,标签可以储存在一个,类别可以在一个,而文章则在另一个。 不适用场景:1.ACID事务 2.原型设计。在模型设计之初,我们根本不可能去预测它的查询方式,而一旦查询方式改变,我们就必须重新设计列族。 ④图(Graph-Oriented)数据库[Neo4J] 适用范围很小,主要用用网络拓扑分析 如脉脉的人员关系图等

    4、传统RDBMS VS NOSQL

     RDBMS

    - 高度组织化结构化数据
    
    - 结构化查询语言(SQL)
    
    - 数据和关系都存储在单独的表中。
    
    - 数据操纵语言,数据定义语言
    
    - 严格的一致性
    
    - 基础事务

     NoSQL

    - 代表着不仅仅是SQL
    
    - 没有声明性查询语言
    
    - 没有预定义的模式
    
    - 键 - 值对存储,列存储,文档存储,图形数据库
    
    - 最终一致性,而非ACID【原子,一致,隔离,持久】属性
    
    - 非结构化和不可预知的数据
    
    - CAP定理【一致性,可用性,容错性】
    
    - 高性能,高可用性和可伸缩性

    5、常见的NoSQL

    1、Memcached

    挥发性(临时性)的键值存储

    一般作为关系型数据库的缓存来使用

    具有非常快的处理速度

    由于存在数据丢失的可能,所以一般用来处理不需要持久保存的数据

    用于需要使用expires时(需要定期清除数据)

    使用一致性散列(Consistent Hashing)算法来分散数据

     2、Tokyo Tyrant

    持久性的键值存储

    用来处理需要持久保存,高速处理的数据

    具有非常快的处理速度

    用于不需要定期清除的数据

    使用一致性散列(Consistent Hashing)算法来分散数据

    3、Redis

    兼具Memcached和Tokyo Tyrant优势的键值存储

    擅长处理数组类型的数据

    具有非常快的处理速度

    可以高速处理时间序列的数据,易于处理集合运算

    拥有很多可以进行原子操作的方法

    使用一致性散列(Consistent Hashing)算法来分散数据

    4、MongoDB

    面向无需定义表结构的文档数据

    具有非常快的处理速度

    通过BSON的形式可以保存和查询任何类型的数据

    无法进行JOIN处理,但是可以通过嵌入(embed)来实现同样的功能

    使用sharding(范围分割)算法来分散数据

    Redis简介

    1、Redis简介

    Redis:Remote Dictionary Server(远程字典服务器)

    Redis是当前比较热门的NOSQL系统之一,它是一个开源的使用ANSI c语言编写的key-value存储系统(区别于MySQL的二维表格的形式存储。)。

    和Memcache类似,但很大程度补偿了Memcache的不足。

    和Memcache一样,Redis数据都是缓存在计算机内存中,不同的是,Memcache只能将数据缓存到内存中,无法自动定期写入硬盘,

    这就表示,一断电或重启,内存清空,数据丢失。

    所以Memcache的应用场景适用于缓存无需持久化的数据。

    而Redis不同的是它会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,实现数据的持久化 

    2、Redis的特点

    Redis读取的速度是110000次/s,写的速度是81000次/s
    
    原子 。Redis的所有操作都是原子性的,同时Redis还支持对几个操作全并后的原子性执行。
    
    支持多种数据结构:
    string(字符串);list(列表);hash(哈希),set(集合);zset(有序集合)
    
    持久化,主从复制(集群)
    
    支持过期时间,支持事务,消息订阅。
    
    官方不支持window,但是又第三方版本。

    3、Redis的应用场景

    1、数据缓存(提高访问性能) 
    将一些数据在短时间之内不会发生变化,而且它们还要被频繁访问,为了提高用户的请求速度和降低网站的负载,降低数据库的读写次数,就把这些数据放到缓存中。
    
    2、会话缓存
    (session cache,保存web会话信息)
    3、排行榜/计数器 (NGINX+lua+redis计数器进行IP自动封禁) 4、消息队列 (构建实时消息系统,聊天,群聊)
  • 相关阅读:
    证明欧几里得算法的正确性
    基础练习 十六进制转换八进制
    算法训练 关联矩阵
    寻找数组中最大值
    Torry的困惑(基本型)
    最小乘积(基本型)
    矩阵乘法
    SaltStack Char02 组件
    SaltStack Char01
    Python 学习手册, char 14
  • 原文地址:https://www.cnblogs.com/mindzone/p/13451402.html
Copyright © 2011-2022 走看看