什么是 Nosql,Redis 在其中扮演着什么样的角色?

什么是 Nosql,Redis 在其中扮演着什么样的角色?

1 个解决方案

AllenJiang
中间件研发,关注微信公众号 : 小哈学Java, 回复"666", 即可免费领取10G学习&面试资料

先说说关系型数据库与 Nosql

什么是 nosql?

解释:NoSQL 称作 Not Only SQL 的缩写,是对不同于传统的关系型数据库的数据库管理系统的统称。

  • 相对于 nosql, 关系型数据库有着复杂的查询

  • 伸缩性

在传统的关系型数据库,随着系统业务的拓展,系统需要扩容,一般都是纵向的形式进行拓展,操作性能也开始遇到瓶颈。

  • 传统型数据库遵循 ACID 原则,而 nosql 大部分情况下为分布式而生,而分布式又遵循着 CAP 定理。

补充:ACID 原则, 即:

A (Atomicity) 原子性

C (Consistency) 一致性

I (Isolation) 独立性

D (Durability) 持久性


CAP 原则

一致性 (Consistency) (所有节 点在同一时间具有相同的数据)

可用性 (Availability) (保证每个请求不管成功或 者失败都有响应)

分隔容忍 (Partition tolerance) (系统中任意信息的丢失或失败不会影响系统的继续运作)

nosql 分类

我们按照存储结构来区分,大致有 4 类:

典型 nosql 举例存储结构
redis键值对(key-value)
Hbase宽列 (wide column)
mongdb文档 (document)
Neo4j图 (graph)

Redis 介绍

Redis 是一个由 Salvatore Sanfilippo 写的 key-value 存储系统。 Redis 是一个开源的使用 ANSI C 语言编写、遵守 BSD 协议、支持网络、可基于内存亦可持 久化的日志型、Key-Value 数据库,并提供多种语言的 API。 它通常被称为数据结构服务器,因为值 (value) 可以是 字符串 (String), 哈希 (Map), 列表 (list), 集合 (sets) 和 有序集合 (sorted sets) 等类型。

Github 源码:https://github.com/antirez/redis

Redis 官网:https://redis.io/

总结:

完全开源免费的、高性能的 key-value 数据库.支持数据持久化、支持多种数据结构存储。

适用场景:

存储缓存、投票、会话 session、排行榜、计数器、发布订阅等.

下面总结下互联网中 Redis 常用的方案

1.redis 单机版

redis 单机版在传统型企业项目,以及一些并发量不高互联网项目都有应用到。搭建方便的同时,痛点也很明显:

  • 内存容量有限
  • 处理能有有限
  • 无法高可用

2.Redis 多机版(主流方案)

特性:

  • 复制 Replication (拓展系统读的能力)
  • 哨兵 Sentinel (为服务提供高可用特性,减少故障机出现)
  • 集群 Cluster (通过增加机器,能够提高性能读写能力和存储以及提供高可用特性)

什么是 redis 的复制,哨兵以及集群?

1.复制

Redis 的复制 (replication) 功能允许用户根据一个 Redis 服务器来创建任意多个该服务器的复制品,其中被复制的服务器为主服务器 (master),而通过复制创建出来的服务器复制品则为从服务器 (slave)。 只要主从服务器之间的网络连接正常,主从服务器两者会具有相同的数据,主服务器就会一直将发生在自己身上的数据更新同步给从服务器,从而一直保证主从服务器的数据一致性。

特点:

  • master/slave 角色
  • master/slave 数据一致性得到保证
  • 降低 master 读压力,转交给从库

问题:

  • 无法保证高可用
  • 没有解决 master 写的压力

2.哨兵

Redis sentinel(哨兵)是一个分布式系统中监控 redis 主从服务器,并在主服务器下线时自动进行故障转移。其中包括三个特性:

  • 监控 (Monitoring): Sentinel 会不断地检查你的主服务器和从服务器是否运作正 常。

  • 提醒 (Notification): 当被监控的某个 Redis 服务器出现问题时, Sentinel 可以通 过 API 向管理员或者其他应用程序发送通知。

  • 自动故障迁移 (Automatic failover): 当一个主服务器不能正常工作时, Sentinel 会开始一次自动故障迁移操作。

特点:

  • 保证高可用
  • 监控各个节点
  • 自动故障迁移

缺点:

  • 主从模式,切换需要时间丢数据
  • 没有解决 master 写的压力

3.集群 (proxy 型)

Twemproxy 是一个 Twitter 开源的一个 redis 和 memcache 快速 / 轻量级代理服务器; Twemproxy 是一个快速的单线程代理程序,支持 Memcached ASCII 协议和 redis 协议。

特点:

  • 多种 hash 算法:MD5、CRC16、CRC32、CRC32a、hsieh、murmur、Jenkins - - 支持失败节点自动删除
  • 后端 Sharding 分片逻辑对业务透明,业务方的读写方式和操作单个 Redis 一致

缺点:

  • 增加了新的 proxy,需要维护其高可用。
  • failover 逻辑需要自己实现,其本身不能支持故障的自动转移 可扩展性差,进行扩缩容都需要手动干预

4.集群 (直连型)

特点:

  • 无中心架构 (不存在哪个节点影响性能瓶颈),少了 proxy 层。
  • 数据按照 slot 存储分布在多个节点,节点间数据共享,可动态调整数据分布。
  • 可扩展性,可线性扩展到 1000 个节点,节点可动态添加或删除。
  • 高可用性,部分节点不可用时,集群仍可用。通过增加 Slave 做备份数据副本
  • 实现故障自动 failover,节点之间通过 gossip 协议交换状态信息,用投票机制完成 Slave 到 Master 的角色提升。

缺点:

  • 资源隔离性较差,容易出现相互影响的情况
  • 数据通过异步复制, 不保证数据的强一致性

Note: 由于集群直连型是在 redis 3.0 后加入的特性,也就是说 3.0 之前用的代理模式较多。