zoukankan      html  css  js  c++  java
  • Redis的学习(一、Redis的一些常用技术)

    与大多数的NoSql不同,Redis是存在事务的,尽管它没有数据库那么强大。Redis的事务是使用MULTI-EXEC的命令组合,使用它可以提供两个重要的保证:

    1. 事务是一个被隔离的操作,事务中的方法都会被Redis进行序列化并按顺序执行,事务在执行的过程中不会被其他客户端发生的命令所打断。

    2. 事务是一个原子性的操作。要么全部成功,要么全部失败。

    Redis使用事务会经过三个过程:

    1. 开启事务。

    2. 命令进入队列。

    3. 执行事务。

    Redis事务命令
     命令  说明 备注 

     multi

     开启事务命令,之后的命令就进入队列,而不会马上被执行。  在事务生存期间,所有的Redis关于数据结构的命令都会入队。
    watch key1 [key2....]  监听某些键,当被监听的键在事务执行前被修改,则事务会被回滚   使用乐观锁
    unwatch key1 [key2....]   取消监听某些键。 -- 
    exec  执行事务,如果被监听的键没有被修改,则采用执行命令,否则就回滚命令。  在执行事务队列存储的命令前,Redis会检测被监听的键值有没有发生变化,如果没有则执行命令,否则就回滚事务。 
    discard  回滚事务 回滚进入队列的事务命令,之后就不能再用exec命令提交了。

     

     

     

     

     

     

     

     

    Redis的基础事务

     

    开启事务:multi,执行事务:exec。在他们中间采取进入队列的形式,exec的作用就是一次性发送队列里的命令去执行,而在执行这些命令的时候其他客户端不能再插入任何命令了,这就是Redis的事务机制。

    注意:执行事务命令exec执行前,set和get都返回的是QUEUED。说明是放入了队列中,而不是执行,只有exec之后,队列中的内容才会被执行。

    注意:如果使用了回滚操作,再使用exec就会报错了,因为discard命令已经取消了事务的命令,也就是说队列中没有要执行的命令了。所以报错了。

    使用watch命令监控事务

     

    在Redis中使用watch命令可以决定事务是执行还是回滚。一般而言,我们在multi命令之前使用watch命令监控某些键值对,然后使用multi命令开启事务,执行各类对数据结构进行操作的命令,这个时候这些命令就会进入队列。当Redis使用exec命令执行事务的时候,它首先会比对被watch监控的键值对,如果没有发生变化,那么它会执行事务中的命令,提交事务。如果发生变化,那么它不会执行任何事务中的命令,而去事务回滚。无论事务是否回滚,Redis都会去取消执行事务前的watch命令。

    事务检测
    时刻 客户端 说明
    T1 set key1 value1 初始化key1
    T2 watch key1 监控key1的键值对
    T3 multi 开启事务
    T4 set key2 value2 设置key2的值
    T5 exec 提交事务,Redis会在这个时间点检测key1的值在T2时刻后,有没有被其他命令修改过,如果没有,则提交事务去执行

     

     

     

     

     

     

    流水线(pipelined)

    发布订阅

    超时命令

     

    复制

     

    尽管我们说Redis的性能很好,每秒支持10万次左右的读写,但是还是不能应对那些百万次请求/每秒甚至更多的情况,那么我们的解决思路就是多添加一些服务器来分担这些请求。

    1. 主从同步基础概念

    互联网系统一般都是以主从架构为基础的,所谓主从架构设计的思路大概是:

    (1)多个服务器中只有一个主服务器,n个从服务器。主服务器负责写入数据,从服务器用于读取数据。

    (2)同时主服务器不负责让外部程序读取数据,从服务器不写入数据,只负责同步主服务器的数据,并让外部程序读取数据。

    (3)主服务器写入数据后,即刻将写入数据的命令发送给从服务器,从而使得主从数据同步。

    (4)应用程序可以随机读取某一台从服务器的数据,这样就分担了读数据的压力。

    (5)当从服务器不工作,不会影响整个系统,当主服务器不工作,可以在从服务器中选出一个服务器作为主服务器。

    2. Redis主从同步的过程

    (1)先保证主服务器的开启,之后从服务器通过命令或者重启配置项可以同步到主服务器。

    (2)从服务器启动之后,读取同步的配置,根据配置决定是否使用当前数据响应客户端,然后发送SYNC命令。当主服务器接收到同步命令时,会执行bgsave命令备份数据,但是主服务器此时不会拒绝客户端的读/写请求,而是将写命令写入缓存区。从服务器未收到主服务器备份的快照文件的时候,会根据其配置决定使用现有数据响应客户端/拒绝。

    (3)bgsave命令执行完了之后,开始向从服务器发送备份文件,这个时候从服务器就会丢弃所有的现有数据,开始载入发送过来的快照文件。

    (4)当主服务器发送完备份文件后,从服务器就会执行这些写入命令。此时就会把bgsave执行之后的缓存区内的写命令也发送给从服务器,从服务器完成备份文件解析,就开始像往常一样,接收命令,等待命令写入。

    (5)缓冲区的命令发送完成后,当主服务器执行第一条写命令后,就同时往服务器发送同步写命令,从服务器就跟主服务器保持一致了。而此时当从服务器完成主服务器发送的缓冲区命令后,就开始等待主服务器的命令了。

    哨兵

     

    Redis可以存在多个服务器,并且实现了主从复制的功能。哨兵模式是一种特殊的模式,首先Redis提供了哨兵的命令,哨兵是一个独立的进程,会独立运行。其原理是哨兵通过发送命令,等待Redis服务器响应,从而监控运行的多个Redis实例。

    哨兵的作用

    1. 通过发送命令,让Redis返回运行状态。

    2. 当哨兵检测到主服务器宕机,会将从服务器切换成主服务器,然后通过发布订阅模式通知其他的从服务器,修改配置文件,让他们切换主机。

    现实中,我们常常使用多个哨兵对Redis服务器进行监控,而且哨兵之间也会互相监控,监控其他哨兵是否'活着',这样就变成了多个哨兵模式。

    故障切换的过程(failover)

    1. 假设主服务器宕机。

    2. 哨兵1先监测到这个结果,但是系统并不会马上进行failover操作,这里仅仅是哨兵1主观的认为主机不可用,这个现象被称为主观下线

    3. 当其他一定数量的哨兵也监测到了主机不可用,那么哨兵之间就会发起一次投票,投票的结果由一个哨兵发起,进行failover操作,切换成功后,通过发布订阅模式,让各个哨兵把自己监控的服务器实现切换主机,这个过程称为客观下线

     

     

     

    持续更新!!!

  • 相关阅读:
    droid开发:如何打开一个.dcm文件作为位图?
    AndroidStudio3.0 Canary 8注解报错Annotation processors must be explicitly declared now.
    Android 异步加载神器Loader全解析
    Android实现RecyclerView的下拉刷新和上拉加载更多
    Android之ViewFlipper的简单使用
    云计算之路-阿里云上:2014年6月11日17点遇到的CPU 100%状况团队
    云计算之路-阿里云上:黑色1秒,微软的问题还是阿里云的问题?团队
    [网站公告]18:07-18:20阿里云SLB故障造成网站不能正常访问团队
    上周热点回顾(6.2-6.8)团队
    云计算之路-阿里云上:受够了OCS,改用ECS+Couchbase跑缓存团队
  • 原文地址:https://www.cnblogs.com/flyinghome/p/12677843.html
Copyright © 2011-2022 走看看