目录
NoSQL的简单介绍
NoSQL:一类新出现的的数据库,它的特点:
1.不支持SQL语法;
2.存储结构与传统关系型数据库中的那种关系表完全不同,NoSQL中的存储的数据都是KV形式;
3.NoSQL的世界中没有一种通用的语言,每个NoSQL数据库都有自己的API和语法,擅长的业务场景;
4.NoSQL中的产品种类:
(1)MongoDB,文档型NoSQL数据库,擅长CMS系统(内容管理系统)
(2)Redis,内存数据库,数据结构服务器,号称瑞士军刀(精巧),功能强大,轻量级
(3)HBase,hadoop生态系统中原生的一种NoSQL数据库,重量级的分布式NoSQL数据库,用于存储海量数据
(4)Cassandra,hadoop生态系统中原生的一种分布式NoSQL数据库,后起之秀
NoSQL 和SQL数据的比较:
1.适用的场景不同,SQL数据库适用于关系特别复杂的数据查询场景,NoSQL反之
2.“事务”特性的支持:SQL对事务的支持非常完善,而NoSQL基本不支持事务(Redis部分支持事务)
3.两者在不断的取长补短,呈现融合趋势
1.Redis概念
REmote Dlctionary Server(Redis)是一个由 Salvatore Sanfilippo写的开源的、高性能的、使用ANSI C语言编写,遵守BSD协议、支持网络、可基于内存亦可持久化的日志型,key-value存储系统,并提供多种语言的API。
Redis常被称作是一款key-value内存存储系统或者内存数据库,同时支持丰富的数据结构,又被称作为一种数据结构服务器,因为其值可以是字符串(String),哈希(Map),列表(list),集合(sets),有序集合(sorted sets)等类型。
Redis与其他key_value缓存产品的3个特点:
1.Redis支持数据的持久化,可以将内存中的数据存储到磁盘,下次启动后再加载到内存中
2.Redis支持不仅是简单的key_value类型的数据,value的值还可以是list,set,hash,zset等其他复杂数据结构
3.Redis支持数据的备份,即master-slave模式的数据备份。
2.Redis优势
1.性能极高:Redis能读的速度是110000次/s,写的速度是81000次/s;
2.丰富的数据类型:Redis支持二进制案例的String,List,Hash,Set及Sorted Set数据类型操作;
3.原子操作:Redis的所有操作都是原子性的,同时Redis还支持几个操作合并后的原子性执行;(是否完全支持事务待定)
4.丰富的特性:Redis还支持Publish/Subscribe,通知key过期,支持高可用集群等特性;
5.数据持久化机制:
持久化机制有两种:
1.RDB方式:定期将内存数据dump到磁盘
2.AOF(append only file)持久化机制:用记日志的方式记录每一条数据更新操作,一旦出现灾难事件,可以通过日志重放来恢复整个数据库
3.Redis 适用场景
1.TopN需求:取最新的n个数据,如读取作家博客最新的50篇文章,通过List实现按时间排序的数据的高效获取
2.排行榜应用:以特定条件为排序标准,将其设成sorted set的score,进而实现高效获取
3.需要精准设定过期时间的应用:把sorted set 的 sorted 值设置成过期时间的时间戳,那么就可以简单地通过过期时间排序,定时清除过期数据
4.计数器应用:Redis的命令都是原子性的,可以轻松地利用INCR,DECR命令来构建计数器系统
5.去除大量数据中的重复数据:将数据放入set中,就能实现对重复数据的排除
6.构建队列系统:使用list 可以构建队列系统,使用sorted set 甚至 可以构建有优先级的队列系统
7.实时系统,反垃圾系统:通过上面说到的 set 功能,你可以知道一个终端用户是否进行了某个操作,可以找到其操作的集合并进行分析统计对比等
8.Publish/SubScribe构建实时消息系统
9.缓存(会话,商品列表,评论列表,经常查询的数据等)
4.Redis存储的数据结构详解
String--字符串
String是Redis最基本的类型,一个key对应一个value,String类型是二进制安全的,可以包含任何数据比如JPG图片或者序列化对象, 一个键最大能存储512M
操作命令
List--列表
Redis列表是简单的字符串列表,按照插入顺序排序。可以添加一个元素到列表的头部或者尾部
操作命令
典型需求:
任务调度系统:
生产者不断产生任务,放入task-queue排队, 消费者不断拿出来任务来处理,同时放入一个temp-queue暂存,如果任务处理成功,则清除temp-queue,否则,将任务弹回task-queue。
Set--集合
Redis的Set是string类型的无序集合
集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)
ZSet--有序集合
ZSet 和 Set 一样也是String 类型元素的集合,且不允许重复的成员。
不同的是每个元素都会关联一个double类型的分数。Redis 正是通过分数来为集合中成员进行从小到大的排序。
ZSet的成员是唯一的,但分数(score)却可以重复。
Hash--哈希表
Redis Hash 是一个键值对集合
Redis Hash类型可以看成具有 String Key 和 String Value 的 map 容器
Redis Hash是一个 String 类型的field 和value 的映射表,Hash 特别适合用存储对象。
键值相关命令
服务器相关命令
5.Redis事务
可以一次执行多个命令,本质是一组命令的集合。一个事务中的所有命令都会序列化,按顺序地串行化执行而不会被其他命令插入,不需加塞(隔离性)
命令:
discard:取消事务放弃执行事务块内的所有命令
exec:执行事务块内的命令
multi:标记一个事务块开始
unwatch:取消watch 对所有key的监视
watch:监视一个或多个key,如果在事务执行之前被其他命令所改动,那么事务将被打断
Redis事务执行过程中不保证原子性:Redis 同一个事务中如果一条命令执行失败,其后命令仍然会被执行,没有回滚。
运行前监测中,事务中间一条命令语法写错了,则全部撤销
运行时报出异常,只撤销异常的语句
6.Redis高可用
在Redis中,实现高可用的技术主要包括持久化、复制、哨兵、集群
持久化
将数据保存在硬盘中,保证数据不会因进程退出而丢失。
主从复制
复制是高可用Redis的基础,哨兵和集群都是在复制基础上实现的高可用,复制主要实现了数据的多机备份,以及对于读操作的负载均衡和简单的故障恢复。缺陷:故障恢复无法自动化;写操作无法负载均衡,存储能力受到单机的限制。
哨兵
哨兵在复制的基础上,哨兵实现了自动化的故障恢复。缺陷:写操作无法负载均衡,存储能力受到单机的限制。
集群
通过集群,Redis解决了写操作无法负载均衡,以及存储能力受到单机限制的问题,实现了较为完善的高可用方案。
Redis持久化
Redis持久化分为RDB持久化和AOF持久化:
RDB:将Redis在内存中的数据库记录定时dump到磁盘上;
AOF:将Redis的操作日志依次以追加的方式写入到磁盘文件中;
RDB方式
有2个触发条件:
1.手动方式
2.自动触发
AOF方式
AOF 比快照方式有更好的持久化性,是由于在使用 AOF 持久化方式时,Redis 会将每一个收
到的写命令都通过 write 函数追加到文件中(默认是 appendonly.aof)。当 Redis 重启时会通过
重新执行文件中保存的写命令来在内存中重建整个数据库的内容。
当然由于 os 会在内核中缓存 write 做的修改,所以可能不是立即写到磁盘上。这样 AOF 方
式的持久化也还是有可能会丢失部分修改。不过我们可以通过配置文件告诉 redis 我们想要
通过 fsync 函数强制 os 写入到磁盘的时机。有三种方式如下(默认是:每秒 fsync 一次):
两种持久化方式的总结:
相同数据集的数据 AOF文件要远大于 rdb 文件,恢复速度慢于 rdb
AOF 运行效率要慢于 rdb,每秒同步策略效率较好,不同步效率和 rdb 相同
Redis 还能对 AOF 文件进行后台重写,使得 AOF 文件的体积不至于过大
Redis主从复制
特点:
过程:
配置slave服务器只需要在配置文件中加入如下配置:
slaveof hadoop02 6379 #指定 master 的 ip 和端口
Redis哨兵
一种高可用的redis部署方案。在集群中的redis-master服务挂掉时,无需人为干预,即可通过哨兵集群的自我调 整,实现redis服务的持续可用。
哨兵的作用:
1、监控redis进行状态,包括master和slave
2、当master down机,能自动将slave切换成master
一般情况下哨兵和主从复制一起使用,保证Redis的高可用
Redis分布式集群
架构细节:
1、所有的 redis 节点彼此互联(ping-pong 机制),内部使用二进制协议优化传输速度和带宽。
2、节点的 fail 是通过集群中超过半数的节点检测失效时才生效。
3、客户端与 redis 节点直连,不需要中间 proxy 层。客户端不需要连接集群所有节点,连接集
群中任何一个可用节点即可。
4、redis-cluster 把所有的物理节点映射到[0-16383]slot 上,cluster 负责维护 node <-> slot <->
value
Redis 集群中内置了 16384 个哈希槽,当需要在 Redis 集群中放置一个 key-value 时,redis 先
对 key 使用 CRC16 算法算出一个结果,然后把结果对 16384 求余数,这样每个 key 都会对应
一个编号在 0-16383 之间的哈希槽,redis 会根据节点数量大致均等的将哈希槽映射到不同的
节点
Redis 容错:
1、 投票过程是集群中所有 master 参与,如果半数以上 master 节点与 master 节点通信超时
(cluster-node-timeout),认为当前 master 节点挂掉.
2、 什么时候整个集群不可用(cluster_state:fail)?如果集群任意 master 挂掉,且当前 master
没有 slave.集群进入 fail 状态,也可以理解成集群的 slot 映射[0-16383]不完整时进入 fail
状态。redis-3.0.0.rc1 加入 cluster-require-full-coverage 参数,默认关闭,打开集群兼容部
分失败。如果集群超过半数以上 master 挂掉,无论是否有 slave,集群进入 fail 状态。
附录Redis.conf配置文件参数说明