zoukankan      html  css  js  c++  java
  • Redis操作

    redis是什么


    ​ redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sortedset --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。
    ​ Redis 是一个高性能的key-value数据库。 redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部 分场合可以对关系数据库起到很好的补充作用。它提供了Java,C/C++,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby,Erlang等客户端,使用很方便。
    ​ Redis支持主从同步。数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。这使得Redis可执行单层树复制。存盘可以有意无意的对数据进行写操作。由于完全实现了发布/订阅机制,使得从数据库在任何地方同步树时,可订阅一个频道并接收主服务器完整的消息发布记录。同步对读取操作的可扩展性和数据冗余很有帮助。redis的官网地址,非常好记,是redis.io。
    ​ 目前,Vmware在资助着redis项目的开发和维护。

    redis的特性


    1、完全居于内存,数据实时的读写内存,定时闪回到文件中。采用单线程,避免了不必要的上下文切换和竞争条件
    2、支持高并发量,官方宣传支持10万级别的并发读写
    3、支持持久存储,机器重启后的,重新加载模式,不会掉数据
    4、海量数据存储,分布式系统支持,数据一致性保证,方便的集群节点添加/删除
    5、Redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
    6、灾难恢复--memcache挂掉后,数据不可恢复; redis数据丢失后可以通过aof恢复;
    7、虚拟内存--Redis当物理内存用完时,可以将一些很久没用到的value 交换到磁盘;
    8、Redis支持数据的备份,即master-slave模式的数据备份;

    redis的架构


    Redis

    各功能模块说明如下:


    File Event: 处理文件事件,接受它们发来的命令请求(读事件),并将命令的执行结果返回给客户端(写事件))
    Time Event: 时间事件(更新统计信息,清理过期数据,附属节点同步,定期持久化等)
    AOF: 命令日志的数据持久化
    RDB: 实际的数据持久化
    Lua Environment : Lua 脚本的运行环境. 为了让 Lua 环境符合 Redis 脚本功能的需求,Redis 对 Lua 环境进行了一系列的修改, 包括添加函数库、更换随机函数、保护全局变量, 等等
    Command table(命令表):在执行命令时,根据字符来查找相应命令的实现函数。
    Share Objects(对象共享): 
    主要存储常见的值:
    a.各种命令常见的返回值,例如返回值OK、ERROR、WRONGTYPE等字符;
    b. 小于 redis.h/REDIS_SHARED_INTEGERS (默认1000)的所有整数。通过预分配的一些常见的值对象,并在多个数据结构之间共享对象,程序避免了重复分配的麻烦。也就是说,这些常见的值在内存中只有一份。
    Databases:
    Redis数据库是真正存储数据的地方。当然,数据库本身也是存储在内存中的。

    ###redis启动流程


    Redis

    redis安装方式

    redis安装常用两种方式:yum安装和源码包安装

    yum 安装: 通常是在线安装,好处是安装方式简单,不易出错;常用的安装yum源为epel

    源码包安装: 是先将 redis 的源码下载下来,在自己的系统里编译生成可执行文件,然后执行,好处是因为是在自己的系统上编译的,更符合自己系统的性能,也就是说在自己的系统上执行 redis 服务性能效率更好。

    区别:路径和启动方式不同,支持的模块也不同。

    redis程序路径


    程序环境:

    配置文件:/etc/redis.conf
    主程序:/usr/bin/redis-server
    客户端:/usr/bin/redis-cli
    Unit File:/usr/lib/systemd/system/redis.service
    数据目录:/var/lib/redis
    监听:6379/tcp

    配置文件:

    网络配置项
    基本配置项
    持久化相关配置
    复制相关的配置
    安全相关配置
    Limit相关的配置
    Cluster相关配置
    SlowLog相关的配置
    Advanced配置

    网络配置项:

    bind IP
    port PORT
    protected-mode 是否开启保护模式,默认开启。要是配置里没有指定bind和码。开启该参数后,redis只会本地进行访问,拒绝外部访问。
    tcp-backlog 定义了每一个端口最大的监听队列的长度
    unixsocket
    timeout:连接的空闲超时时长;

    通用配置项:

    daemonize, 是否以守护进程启动
    supervised, 可以通过upstart和systemd管理Redis守护进程,这个参数是和具体的操作系统相关的
    loglevel,
    pidfile,
    logfile,
    databases:设定数据库数量,默认为16个,每个数据库的名字均为整数,从0开始编号,默认操作的数据库为0;
    切换数据库的方法:
    SELECT <dbid>

    快照配置:

    save900 1 #900秒有一个key变化,就做一个保存
    save300 10 #300秒有10个key变化,就做一个保存,这里需要和开发沟通
    save60 10000 #60秒有10000个key变化就做一个保存
    stop-writes-on-bgsave-error yes #在出现错误的时候,是不是要停止保存
    rdbcompression yes #使用压缩rdb文件,rdb文件压缩使用LZF压缩算法,yes:压缩,但是需要一些cpu的消耗。no:不压缩,需要更多的磁盘空间
    rdbchecksum yes #是否校验rdb文件。从rdb格式的第五个版本开始,在rdb文件的末尾会带上CRC64的校验和。这跟有利于文件的容错性,但是在保存rdb文件的时候,会有大概10%的性能损耗,所以如果你追求高性能,可以关闭该配置。
    dbfilenamedump.rdb #rdb文件的名称
    dir./ 数据目录,数据库的写入会在这个目录。rdb、aof文件也会写在这个目录

    Limits相关的配置:

    maxclients 设置能连上redis的最大客户端连接数量
    maxmemory <bytes> redis配置的最大内存容量。当内存满了,需要配合maxmemory-policy策略进
    行处理。
    maxmemory-policy noeviction
    淘汰策略:volatile-lru, allkeys-lru, volatile-random, allkeys-random, volatile-ttl, noeviction
    内存容量超过maxmemory后的处理策略。
    # volatile-lru:利用LRU算法移除设置过过期时间的key。
    # volatile-random:随机移除设置过过期时间的key。
    # volatile-ttl:移除即将过期的key,根据最近过期时间来删除(辅以TTL)
    # allkeys-lru:利用LRU算法移除任何key。
    # allkeys-random:随机移除任何key。
    # noeviction:不移除任何key,只是返回一个写错误。
    # 上面的这些驱逐策略,如果redis没有合适的key驱逐,对于写命令,还是会返回错误。redis将不再接收写
    请求,只接收get请求。写命令包括:set setnx
    maxmemory-samples 5 #淘汰算法运行时的采样样本数;

    持久化配置:

    #APPEND ONLY MODE #
    # 默认redis使用的是rdb方式持久化,这种方式在许多应用中已经足够用了。但是redis如果中途宕机,会导致可能有几分钟的数据丢失,根据save来策略进行持久化,Append Only File是另一种持久化方式,可以提供更好的持久化特性。Redis会把每次写入的数据在接收后都写入 appendonly.aof 文件,每次启动时Redis都会先把这个文件的数据读入内存里,先忽略RDB文件。
    appendonly yes #启动aof模式
    # aof文件名(default: "appendonly.aof")
    appendfilename "appendonly.aof" #据读入内存里,先忽略RDB文件
    *appendfsync
    Redis supports three different modes:
    no:redis不执行主动同步操作,而是OS进行;
    everysec:每秒一次;
    always:每语句一次;

    如果Redis只是将客户端修改数据库的指令重现存储在AOF文件中,那么AOF文件的大小会不断的增加,因为AOF文件只是简单的重现存储了客户端的指令,而并没有进行合并。对于该问题最简单的处理方式,即当 AOF文件满足一定条件时就对AOF进行rewrite, rewrite是根据当前内存数据库中的数据进行遍历写到一个临时的AOF文件,待写完后替换掉原来的AOF文件即可。redis重写会将多个key、value对集合来用一条命令表达。在rewrite期间的写操作会保存在内存的rewrite buffer中,rewrite成功后这些操作也会复制到临时文件中,在最后临时文件会代替AOF文件。

    no-appendfsync-on-rewrite no

    # 在aof重写或者写入rdb文件的时候,会执行大量IO,此时对于everysec和always的aof模式来说,执行fsync会造成阻塞过长时间,noappendfsync-on-rewrite字段设置为默认设置为no。如果对延迟要求很高的应用,这个字段可以设置为yes,否则还是设置为no,这样对持久化特性来说这是更安全的选择。设置为yes表示rewrite期间对新写操作不fsync,暂时存在内存中,等rewrite完成后再写入,默认为no,建议yes。Linux的默认fsync策略是30秒。可能丢失30秒数据。

    auto-aof-rewrite-percentage 100 aof自动重写配置。当目前aof文件大小超过上一次重写的aof文件大小的百分之多少进行重写,即当aof文件增长到一定大小的时候Redis能够调用bgrewrite aof对日志文件进行重写。当前AOF文件大小是上次日志重写得到AOF文件大小的二倍(设置为100)时,自动启动新的日志重写过程。
    auto-aof-rewrite-min-size 64mb #设置允许重写的最小aof文件大小,避免了达到约定百分比但尺寸仍然很小的情况还要重写

    上述两个条件同时满足时,方会触发重写AOF;与上次aof文件大小相比,其增长量超过100%,且大小不少于64MB;
    aof-load-truncated yes #指redis在恢复时,会忽略最后一条可能存在问题的指令。aof文件可能在尾部是不完整的,出现这种现象,可以选择让redis退出,或者导入尽可能多的数据。如果选择的是yes,当截断的aof文件被导入的时候,会自动发布一个log给客户端然后load。如果是no,用户必须手动redis-check-aof修复AOF文件才可以。

    注意:持久机制本身不能取代备份;应该制订备份策略,对redis库定期备份;Redis服务器启动时用持久化的数据文件恢复数据,会优先使用AOF;

    redis持久存储读取


    Redis

    redis配置文件


    SlowLog相关的配置:

    slowlog-log-slower-than 10000
    #当命令的执行超过了指定时间,单位是微秒;
    slowlog-max-len 128
    #慢查询日志长度。当一个新的命令被写进日志的时候,最老的那个记录会被删掉。
    ADVANCED配置:
    hash-max-ziplist-entries 512
    hash-max-ziplist-value 64
    设置ziplist的键数量最大值,每个值的最大空间;

    redis命令介绍

    └── bin
    ├── redis-benchmark #redis性能测试工具,可以测试在本系统本配
    置下的读写性能
    ├── redis-check-aof #对更新日志appendonly.aof检查,是
    否可用
    ├── redis-check-dump #用于检查本地数据库的rdb文件
    ├── redis-cli #redis命令行操作工具,也可以用telnet根据
    其纯文本协议来操作
    ├── redis-sentinel Redis-sentinel 是Redis实例的监控管理、通知和
    实例失效备援服务,是Redis集群的管理工具
    └── redis-server #redis服务器的daemon启动程序

    redis-cli命令介绍

    默认选择 db库是 0
    redis-cli -p 6379
    查看当前所在“db库”所有的缓存key
    redis 127.0.0.1:6379> keys *
    选择 db库
    redis 127.0.0.1:6379> select 8
    清除所有的缓存key
    redis 127.0.0.1:6379> FLUSHALL
    清除当前“db库”所有的缓存key
    redis 127.0.0.1:6379[8]> FLUSHDB
    设置缓存值
    redis 127.0.0.1:6379> set keyname keyvalue
    获取缓存值
    redis 127.0.0.1:6379> get keyname
    删除缓存值:返回删除数量(0代表没删除)
    redis 127.0.0.1:6379> del keyname
    服务端相关命令
    time:返回当前服务器时间
    client list: 返回所有连接到服务器的客户端信息和统计数据 参见http://redisdoc.com/server/client_list.html
    client kill ip:port:关闭地址为 ip:port 的客户端
    save:将数据同步保存到磁盘
    bgsave:将数据异步保存到磁盘
    lastsave:返回上次成功将数据保存到磁盘的Unix时戳
    shundown:将数据同步保存到磁盘,然后关闭服务
    info:提供服务器的信息和统计
    config resetstat:重置info命令中的某些统计数据
    config get:获取配置文件信息
    config set:动态地调整 Redis 服务器的配置(configuration)而无须重启,可以修改的配置参数可以使用命令 CONFIG GET
    * 来列出
    config rewrite:Redis 服务器时所指定的 redis.conf 文件进行改写
    monitor:实时转储收到的请求
    slaveof:改变复制策略设置
    debug: sleep segfault
    slowlog get 获取慢查询日志
    slowlog len 获取慢查询日志条数
    slowlog reset 清空慢查询

    redis常用数据类型


    Redis

    Redis内部使用一个redisObject对象来表示所有的key和value,redisObject最主要的信息如上图所示:
    type代表一个value对象具体是何种数据类型,encoding是不同数据类型在redis内部的存储方式比如:type=string代表value存储的是一个普通字符串,那么对应的encoding可以是raw或者是int,如果是int则代表实际redis内部是按数值型类存储和表示这个字符串的,当然前提是这个字符串本身可以用数值表示,比如:"123" "456"这样的字符串。
    Redis的键值可以使用物种数据类型:字符串,散列表,列表,集合,有序集合。

    对KEY操作的命令

    exists(key):确认一个key是否存在
    del(key):删除一个key
    type(key):返回值的类型
    keys(pattern):返回满足给定pattern的所有key
    randomkey:随机返回key空间的一个
    keyrename(oldname, newname):重命名key
    dbsize:返回当前数据库中key的数目
    expire:设定一个key的活动时间(s)
    ttl:获得一个key的活动时间
    move(key, dbindex):移动当前数据库中的key到dbindex数据库
    flushdb:删除当前选择数据库中的所有key
    flushall:删除所有数据库中的所有key

    应用场景1:String是最常用的一种数据类型,普通的key/ value 存储都可以归为此类.即可以完全实现目前 Memcached 的功能,并且效率更高。还可以享受Redis的定时持久化,操作日志及 Replication等功能。除了提供与 Memcached 一样的get、set、incr、decr 等操作外,Redis还提供了下面一些操作:

    对String操作的命令

    set(key, value):给数据库中名称为key的string赋予值value
    get(key):返回数据库中名称为key的string的value
    getset(key, value):给名称为key的string赋予上一次的value
    mget(key1, key2,…, key N):返回库中多个string的value
    setnx(key, value):添加string,名称为key,值为value
    setex(key, time, value):向库中添加string,设定过期时间time
    mset(key N, value N):批量设置多个string的值
    msetnx(key N, value N):如果所有名称为key i的string都不存在
    incr(key):名称为key的string增1操作
    incrby(key, integer):名称为key的string增加integer
    decr(key):名称为key的string减1操作
    decrby(key, integer):名称为key的string减少integer
    append(key, value):名称为key的string的值附加value
    substr(key, start, end):返回名称为key的string的value的子串

    应用场景:在Memcached中,我们经常将一些结构化的信息打包成HashMap,在客户端序列化后存储为一个字符串的值,比如用户的昵称、年龄、性别、积分等,这时候在需要修改其中某一项时,通常需要将所有值取出反序列化后,修改某一项的值,再序列化存储回去。这样不仅增大了开销,也不适用于一些可能并发操作的场合(比如两个并发的操作都需要修改积分)。而Redis的Hash结构可以使你像在数据库中Update一个属性一样只修改某一项属性值。

    对Hash操作的命令

    hset(key, field, value):向名称为key的hash中添加元素field
    hget(key, field):返回名称为key的hash中field对应的value
    hmget(key, (fields)):返回名称为key的hash中field i对应的value
    hmset(key, (fields)):向名称为key的hash中添加元素field
    hincrby(key, field, integer):将名称为key的hash中field的value增加integer
    hexists(key, field):名称为key的hash中是否存在键为field的域
    hdel(key, field):删除名称为key的hash中键为field的域
    hlen(key):返回名称为key的hash中元素个数
    hkeys(key):返回名称为key的hash中所有键
    hvals(key):返回名称为key的hash中所有键对应的value
    hgetall(key):返回名称为key的hash中所有的键(field)及其对应的value

    Redis

    Redis

    Redis

    Redis

    Redis

    Redis list的应用场景非常多,也是Redis最重要的数据结构之一,比如twitter的关注列表,粉丝列表等都可以用Redis的list结构来实现。我们在看完一条微博之后,常常会评论一番,或者看看其他人的吐槽。每条评论的记录都是按照时间顺序排序的

    对List操作的命令

    rpush(key, value):在名称为key的list尾添加一个值为value的元素
    lpush(key, value):在名称为key的list头添加一个值为value的 元素
    llen(key):返回名称为key的list的长度
    lrange(key, start, end):返回名称为key的list中start至end之间的元素
    ltrim(key, start, end):截取名称为key的list
    lindex(key, index):返回名称为key的list中index位置的元素
    lset(key, index, value):给名称为key的list中index位置的元素赋值
    lrem(key, count, value):删除count个key的list中值为value的元素
    lpop(key):返回并删除名称为key的list中的首元素
    rpop(key):返回并删除名称为key的list中的尾元素
    blpop(key1, key2,… key N, timeout):lpop命令的block版本。
    brpop(key1, key2,… key N, timeout):rpop的block版本。
    rpoplpush(srckey, dstkey):返回并删除名称为srckey的list的尾元素,并将该元素添加到名称为dstkey的list的头部

    Set 就是一个集合,集合的概念就是一堆不重复值的组合。利用 Redis 提供的 Set 数据结构,可以存储一些集合性的数据。比如在微博应用中,可以将一个用户所有的关注人存在一个集合中,将其所有粉丝存在一个集合。因为 Redis 非常人性化的为集合提供了求交集、并集、差集等操作,那么就可以非常方便的实现如共同关注、共同喜好、二度好友等功能

    对Set操作的命令

    sadd(key, member):向名称为key的set中添加元素member
    srem(key, member) :删除名称为key的set中的元素member
    spop(key) :随机返回并删除名称为key的set中一个元素
    smove(srckey, dstkey, member) :移到集合元素
    scard(key) :返回名称为key的set的基数
    sismember(key, member) :member是否是名称为key的set的元素
    sinter(key1, key2,…key N) :求交集
    sinterstore(dstkey, (keys)) :求交集并将交集保存到dstkey的集合
    sunion(key1, (keys)) :求并集
    sunionstore(dstkey, (keys)) :求并集并将并集保存到dstkey的集合
    sdiff(key1, (keys)) :求差集
    sdiffstore(dstkey, (keys)) :求差集并将差集保存到dstkey的集合
    smembers(key) :返回名称为key的set的所有元素
    srandmember(key) :随机返回名称为key的set的一个元素

    Sorted Set

    常用命令:zadd,zrange,zrem,zcard,zcount等

    使用场景:

    Redis sorted set的使用场景与set类似,区别是set不是自动有序的,而sorted set可以通过用户额外提供一个优先级(score)的参数来为成员排序,并且是插入有序的,即自动排序。当你需要一个有序的并且不重复的集合列表,那么可以选择sorted set数据结构,比如twitter 的public timeline可以以发表时间作为score来存储,这样获取时就是自动按时间排好序的。
    另外还可以用Sorted Sets来做带权重的队列,比如普通消息的score为1,重要消息的score为2,然后工作线程可以选择按score的倒序来获取工作任务。让重要的任务优先执行。
    ZADD page_rank 9 baidu.com 8 bing.com 10 google.com

    redis主从复制


    Redis的复制方式有两种,一种是主(master)-从(slave)模式,一种是从(slave)-从(slave)模式,因此Redis的复制拓扑图会丰富一些,可以像星型拓扑,也可以像个有向无环。一个Master可以有多个slave主机,支持链式复制;
    Master以非阻塞方式同步数据至slave主机;

    Redis

    复制优点

    通过配置多个Redis实例,数据备份在不同的实例上,主库专注写请求,从库负责读请求,这样的好处主要体现在下面几个方面
    1、高可用性
    在一个Redis集群中,如果master宕机,slave可以介入并取代master的位置,因此对于整个Redis服务来说不至于提供不了服务,这样使得整个Redis服务足够安全。
    2、高性能
    在一个Redis集群中,master负责写请求,slave负责读请求,这么做一方面通过将读请求分散到其他机器从而大大减少了master服务器的压力,另一方面slave专注于提供读服务从而提高了响应和读取速度。
    3、水平扩展性
    通过增加slave机器可以横向(水平)扩展Redis服务的整个查询服务的能力。

    复制需要解决的问题

    复制提供了高可用性的解决方案,但同时引入了分布式计算的复杂度问题,认为有两个核心问题:
    1、数据一致性问题:如何保证master服务器写入的数据能够及时同步到slave机器上。
    2、读写分离;如何在客户端提供读写分离的实现方案,通过客户端实现将读写请求分别路由到master和slave实例上。
    上面两个问题,尤其是第一个问题是Redis服务实现一直在演变,致力于解决的一个问题:复制实时性和数据一致性矛盾
    Redis提供了提高数据一致性的解决方案,一致性程度的增加虽然使得我能够更信任数据,但是更好的一致性方案通常伴随着性能的损失,从而减少了吞吐量和服务能力。然而我们希望系统的性能达到最优,则必须要牺牲一致性的程度,因此Redis的复制实时性和数据一致性是存在矛盾的。

    redis主从复制


    1、slave向master发送sync命令。
    2、master开启子进程来讲dataset写入rdb文件,同时将子进程完成之前接收到的写命令缓存起来。
    3、子进程写完,父进程得知,开始将RDB文件发送给slave。master发送完RDB文件,将缓存的命令也发给slave。master增量的把写命令发给slave。

    值得注意的是,当slave跟master的连接断开时,slave可以自动的重新连接master,在redis2.8版本之前,每当slave进程挂掉重新连接master的时候都会开始新的一轮全量复制。如果master同时接收到多个slave的同步请求,则master只需要备份一次RDB文件。

    实战示例


    一、准备好4台机器

    192.168.42.150 redis-node1 #主
    192.168.42.151 redis-node2 #从
    192.168.42.152 redis-node3 #从
    192.168.42.153 redis-node4 #从

    二、安装redis,配置好基本配置

    yum install redis
    cp /etc/redis.conf{,.back}
    vim redis.conf
    daemonize yes
    bind 0.0.0.0 #改为各个节点的IP

    三.依照上面设定的从主机,在从主机配置文件中开启从配置(需要配置3台机器):

    ### REPLICATION ###
    slaveof 192.168.1.29 6379 #主节点地址,<host> <port>
    #masterauth <master-password> #如果设置了访问认证就需要设定此项。
    slave-server-stale-data yes #当slave与master连接断开或者slave正处于同步状态时,如果slave收到请求允许响应,no表示返回错误。
    slave-read-only yes #slave节点是否为只读。
    slave-priority 100 #设定此节点的优先级,是否优先被同步。

    四、redis主从复制测试

    set master-slave ok

    五、高级配置

    一个RDB文件从master端传到slave端,分为两种情况:
    1、支持disk:master端将RDB file写到disk,稍后再传送到slave端;
    2、无磁盘diskless:master端直接将RDB file传到slave socket,不需要与disk进行交互。无磁盘diskless方式适合磁盘读写速度慢但网络带宽非常高的环境。
    repl-diskless-sync no #默认不使用diskless同步方式
    repl-diskless-sync-delay 5 #无磁盘diskless方式在进行数据传递之前会有一个时间的延迟,以便slave端能够进行到待传送的目标队列中,这个时间默认是5秒
    repl-ping-slave-period 10 #slave端向server端发送pings的时间区间设置,默认为10秒
    repl-timeout 60 #设置超时时间
    *slave-priority 100
    复制集群中,主节点故障时,sentinel应用场景中的主节点选举时使用的优先级;数字越小优先级越高,但0表示不参与选举;
    min-slaves-to-write 3 #主节点仅允许其能够通信的从节点数量大于等于此处的值时接受写操作;
    min-slaves-max-lag 10 #从节点延迟时长超出此处指定的时长时,主节点会拒绝写入操作;

    Sentinel是Redis的高可用性(HA)解决方案,由一个或多个Sentinel实例组成的Sentinel系统可以监视任意多个主服务器,以及这些主服务器属下的所有从服务器,并在被监视的主服务器进行下线状态时,自动将下线主服务器属下的某个从服务器升级为新的主服务器,然后由新的主服务器代替已下线的主服务器继续处理命令请求。Redis提供的sentinel(哨兵)机制,通过sentinel模式启动redis后,自动监控master/slave的运行状态,基本原理是:心跳机制+投票裁决

    监控(Monitoring): Sentinel 会不断地检查你的主服务器和从服务器是否运作正常。
    提醒(Notification): 当被监控的某个 Redis 服务器出现问题时, Sentinel 可以通过 API 向管理员或者其他应用程序发送通知。

    自动故障迁移(Automatic failover): 当一个主服务器不能正常工作时,Sentinel 会开始一次自动故障迁移操作, 它会将失效主服务器的其中一个从服务器升级为新的主服务器, 并让失效主服务器的其他从服务器改为复制新的主服务器; 当客户端试图连接失效的主服务器时, 集群也会向客户端返回新主服务器的地址, 使得集群可以使用新主服务器代替失效服务器。

    Redis

    一、配置sentinel

    只需在sentinel节点的配置文件中修改以下配置即可:

    port 26379
    #sentinel announce-ip 1.2.3.4 #默认监听在0.0.0.0 所以此处可以注释。
    dir “/tmp”
    sentinel monitor mymaster 192.168.1.29 6379 1 #sentinel moitor <master-name> <ip> <redis-port> <法定人数
    quorum>
    #设定master节点的*名称*和位置,法定人数表示多少台sentinel节点认同才可以上线。
    <quorum>表示sentinel集群的quorum机制,即至少有quorum个sentinel节点同时判定主节点故障时,才认为其真的故障
    s_down: subjectively down
    o_down: objectively down
    sentinel down-after-milliseconds mymaster 5000 #如果联系不到节点5000毫秒,我们就认为此节点下线。
    sentinel failover-timeout mymaster 60000 #设定转移主节点的目标节点的超时时长。
    sentinel auth-pass <master-name> <password> #如果redis节点启用auth,此处也要设置password。
    sentinel parallel-syncs <master-name> <numslaves> #指在failover过程中,能够被sentinel并行配置的从节点的数量;

    一些关于sentinel的命令:

    redis-cli -h SENTINEL_HOST -p SENTINEL_PORT
    sentinel masters <master-name> #查看此复制集群的主节点信息。
    sentinel slaves <master-name> #查看此复制集群的从节点信息。
    sentinel failover <node-name> #切换指定的节点为节点为主节点。

    Redis 字符串(String)

    redis 127.0.0.1:6379> SET runoobkey redis
    OK
    redis 127.0.0.1:6379> GET runoobkey
    "redis"


    Redis 哈希(Hash)

    127.0.0.1:6379>  HMSET runoobkey name "redis tutorial" description "redis basic commands for caching" likes 20 visitors 23000
    OK
    127.0.0.1:6379>  HGETALL runoobkey
    1) "name"
    2) "redis tutorial"
    3) "description"
    4) "redis basic commands for caching"
    5) "likes"
    6) "20"
    7) "visitors"
    8) "23000"

    Redis 列表(List)

    redis 127.0.0.1:6379> LPUSH runoobkey redis
    (integer) 1
    redis 127.0.0.1:6379> LPUSH runoobkey mongodb
    (integer) 2
    redis 127.0.0.1:6379> LPUSH runoobkey mysql
    (integer) 3
    redis 127.0.0.1:6379> LRANGE runoobkey 0 10
    
    1) "mysql"
    2) "mongodb"
    3) "redis"

    Redis 集合(Set)

    redis 127.0.0.1:6379> SADD runoobkey redis
    (integer) 1
    redis 127.0.0.1:6379> SADD runoobkey mongodb
    (integer) 1
    redis 127.0.0.1:6379> SADD runoobkey mysql
    (integer) 1
    redis 127.0.0.1:6379> SADD runoobkey mysql
    (integer) 0
    redis 127.0.0.1:6379> SMEMBERS runoobkey
    
    1) "mysql"
    2) "mongodb"
    3) "redis"

    Redis 有序集合(sorted set)

    redis 127.0.0.1:6379> ZADD runoobkey 1 redis
    (integer) 1
    redis 127.0.0.1:6379> ZADD runoobkey 2 mongodb
    (integer) 1
    redis 127.0.0.1:6379> ZADD runoobkey 3 mysql
    (integer) 1
    redis 127.0.0.1:6379> ZADD runoobkey 3 mysql
    (integer) 0
    redis 127.0.0.1:6379> ZADD runoobkey 4 mysql
    (integer) 0
    redis 127.0.0.1:6379> ZRANGE runoobkey 0 10 WITHSCORES
    
    1) "redis"
    2) "1"
    3) "mongodb"
    4) "2"
    5) "mysql"
    6) "4"

  • 相关阅读:
    memmove 的实现
    [转]SGI STL 红黑树(Red-Black Tree)源代码分析
    [转]让我看了很有感触
    [转]C++ list 类学习笔记
    [转]码农自白:这样成为谷歌工程师
    [转]Traits 编程技法+模板偏特化+template参数推导+内嵌型别编程技巧
    泛型指针,原生指针和智能指针
    [转]C++基本功和 Design Pattern系列 ctor & dtor
    python+opencv滤波操作
    python+opencv阈值
  • 原文地址:https://www.cnblogs.com/mylovelulu/p/9298737.html
Copyright © 2011-2022 走看看