Redis学习

NoSQL数据库的四大分类

  • KV键值对(Redis)
  • 文档型数据库(bson,MongoDb)
  • 列存储数据库(分布式文件系统,HBase)
  • 图关系数据库(Infinite Graph)

传统数据库

  • Atomicity:原子性
  • Consistency:一致性
  • Isolation:独立性
  • Durability:持久性

NoSQL

  • Consistency:强一致性
  • Availability:可用性
  • Partition tolerance:分区容错性

CA:单点集群,满足一致性,可用性的系统,通常在可扩展性上不太强大

CP:满足一致性,分区容忍性的系统,通常性能不是特别高

AP:满足可用性,分区容忍性的系统,通常可能对一致性要求低一些。

BASE为了解决关系数据库强一致性引起的问题而引起的可用性降低而提出的解决方案

  • 基本可用(Basically Available)
  • 软状态(Soft state)
  • 最终一致(Eventually consistent)

分布式:不同的多台服务器上面部署不同的服务模块

集群:不同的多台服务器上面部署相同的服务模块

Redis的三个特点:

  • 支持数据的持久化,可以将内存中的数据保持在磁盘中
  • 不仅支持key-value类型,还提供list,set,zset,hash等数据结构
  • 支持数据的备份,即master-slave模式的数据备份

日志级别

  • debug
  • verbose
  • notice
  • warning

缓存策略

  • Volatile-lru(只对设置了过期时间的key)
  • Allkeys-lru
  • Volatile-random(只对设置了过期时间的key)
  • Alleys-random
  • Volatile-ttl(移除那些TTL值最小的key)
  • Noeviction(不进行移除)

RDB(Redis DataBase)

  • 在指定的时间间隔内将内存中的数据集快照写入磁盘

    • 1分钟内改了1w次
    • 5分钟内改了10次
    • 15分钟内改了1次
  • 劣势

    在一定间隔时间做一次备份,所以如果redis意外down掉的话,就会丢失最后一次快照后的所有修改

    Fork的时候,内存中的数据被克隆了一份,大致2倍的膨胀性需要考虑

AOF(Append Only File)

  • 以日志的形式来记录每一个写操作

  • Apendfsync

    Always:同步持久化,每次发生数据变更会被立即记录到磁盘,性能较差但是数据完整性比较好

    Everysec:出厂默认推荐,异步操作,每秒记录,如果一秒内宕机。有数据丢失

    No

Rewrite:AOF文件持续增长而过大时,会fork出一个新进程来将文件重写(先写临时文件最后rename)

  • 触发机制:默认配置是当AOF文件大小是上次rewrite之后大小的一倍且文件大于64M

事务:一个队列中一次性、顺序性、排他性的执行一系列命令

  • MULTI
  • discard
  • EXEC

悲观锁:锁整张表

乐观锁:版本号

主从复制:主机数据更新后根据配置和策略,自动同步到备机的master/slaver机制,master以写为主,slave以读为主

  • 主要用于读写分离和容灾恢复

常用三招

  • 一主二仆
  • 薪火相传
  • 反客为主(slaveof no one)

复制原理

  • slave启动成功连接到master后会发送一个sync命令
  • master接到命令启动后台的存盘进程,同时手机所有接收到的用于修改数据集命令。在后台进程执行完毕之后,master将传送整个数据文件到slave,以完成一次完全同步
  • 全局复制:slave服务在接收到数据库文件数据后,将其存盘并加载到内存中
  • 增量复制:Master继续将新的所有收集到的修改命令依次传给slave完成同步
  • 但是只要重新连接master,依次完全同步(全局复制)将被自动执行

哨兵模式:反客为主的自动版

  • 新建sentinel.conf
  • 配置哨兵:sentinel monitor 主机名 127.0.0.1 6379 1
  • 启动哨兵:redis-sentinel /文件路径/sentinel.conf

主从复制会出现复制延迟