NoSQL数据库简介:
特点:
1.数据结构灵活易扩展
2.大数据量高性能,得益于无关系性和结构简单
3.高可用
4.细粒度的缓存,不易导致失效。
分类:
1.KV键值:Redis,Memcache
2.文档型:MongoDB
3.列存储
4.图关系
分布式系统的CAP理论
C:强一致性,A:可用性,P:分区容错性。只可3取2,不可兼得。
CA:比如传统关系型数据库。AP:大多数网站架构。CP:NoSQL数据库如redis。
BASE:基本可用+软状态+最终一致。由于大型系统的地域分布和极高的性能要求,不可能采用分布式事物,以弱一致性换取性能。
redis:
(属于NoSQL数据库,且是分布式的,去中心化的集群服务(hash取余的方式判断每个key所在的节点)。用主从复制来增强可用性)
1.redis常用数据类型:
string/list/set/hashMap/zset
2.redis过期策略和内存淘汰策略
过期策略:(只针对设置了过期时间的key)
1.到期立即过期。对每个设置过期时间的key都创建一个定时器,到期就立即清理此key.
2.定期过期(推荐)。周期性扫描expires字典中的key,并清除其中已过期的key。
如果其中的过期key超过一定比例就进行连续扫描清除动作,直至比例阀值之下。
3.惰性过期。只有再次访问此key时才判断是否过期处理。有内存泄漏风险。
内存淘汰策略:(当存储的key:value数据超过了配置给redis的最大内存阀值时)
1.volatile-lru:对设置了过期时间的key执行LRU策略进行删除
2.allkeys-lru:对所有的key执行LRU策略进行删除
3.volatile-random:对设置了过期时间的key执行随机删除
4.allkeys-random:对所有的key执行随机删除
5.volatile-ttl:对设置了过期时间的key,找出剩余生存时间最少的key进行删除。
6.noeviction:新写入操作直接拒绝并报错。
备注常识:
LRU策略:最近的执行命令中最少使用到的数据将被替换出局。并非总的使用概率最少,因为算法中不做全局统计。
3.redis持久化策略:
RDB策略:指定时间间隔内将当前数据集快照写入磁盘dump.rdb文件。
1.触发(默认):
1分钟改1万次,
或5分钟改10次,
或15分钟改1次。
或退出进程时。
2.文件(dump.rdb)过大时可指定是否压缩
3.特点:
有丢失数据,易大规模数据恢复,比AOF高效。持久化时大致2倍的内存膨胀。
AOF策略:以日志的形式来记录每个写操作,appendonly.aof文件只追加不可以改写。
1.触发:
每次写操作都追加日志
每秒批量追加一次(推荐:减少的io流)
不写
2.文件(appendonly.aof)过大时可指定重写策略:
此刻文件已达上次重写时2倍且大于64MB
原理:fork一个新进程,遍历内存中的每条记录为一条set语句到新aof文件,最后替换掉久aof文件。
3.特点:
aof文件远大于rdb文件,有1秒内的数据丢失。
总结:
1.RDB和AOF可同时使用,且AOF优先于RDB。推荐搭配使用,RDB作为万一手段
2.只做缓存使用时可都不用这两个持久化功能。
4.redis事务:(部分支持事务)
事务执行情况:
1.正常执行:没有错误、异常、未被篡改
2.放弃事务:DISCARD命令
3.全体连坐:提交的命令立马抛出检查时异常(即redis不支持命令),提交事务时全体命令不会执行。
4.冤头债主:提交的命令在实际执行时报错(如对字符串累加操作),提交事务时只有正确的命令会执行成功。
5.监控:如果开始事务前对某些key进行了监控,则从监控开始到提交事物的过程中它们被篡改,那么事物提交时就全体回滚。
涉及命令:WATCH key[key ...] 在事务开启前监控某些key,直到事物提交之前若它们被篡改,则事务提交时就全体回滚。
UNWATCH:取消对所有key的监控。
MULTI:标记一个事务块的开始。
EXEC:执行所有事务块的命令。同时取消所有监控。
DISCARD:取消事务,放弃执行事务块内的所有命令。
5.redis主从复制:
1.默认自己是主机。只有在配置文件里指定了谁(ip+port)是主机时或被哨兵监控时,自己才作为备机运行。
2.备机不对外提供写入服务,否则会报错的。
3.相关命令:
slaveof IP:端口 :指定要跟随的主机地址。之后就同步主机的数据。此时自己也可以有下一个跟随的备机,串联起来。
slaveof no one : 停止与其它数据库的同步,自己成为一个新的独立主机。
4.复制原理:
第一次链接到主机时全量复制,后续增量复制。
有复制延时。
5.哨兵模式:
单独启动哨兵机器,由它监控主机和备机。
当主机宕机后,它组织备机互相选举出新主机,然后剩下的备机跟着新的主机混。
当旧的主机修复重启后也跟着新的主机混,除非它使用slaveof no one命令来自立门户,成为一个新的独立主机。