不仅仅是SQL,泛指非关系型的数据库
产生原因:为了解决大规模数据集合多重数据种类带来的挑战,尤其是大数据的应用难题,包括超大规模数据的存储;
这些类型的数据存储不需要固定的模式,无需多余操作九可以横向扩展
(1)易扩展:
数据之间无关系,非常容易扩展
(2)大数据量高性能:
数据库结构简单,有非常高读写性能
(3)多样灵活的数据类型:
随时可以存储自定义的数据格式
(4)传统RDBMS VS NOSQL:
Redis:数据类型丰富,多功能
Memcache:专做高速缓存
Mongdb:文件
(1)KV
(2)Cache
(3)Persistence
3V:海量Volume、多样Variety、实时Velocity
3高:高并发、高可扩、高性能
(1)KV健值
(2)Bson:一种类似json的二进制形式的存储格式,支持内嵌的文档蚊香和数组对象
(3)列族:按列存储数据的,方便存储结构和半结构化结构
(4)图形
(1)KV健值:
(2)文档型数据库(bson格式比较多):
CouchDB
MongDB:基于分布式文件存储的数据库,旨在为web应用提供可扩展的高性能数据存储解决方案,介于关系数据库和非关系数据库中的产品
(3)列存储数据库:
Cassandra
HBase
分布式文件系统
(4)图关系数据库:放的是关系图,构建关系图谱;Neo4j,InfoGrid
(5)四者对比:
(1) 传统的ACID:
A(Atomicity) 原子性
C(Consistency) 一致性
I(Isolation) 独立性
D(Durability) 持久性
(2) CAP:
C:Consistency(强一致性)
A:Availability(可用性)
P:Partition tolerance(分区容错性)
(3) CAP的3进2:
一个分布式系统不可能同时很好的满足CAP,最多只能同时较好的满足两个
CA:传统Oracle数据库
AP:大多数网站架构的选择
CP:Redis、Mongodb
(4) BASE:
为了解决关系数据库强一致性引起的问题而引起的可用性降低而提出的解决方案
(1)Redis:Remote DIctionary Server(远程字典服务器)
(2)完全开源免费,C语言编写,遵守BSD协议,高性能的key/value分布式内存数据库,基于内存运行并支持持久化的NoSQL数据库,数据结构服务器
(1)Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以重新加载使用
(2)Redis不仅仅支持简单的key-value类型的数据,还支持list、set、zset、hash等数据结构的存储
(3)Redis支持数据的备份,即master-slave模式的数据备份
(1)内存存储和持久化:redis支持异步将内存中的数据写到硬盘上,同时不影响继续服务
(2)取最新N个数据的操作,比如可以将最新的10条评论的ID放在Redis的List集合里面
(3)模拟类似于HttpSession这种需要设定过期时间的功能
(4)发布、订阅消息系统
(5) 定时器、计数器
(1) linux下启动redis命令:
先切换到redis的bin目录下:cd /usr/local/bin
开启redis服务:redis-server /myredis/redis/conf 后面为配置文件位置
redis-cli -p 6379 6379为默认端口号,可以在conf文件修改
即启动redis
(2)单进程:单进程模式除了客户端的请求,对读写等事件的响应
通过epoll函数的包装完成,redis的实际处理速度完全依靠主进程的执行效率;
Epoll事linux内核为处理大批量文件描述符而做出改进的epoll,事linux下多路复用IO接口select/poll的增强版本,能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率
(3)默认有16个库(角标为0-15,默认为0号库):可用select 角标数字 切换到某个库
(4)dbsize:查看当前库的key的数量
Keys * :把当前库所有key类出来
FLUSHDB:删除当前库所有数据
FLUSHALL:删除素有库中的数据
(5)统一密码管理:16个库密码相同,要么都连上,要不一个都连不上
(6)redis索引都是从0开始
(7)默认端口是6379
(1)String(字符串):
基本上与Memcached一样的类型,一个key对应一个value
String类型是二进制安全的,即redis的string可以包含任何数据,比如jpg图片或者序列化的对象;
一个redis中字符串value最多可以是512M
(2)Hash(哈希,类似于java里面的Map):
Redis hash 是一个键值对集合,是一个string类型的field和value的映射表,hash特别适合于存储对象
类似于java里面的Map
(3)List(列表):
Redis列表事简单的字符串列表,按照插入顺序排序,可以添加一个元素到列表的头部或尾部,它底层实际是个链表
(4)Set(集合):
String类型的无序集合,通过HashTable实现的
(5)Zset(sorted set:有序集合):
和set一样页锁string类型的元素的集合,不允许重复;
不同的事每个元素都会关联一个double类型的分数
Redis正是通过分数来为及合作的成员进行从小到大的排序,zset的成员是唯一的,但是分数(score)却可以重复
(1)exists key的名字,判断某个key是否存在
(2)move key db:当前库不存在,被移动到了某个库
(3)expire key 秒钟:为给定的key设置过期时间
(4)ttl key:查看还有多少秒过期,-1表示永不过期,-2表示已经过期
(5)type key:查看你的key是什么类型
(1)单值单value
(2)set/get/del/append/strlen
(3)Incr/decr/incrby/decrby,一定要是数字才能加减
(4)getrange/setrange:
(5)setex(set with expire)键秒值/setnx(set if not exsit)
(6)mset/mget/msetnx:设置或者获取多个
(7)getset(先get再set)
(1)单值多value
(2)lpush/rpush/lrange
(3)lpop/rpop
(4)lindex,按照索引下标获得元素(从上到下)
(5)llen
(6)lrem key 删n个value
(7)ltrim key 开始index 结束index,截取指定范围内的值再赋值给key
(8)rpoplpush 源列表 目的列表
(9)lset key index value
(10)linsert key before/after 值1 值2
(11)是一个字符串链表,left、right都可以插入添加;
如果键不存在,创建新的链表
如果键已存在,新增内容;
如果键全移除,对应的键也消失了
链表的操作无论是头和尾效率都很高,但是对中间元素进行效率就很低
(1)单值多value
(2)sadd/smembers/slsmember
(3)scard:获取集合里面的元素个数
(4)srem key value :删除集合中元素
(5)srandmember key 某个整数(随机出几个数)
(6)spop key随机出栈
(7)smove key1 key1 在key1中某个值:将key1中某个值赋给key2
(8)数学集合类:
差集sdiff
交集sinter
并集sunion
(1)KV模式不变,但是V是一个键值对
(2)hset/hget/hmset/hmget/hgetall/hdel
(3)hlen
(4)hexists key 在key里面的某个值的key
(5)hkeys/hvals
(6)hincrby/hincrbyfloat
(7)hsetnx
(1)在set基础上,加一个score值,之前set是k1 v1 v2 v3,
现在zset是k1 score1 v1 score2 v2
(2)zadd/zrange
(3)zrangebyscore key 开始score 结束 score
(4)zrem key 某score下对应的value值,作用是删除元素
(5)zcard/zcount key score区间/zrank key values值,作用是获取下标值/zscore key对应值
(6)zrevrank key values值,作用是逆序获得下标值
(7)zrevrange
(8)zrevrangebyscore key 结束score 开始score
(1)Daemonize
(2)Pidfile
(3)Port
(4)tcp-backlog:
(5)Timeout
(6)Bind
(7)Tcp-keepalive:
(8)Loglevel:日志级别 debug、verbose、notice、warning
(9)Logfile:日志名字
(10)Syslog-enabled:是否把日志输出到系统日志中
(11)Syslog-ident:指定系统日志的指定标志
(12)Syslog-facility:指定系统日志设备,值可以是USER或LOCAL0-LOCAL7
(13)Databases:数据库个数
(1)save:
a. save 秒数 写操作次数
RDB是整个内存的压缩过的Snapshot,RDB的数据结构,,可以配置复合的快照触发条件
默认有三种:save 900 1(15分钟改变1次)
save 300 10(5分钟改变10次)
save 60 10000(1分钟改变1万次)
b.禁用RDB持久化策略:
只要不设置任何save指令,或者给savec传入一个空字符串
(2)Stop-writes-on-bgsave-error:如果保存出错,停止写操作,默认yes
(3)rdbcompression:
(4)rdbchecksum:
(5)dbfilename:rdb的文件名
(6)dir:目录
可以通过config set requirepass “密码” 来设置密码值
立即生效,需要 auth “密码“ 才能输入其他命令
(1)Maxclients:最大连接数量
(2)Maxmemory:最大内存
(3)Maxmemory-policy:
(4)Maxmemory-samples(默认5个):
(1)appendonly:默认为no,自己可以改为yes
(2)appendfilename:aof文件名
(3)Appendfsync:
Always:同步持久化,每次发送数据变更会立即记录到磁盘,,性能较差但是数据完整性较好
Everysec:出厂默认推荐,异步操作,每秒记录,如果一秒内断机,则有数据丢失
No
(4)No-appendfsync-on-rewrite:重写时是否可以运用Appendfsync,用默认no即可,保证数据安全性
(5)Auto-aof-rewrite-min-size:设置重写的基准值
(6)Auto-aof-rewrite-percentage:设置重新的基准值百分比
(1)rdb是什么:
在指定的时间间隔内将内存中的数据集快照写入磁盘,也就是Snapshot快照,它恢复时是将快照文件直接读取到内存里
Redis会单独创建(fork)一个子进程来进行持久化,会先将数据写入到一个临时文件中,待持久化过程都结束了,再用这个临时文件替换上次持久化好的文件;
整个过程中,主进程事不进行任何IO操作,这确保了极高的性能;
如果需要进行大规模数据的恢复,且对于数据恢复的完整性不是非常敏感,那rdb要比aof更加高效,rdb缺点是最后一次持久化的数据可能丢失
(2)Fork:
Fork的作用是复制一个与当前进程一样的进程,新进程的所有数据(变量、环境变量、程序计数器等)数值都和原进程一致,但是是一个全新的进程,并作为原进程的子进程
(3)rdb保存的是dump.rdb文件,配置位置在myredis.conf里面的SNAPSHOTTING里面
(4)如何出发RDB快照:
a.配置文件中默认的快照设置(可以拷贝备份文件dump.rdb后重新使用);
默认有三种:save 900 1(15分钟改变1次)
save 300 10(5分钟改变10次)
save 60 10000(1分钟改变1万次)
b.命令save或者bgsave:save只管保存,其他保存,全部阻塞;bgsave:redis会在后台异步进行快照操作,快照同时还可以相应客户端请求,可以通过lastsave获取最后一次执行快照的时间
c.执行flushall命令,也会产生dump.rdb但是里面是空的,毫无意义
(5)如何恢复:
将备份文件(dump.rdb)移动到redis的安装目录并启动服务即可
CONFIG GET dir获取目录
(6)优势:
适合大规模的数据恢复
对数据完整性和一致性要求不高
(7)劣势:
在一定时间间隔内做一次备份,如果redis意外down,就会丢失最后一个快照后的所有修改
Fork的时候,内存中的数据被克隆了一份,大致2倍的膨胀性需要考虑
(8)如何停止:
动态停止所有rdb保存规则的方法:redis-cli config set save “”
(9)小总结:
(1)是什么:
以日志的方式来记录每个写操作,将redis执行的所有写指令记录下来(读指令不记录),只许追加文件但不可以改写文件,redis启动之初会读取该文件重新构建数据,即redis重启后会根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作
(2)aof保存的是appendonly.aof文件
(3)redis-check-aof --fix appendonly.aof:修复错乱的aof文件
(4)配置位置:
(5)AOF启动/恢复/修复:
正常恢复:
异常恢复:
(6)Rewrite:
a.是什么:
b.重写原理:
c.触发机制:
(9)小总结:
可以一次执行多个命令,本质上一组命令的集合,一个事务中的所有命令都会序列化,按顺序地串行执行而不会被其他命令插入,不许加塞
在一个队列中,一次性、顺序性、排他性的执行一系列命令
(1)常用命令:
(2)正常执行:exec
(3)放弃事务:discard
(4)全体连坐:一个出错,全部失败
(5)冤头债主:只是出错的命令错误不成功
(6)watch监控:
a.悲观锁:
b.乐观锁:
c.CAS(Check And Set):
d.总结:
进程间的一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息
订阅/发布消息图:
主从复制,主机数据更新后根据配置和策略,自动同步到备机的master/slaver机制,Master以写为主,Slaver以读为主
(1)读写分离:
(2)容灾备份:
(1)配从库不配主库
(2)从库配置命令:slaverof 主库IP 主库端口
每次与master断开之后,都需要重新连接,除非配置进redis.conf文件
Info replication:查看本机信息
(3)修改配置文件细节操作:
拷贝多个redis.conf文件
开启daemonize yes
Pid文件名字
指定端口
Log文件名字
Dump.rdb名字
(4) 常用设置:
a.一个主机master,两个slaver:
如果主机挂掉,那么从机会等待主机重新连接;
如果从机断掉,那么从机需要重新用slaverof ip+端口 连接到主机
b.薪火相传:
上一个slaver是下一个slaver的master,slaver可以接收其他slaver的连接和同步请求,那么该slaver作为了链条中下一个master,可以有效减轻master的写压力
中途变更转向:会清楚之前的数据,重新建立拷贝最新的
Slaverof 新主库 新主库端口
c.反客为主:
slaverof no one 解除奴隶关系,使当前数据库停止与其他数据库的同步,转为主数据库
(1)定义:反客为主的自动版,能够从后台监控主机是否故障,如果故障了根据投票数自动将从库转换为主库
(2)具体使用:
启动哨兵:Redis-sentinel /usr/common/sentinel.conf目录根据自己配置 如果之前挂了的master重启回来,也将作为新master下的salver
(3)一组sentinel能同时监控多个master
复制延时:
由于所有写操作都是现在master上操作哦,然后同步更新到slaver上,所以从master同步到slaver机器有一定的延迟,当系统繁忙的时候,延迟问题会更加严重,slaver机器数量的增加也会是这个问题更加严重