zoukankan      html  css  js  c++  java
  • Redis-进阶

    NoSql 数据存储-Redis

    CAP

    CAP原则又称CAP定理,指的是在一个分布式系统中,一致性(Consistency)、高可用性(Availability)、分区容错性(Partition tolerance)。CAP 原则指的是,这三个要素最多只能同时实现两点,不可能三者兼顾。

    比如在我们双十一时肯定是优先保障AP,什么点赞浏览评论数根本可以不用一致,后面再一致也行(即BASE)。几百的评论点赞差别和服务器卡还是很容易选择的

     Linux下载安装Redis

    windox下载用工具移动到ubuntu的opt下面

    然后改变到root用户权限:su root

    再进opt下执行解压:tar -zxvf Redis名字.tar.gz

    然后就会多一个Redis名字文件夹,cd Redis名字

    执行: make
    Linux下安装完毕

    不建议执行 它的test文件

    建议先cp 它的.conf文件 到自己创建想使用的文件夹避免更改原厂配置

    cp redis.conf /MyRedis

    然后进入 vim /MyReds/redis.conf

    更改为:i,退出:wq

    找到General Redis默认不会后台运行所以需要设置一下设置为daemonize yes

    查看redis进程

    ps -ef|grep redis

    =================

    RDB

    1. 是什么:
      在指定的时间间隔内将内存中的数据集快照写入磁盘,
      也就是行话讲的Snapshot快照,它恢复时是将快照文件直接读到内存里
      Redis会单独创建(fork)一个子进程来进行持久化,会先将数据写入到
      一个临时文件中,待持久化过程都结束了,再用这个临时文件替换上次持久化好的文件。
      整个过程中,主进程是不进行任何IO操作的,这就确保了极高的性能
      如果需要进行大规模数据的恢复,且对于数据恢复的完整性不是非常敏感,那RDB方
      式要比AOF方式更加的高效。RDB的缺点是最后一次持久化后的数据可能丢失。
      Fork
      fork的作用是复制一个与当前进程一样的进程。新进程的所有数据(变量、环境变量、程序计数器等)
      数值都和原进程一致,但是是一个全新的进程,并作为原进程的子进程
      rdb 保存的是dump.rdb文件
      配置位置
      如何触发RDB快照
      配置文件中默认的快照配置
      冷拷贝后重新使用
      可以cp dump.rdb dump_new.rdb
      命令save或者是bgsave
      Save:save时只管保存,其它不管,全部阻塞
      BGSAVE:Redis会在后台异步进行快照操作,
      快照同时还可以响应客户端请求。可以通过lastsave
      命令获取最后一次成功执行快照的时间
      执行flushall命令,也会产生dump.rdb文件,但里面是空的,无意义
      如何恢复
      将备份文件 (dump.rdb) 移动到 redis 安装目录并启动服务即可
      CONFIG GET dir获取目录
      优势
      适合大规模的数据恢复
      对数据完整性和一致性要求不高
      劣势
      在一定间隔时间做一次备份,所以如果redis意外down掉的话,就
      会丢失最后一次快照后的所有修改
      fork的时候,内存中的数据被克隆了一份,大致2倍的膨胀性需要考虑
      如何停止
      动态所有停止RDB保存规则的方法:redis-cli config set save ""

    AOF

    是什么:
    以日志的形式来记录每个写操作,将Redis执行过的所有写指令记录下来(读操作不记录),
    只许追加文件但不可以改写文件,redis启动之初会读取该文件重新构建数据,换言之,redis
    重启的话就根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作
    Aof保存的是appendonly.aof文件
    配置位置
    AOF启动/修复/恢复
    正常恢复
    启动:设置Yes
    修改默认的appendonly no,改为yes
    将有数据的aof文件复制一份保存到对应目录(config get dir)
    恢复:重启redis然后重新加载
    异常恢复
    启动:设置Yes
    修改默认的appendonly no,改为yes
    备份被写坏的AOF文件
    修复:
    redis-check-aof --fix进行修复
    恢复:重启redis然后重新加载
    rewrite
    是什么:
    AOF采用文件追加方式,文件会越来越大为避免出现此种情况,新增了重写机制,
    当AOF文件的大小超过所设定的阈值时,Redis就会启动AOF文件的内容压缩,
    只保留可以恢复数据的最小指令集.可以使用命令bgrewriteaof
    重写原理
    AOF文件持续增长而过大时,会fork出一条新进程来将文件重写(也是先写临时文件最后再rename),
    遍历新进程的内存中数据,每条记录有一条的Set语句。重写aof文件的操作,并没有读取旧的aof文件,
    而是将整个内存中的数据库内容用命令的方式重写了一个新的aof文件,这点和快照有点类似
    触发机制
    Redis会记录上次重写时的AOF大小,默认配置是当AOF文件大小是上次rewrite后大小的一倍且文件大于64M时触发
    优势
    每修改同步:appendfsync always 同步持久化 每次发生数据变更会被立即记录到磁盘 性能较差但数据完整性比较好
    每秒同步:appendfsync everysec 异步操作,每秒记录 如果一秒内宕机,有数据丢失
    不同步:appendfsync no 从不同步
    劣势
    相同数据集的数据而言aof文件要远大于rdb文件,恢复速度慢于rdb
    aof运行效率要慢于rdb,每秒同步策略效率较好,不同步效率和rdb相同

     Redis的事务

    是什么
    可以一次执行多个命令,本质是一组命令的集合。一个事务中的
    所有命令都会序列化,按顺序地串行化执行而不会被其它命令插入,不许加塞
    能干嘛
    一个队列中,一次性、顺序性、排他性的执行一系列命令
    怎么玩
    常用命令
    case1:正常执行
    Case2:放弃事务
    Case3:全体连坐
    Case4:冤头债主
    Case5:watch监控
    悲观锁/乐观锁/CAS(Check And Set)
    悲观锁
    乐观锁
    CAS
    初始化信用卡可用余额和欠额
    无加塞篡改,先监控再开启multi,
    保证两笔金额变动在同一个事务内
    有加塞篡改
    监控了key,如果key被修改了,后面一个事务的执行失效
    unwatch
    一旦执行了exec之前加的监控锁都会被取消掉了
    小结
    Watch指令,类似乐观锁,事务提交时,如果Key的值已被别的客户端改变,
    比如某个list已被别的客户端push/pop过了,整个事务队列都不会被执行
    通过WATCH命令在事务执行之前监控了多个Keys,倘若在WATCH之后有任何Key的值发生了变化,
    EXEC命令执行的事务都将被放弃,同时返回Nullmulti-bulk应答以通知调用者事务执行失败
    3阶段
    开启:以MULTI开始一个事务
    入队:将多个命令入队到事务中,接到这些命令并不会立即执行,而是放到等待执行的事务队列里面
    执行:由EXEC命令触发事务
    3特性
    单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。
    没有隔离级别的概念:队列中的命令没有提交之前都不会实际的被执行,因为事务提交前任何指令都不会被实际执行,
    也就不存在”事务内的查询要看到事务里的更新,在事务外查询不能看到”这个让人万分头痛的问题
    不保证原子性:redis同一个事务中如果有一条命令执行失败,其后的命令仍然会被执行,没有回滚

     主从复制

    是什么
    官网
    行话:也就是我们所说的主从复制,主机数据更新后根据配置和策略,
    自动同步到备机的master/slaver机制,Master以写为主,Slave以读为主
    能干嘛
    读写分离
    容灾恢复
    怎么玩
    配从(库)不配主(库)
    从库配置:slaveof 主库IP 主库端口
    每次与master断开之后,都需要重新连接,除非你配置进redis.conf文件
    info replication
    修改配置文件细节操作
    拷贝多个redis.conf文件
    开启daemonize yes
    pid文件名字
    指定端口
    log文件名字
    dump.rdb名字
    常用3招
    一主二仆
    Init
    一个Master两个Slave
    日志查看
    主机日志
    备机日志
    info replication
    主从问题演示
    薪火相传
    上一个Slave可以是下一个slave的Master,Slave同样可以接收其他
    slaves的连接和同步请求,那么该slave作为了链条中下一个的master,
    可以有效减轻master的写压力
    中途变更转向:会清除之前的数据,重新建立拷贝最新的
    slaveof 新主库IP 新主库端口
    反客为主
    SLAVEOF no one
    使当前数据库停止与其他数据库的同步,转成主数据库

    复制原理:
    slave启动成功连接到master后会发送一个sync命令
    Master接到命令启动后台的存盘进程,同时收集所有接收到的用于修改数据集命令,
    在后台进程执行完毕之后,master将传送整个数据文件到slave,以完成一次完全同步
    全量复制:而slave服务在接收到数据库文件数据后,将其存盘并加载到内存中。
    增量复制:Master继续将新的所有收集到的修改命令依次传给slave,完成同步
    但是只要是重新连接master,一次完全同步(全量复制)将被自动执行
    哨兵模式(sentinel)
    是什么
    反客为主的自动版,能够后台监控主机是否故障,如果故障了根据投票数自动将从库转换为主库
    怎么玩(使用步骤)
    调整结构,6379带着80、81
    自定义的/myredis目录下新建sentinel.conf文件,名字绝不能错
    配置哨兵,填写内容
    sentinel monitor 被监控数据库名字(自己起名字) 127.0.0.1 6379 1
    上面最后一个数字1,表示主机挂掉后salve投票看让谁接替成为主机,得票数多少后成为主机
    启动哨兵
    redis-sentinel /myredis/sentinel.conf
    上述目录依照各自的实际情况配置,可能目录不同
    正常主从演示
    原有的master挂了
    投票新选
    重新主从继续开工,info replication查查看
    问题:如果之前的master重启回来,会不会双master冲突?
    一组sentinel能同时监控多个Master
    复制的缺点
    复制延时

  • 相关阅读:
    android 中文 api (43) —— Chronometer
    SVN客户端清除密码
    Android 中文 API (35) —— ImageSwitcher
    Android 中文API (46) —— SimpleAdapter
    Android 中文 API (28) —— CheckedTextView
    Android 中文 API (36) —— Toast
    Android 中文 API (29) —— CompoundButton
    android 中文 API (41) —— RatingBar.OnRatingBarChangeListener
    Android 中文 API (30) —— CompoundButton.OnCheckedChangeListener
    Android 中文 API (24) —— MultiAutoCompleteTextView.CommaTokenizer
  • 原文地址:https://www.cnblogs.com/yangj-Blog/p/13195929.html
Copyright © 2011-2022 走看看