关于NoSQL,Redis,CAP,分布式系统

Redis与NoSQL

Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。区别与传统的数据库系统,是NoSQL(Not Only SQL )的其中一种,除此之外常用NoSQL还有MongoDB, Elasticsearch, Solr和Cassandra等。

Redis支持的数据结构

Redis允许的value数据结构类型有5种:String(字符串)、List(列表)、Set(集合)、Hash(哈希)、Zset(有序集合)。

  • String类型:是最简单的类型(内部看是一个byte数组,最大上限是1G),用于存储二进制序列字符串,整数数据,浮点数据。
  • List类型:简单的字符串列表,按照插入顺序排序。可以添加一个元素到列表的头部(左边)或者尾部(右边)。
  • Set类型:是String类型的无序集合,集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。
  • Hash类型:是一个键值(key=>value)对集合,是一个String类型的field和value的映射表,hash特别适合用于存储对象。
  • Zset类型:zset 和 set 一样也是String类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。zset的成员是唯一的,但分数(score)却可以重复。

操作命令:增加,删除,查询,返回长度。

  • 增加操作:String(set、mset),List(lpush 、rpush),Set(sadd),Hash(hset、hmset),Zset(zadd)
  • 删除操作:String(del),List(lpop、rpop),Set(srem,spop),Hash(Hdel),Zset(zrem)
  • 查询操作:String(get),List(lrange),Set(smembers),Hash(hkeys,hvals,hgetall),Zset(zrange)
  • 返回长度操作:List(llen),Set(scard),Hash(hlen),Zset(zcard)。

Redis持久化

持久化就是把内存的数据写到磁盘中去,防止服务宕机了内存数据丢失。Redis 提供了两种持久化方式:RDB(默认) 和AOF 。

  • RDB:Redis DataBase缩写,功能核心函数rdbSave(生成RDB文件)和rdbLoad(从文件加载内存)两个函数。
  • AOF:Append-only file缩写,每当执行服务器(定时)任务或者函数时flushAppendOnlyFile 函数都会被调用,AOF写入保存,根据条件将 aof_buf 中的缓存写入到 AOF 文件,根据条件调用 fsync 或 fdatasync 函数,将 AOF 文件保存到磁盘中。
  • 比较:AOF文件比RDB更新频率高,优先使用AOF还原数据。AOF比RDB更安全也更大,但RDB性能比AOF要好。

redis

缓存穿透

一般的缓存系统,都是按照key去缓存查询,如果不存在对应的value,就应该去后端系统查找(比如DB)。一些恶意的请求会故意查询不存在的key,请求量很大,就会对后端系统造成很大的压力。这就叫做缓存穿透。如何避免:

  • 对查询结果为空的情况也进行缓存,缓存时间设置短一点,或者该key对应的数据insert了之后清理缓存。
  • 对一定不存在的key进行过滤。可以把所有的可能存在的key放到一个大的Bitmap中,查询时通过该bitmap过滤。

缓存雪崩:当缓存服务器重启或者大量缓存集中在某一个时间段失效,这样在失效的时候,会给后端系统带来很大压力。导致系统崩溃。应该使用加锁或者队列控制读写缓存线程的数量,或者使用二级缓存,让缓存失效的时间点尽量均匀。

CAP理论与分布式系统

CAP原则又称CAP定理,指的是在分布式系统的设计中,没有一种设计可以同时满足 Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性)3个特性。

  • 一致性(C):在分布式系统中的所有数据备份,在同一时刻是否同样的值。(等同于所有节点访问同一份最新的数据副本)
  • 可用性(A):在集群中一部分节点故障后,集群整体是否还能响应客户端的读写请求。(对数据更新具备高可用性)
  • 分区容忍性(P):以实际效果而言,分区相当于对通信的时限要求。系统如果不能在时限内达成数据一致性,就意味着发生了分区的情况,必须就当前操作在C和A之间做出选择。

分区容错无法避免,因此可以认为 CAP 的 P 总是成立。CAP 定理告诉我们,剩下的 C 和 A 无法同时做到。

  1. 对于单机单库系统,数据一致性可通过关系型数据库的事务来满足,而且ACID特性中的C是指强一致性,各数据库本身都支持,而且很成熟。
  2. 分布式系统则需要以BASE理论作为指导,即以基本可用性和最终一致性作为目标。
  3. 远程RPC调用是一致性问题主要原因,异步解耦+消息队列可作为分布式系统满足最终一致性的优秀方案。

补充

MongoDB是一个基于分布式文件存储的数据库,它是一个介于关系数据库和非关系数据库之间的产品,其主要目标是在键/值存储方式(提供了高性能和高度伸缩性)和传统的RDBMS系统(具有丰富的功能)之间架起一座桥梁,它集两者的优势于一身。