redis客户端命令

1、String

    set name lisi

    mset name2 lisi2 name3 lisi3 批量设置

    setnx name4 lisi4 key存在则设置失败 不存在则成功

    msetnx name lisi001 name7 lisi7 批量设置,如果其中一个存在则设置失败 都不存在则成功

    get name

    mget name name2 返回多个key的value【列表】

    getrange name 0 -3 返回key从start 到end结束的字符串 -3为倒数第三个字符

    setbit age 1 1 (setbit key offset value) 设置键的偏移量,offset参数必须大于等于0小于2的32次方,value只能设置0或1.

    getbit age 3 获取偏移量

    setex addr 10 1(setex key seconds value)设置key的过期时间(秒)

    ttl addr 获取剩余的过期时间

    psetex addr 5000 1 设置key的过期时间(毫秒)

    pttl addr 获取剩余的过期时间 毫秒

    setrange name 1 a(setrange key offset value) 替换键的值,offset第一个值下标为0

    exists addr 判断一个key是否存在

    getset addr 2 设置新值返回旧值

    append addr 3 追加值,key不存在则将value赋值

    bitcount addr[start end]  统计指定位区间上值为1的个数

    bitop operation destkey key[key...] 对一个或多个保存二进制位的字符串 key 进行位元操作,并将结果保存到 destkey 上  || operation 可以是 AND 、 OR 、 NOT 、 XOR 这四种操作中的任意一种。

    strlen addr 统计字节长度

    incr age 让键的值加1

    incrby age 10 让键的值加上增量值

    decr age 让键的值减1

    decrby age 10 让键的值减上增量值

    incrbyfloat age 1.111 浮点型累加

    set key value px milliseconds nx,替代 setnx + expire 需要分两次执行命令的方式,保证了原子性,

2、Hash

    hset id name lisi(hset key field value) 将哈希表key中的field设置值为value

    hsetnx id name lisi 当field不存在时设置成功反之失败

    hmset id age 1 addr 2 批量设置field

    hget id name 获取哈希表field值

    hgetall id 获取key中的field 和 value

    hmget id name age 获取多个field的值

    hkeys id 获取key中的所有field

    hvals id 获取key中的所有value

    hlen id 获取key中field的个数

    hstrlen id name 获取key中field的字节长度

    hincrby id age 11 key中field的value值加11

    hincrbyfloat id age 11

    hdel id addr 删除指定key中的field

    hexists id addr 判断key中的field是否存在 不存在返回0反之为1

3、List

   lpush list1 a b c d 

   lrange list1 0 -1

   rpush list1 e f g

   linsert list1 before c ll 插入一个值到列表中

   lpushx list1 xx   将值插入列表头部

   rpushx list1 pp  将值插入列表尾部

   lset list1 0 nm(lset key index value)  修改列表元素的值

   llen list1 统计列表的长度

   lindex list1 0 获取列表元素下标的值

   lpop list1 取出列表的头元素 

   rpop list1 取出列表的尾元素

   blpop list1 10(blpop key timeout)10秒内删除list1

   brpop list1 10  删除尾元素

   ltrim list1 0 -1 去除不必要的空格,保留区间的值

   lrem list1 0 c (lrem key count value)删除列表key与指定value相等元素,当count等于0,删除与key中所有与value相等元素,count大于0 删除key从表头到表尾,删除与value相等元素,删除数量为count个,count小于0,删除key 从表尾到表头,删除与value相等元素,删除数量为count个.

   rpoplpush list1 list2 将列表最后一个元素移动到一个列表中

   brpoplpush list1 list2 10(brpoplpush source target timeout)在指定时间内移动列表到另一个列表

4、Set

   sadd set1 a b c d 添加多个元素到集合中

   smove set1 set2 a(smove source target member)移动member元素到另一个集合中

   smembers set1 

   sunionstore set0 set1 set2(smembers target key key1)保存多个集合元素到新集合中

   sismember set0 a 判断某个元素是否在集合中

   scard set0 集合中元素的数量

   srandmember set0 5 随机获取集合中的count个元素

   sunion set0 set1 取多个集合并集

   sdiff set0 set1 取差集

   sdiffstore set3 set0 set1  取差集并存储set3

   sinter set0 set1 取多个集合的交集

   sinterstore set00 set1 set2 获取多个集合交集并存储

   spop set0 3 删除集合中的元素

   srem set0 b (srem key member[member...])删除集合中元素

5、SortSet

    zadd zset1 100 lisi (ZADD key score member [[score member] [score member] ...])

    zrange zset1 0 -1 有序集合

    zrange zset1 0 -1 withscores 有序集合 显示member和score

    zrem zset1 zhangsan zhaoliu(zrem zset1 member[members]) 删除key的member

    zscore zset1 lisi 返回key中的member的score

    zrevrange zset1 0 -1 倒序排集合

    zrevrange zset1 0 -1 withscores 倒序排集合 显示member和score

    zrank zset1 zhangsan 获取指定key的member的排名 从0开始

    zrevrank zset1 zhaoliu 获取指定key的member倒排 从0开始

    zcard zset1  集合里所有元素的个数

    zcount zset1 0 50(zcount key start end) 返回满足集合key的区间内的分数的个数

    zincrby zset1 10 lisi(ZINCRBY key increment member) 累加指定member的分数

    zrangebyscore zset1 0 100 (zrangebyscore  key min max) 返回集合key的区间内的成员

    标注:min max (1 5  1<x<=5  或(1 (5  1<x<5    -inf +inf 负无穷到正无穷

    zrangebyscore zset1 0 100 withscores 显示member和score

    zremrangebyrank zset1 0 -1  移除有序集 key 中,指定排名(rank)区间内的所有成员。

    zremrangebyscore zset1 0 10 移除有序集 key 中,指定分数(score)区间内的所有成员。

    zrevrangebyscore zset1 100 0 返回有序集 key 中,score 值介于 max 和 min 之间(默认包括等     于max或min )的所有的成员  

    标注min max (1 5  1<x<=5  或(1 (5  1<x<5    -inf +inf 负无穷到正无穷

    zunionstore set4 2 zset1 set2 weights 1 3 aggregate sum

    (zunionstore  descstorekey numbers key key2    weights aggregate sum|max|min )  取多个有序集合的并集并存储weights 1 表示第一个有序key乘以1 3 第二个有序key乘以3 aggregate (多个集合key中的相同member才会进行相应的sum操作)默认是sum

  zinterstore set005 2 set001 set002 aggregate sum 取多个集合中的交集(member相同)

二、redis必备命令

  scan cursor [MATCH pattern] [COUNT count]   scan模糊查询keys   cursor 游标第一次迭代使用 0 作为游标,表示开始一次新的迭代,MATCH 模糊匹配,count 限定服务器单次遍历的字典槽位数量(约等于)。

keys pattern 匹配多个键 keys name* keys name? *代表多个 ?代表一个

object subcommand [arguments ...]

        1> object refcount key 返回给定key引用所存储的值的次数

        2>object encoding key 返回给定key的底层编码方式

        3>object idletime key 返回给定key自存储以来的空闲时间

randomkey 随机返回一个键

rename key newkey 修改键的名称 当key不存在返回错误,如果newkey已经存在,则rename命令执行后回覆盖旧值

renamenx key newkey 当key不存在或newkey不存在时才能修改

dump key 序列化key

restore key ttl serialized-value[replace] 将序列化值进行反序列化

        说明: ttl 表示key的生存时间单位为毫秒,replace如果反序列化的key已经存在则会替换

expire key seconds 设置键的生存时间(秒)

pexpire key seconds 设置键的生存时间(毫秒)

expireat key timestamp 设置键的生存时间(unix 时间戳(秒)) 表示设置key到指定的时间戳失效

pexpireat key timestamp 设置键的生存时间(unix 时间戳(毫秒))

migrate host port key destination-db timeout [copy] [replace]

        migrate 127.0.0.1 6380 name 0 5000

        说明:migrate是原子操作,在执行的时候会阻塞两个数据库(源数据库和目标数据库)直到转移成功或失败或等待超时。转移成功后会删除源数据库的key

move key db  将键值对转移到目标数据库 mv name 1 

sort key [by pattern] [limit offset count] [get pattern] [asc | desc] [alpha] [store destination]

        排序,返回或保存给定的列表、集合中的元素。

        sort key alpha 对字符串排序

        sort key asc|desc 升序或降序

        sort key by *-age 指定key的值来进行排序

                sadd set5 lisi zhangsan  zhaoliu zhouqi

                mset zhangsan-age 10 lisi-age 15 zhaoliu-age 11 zhouqi-age 8

                 sort set5 by *-age

                 注意 sort set5 by no-key 指定一个不存在的key进行by时则不做操作

                 sort key limit 0 1 分页

                 sadd set5 wangwu   sort set5 by *-age  当wangwu-age不存在时,排序之后在第一个显示。

       sort key get *-age 取指定key的值

       sort set5 get *-age get *-des alpha  取多个key的值

       sort set5 get *-age get *-des get # alpha 取多个Key和当前set5的元素

       sort set5 alpha by *-* get *-age get *-des 对多个key排序(取总和的数字)然后取多个key

       sort对hash表操作

             sort uids by user_info_*->age get user_info_*->name  uids根据user_info_*中的age排序,取出user_info_*中的name来显示。

        sort key alpha by *-* get *-age get *-des store newkey 排序后存储key

        sort多参数执行的顺序
            1> 进行排序 sort <key> alpga asc | desc by <pattern>
            2> 对排序进行分页 limit <offset><count>
            3> 获取外部键 get <pattern>
            4> 对排序结果集返回给客户端 store <store_key>

type key 获取键对应值的类型  

persist key 删除键的生存时间 

psubscribe  pattern  批量订阅

punsubscribe  pattern 批量退订

三、扩展命令

        hyperLogLog

        说明:redis用作基数统计的算法,可以做大数据来计算基数,优点空间固定、所占空间小

        pfadd key element[elements ....]

        pfcount key [key...] 统计hyperloglog的基数的个数

        pfmerge destkey sourcekey [sourcekey ...] 合并多个hyperLogLog为一个新的hyperLogLog

                说明: pfmerge hyper333 hyper123 hyper222 合并hyper123 hyper222 到hyper333中

        lua 说明可以执行一次性执行一个或多个命令,减少内存开销,实现原子性操作。将整个脚本作为一个整体执行,执行中不会有其他命令被执行。可以复用,redis会永久保存客户端发送的脚本。

        script load scirpttext 将脚本script添加到缓存中,但不会立即执行。执行之后会返回script的SHA1校验和。

        script exists sha1[sha1 ...] 判断脚本是否已经在缓存中。

        eval scripttext numkeys key[key ...] arg[arg ...] 不仅会对lua脚本缓存,还会对lua脚本立即执行。

                实例:eval "return redis.call('get','name3')" 0

        evalsha sha1 numkeys key[key ...] arg[arg ...] 对缓存中的脚本求值 

                实例:evalsha "ebaa0f95263f1e782aa80a80b067bc33b6e2ac82" 0

        script kill 杀死正在允许的Lua脚本,由于lua是原子性操作写操作的脚本是无法杀死的,如果非要停止这个脚本可以使用shutdown nosave 命令来直接关闭整个redis进程。

        script flush 清除缓存中的lua脚本

        auth password 解锁密码

                说明:通过config set requirepass password设置密码,然后之后连接执行命令就需要认证。

        quit 断开客户端与服务器的连接

        ping 查看服务器的运行状态

        echo  message 输出打印消息     

        select index 切换数据库

        clent list 获取客户端相关信息

        client getname  获取客户端名字

        client setname 设置客户端名字

        client pause timeout 在指定时间范围内停止运行来自客户端的命令,单位毫秒

        client kill ip:port 关闭客户端连接 ip:port为client list里面查看

        command 查看命令的详细信息,以随机列表形式返回redis所有命令的详细信息

        dbsize 统计数据库中键的数量

        lastsave 获取最近一次保存数据的时间

        monitor 实时打印服务器接收到的命令

        time 获取当前服务器的时间

        config set parameter value 修改redis服务器和配置 

                实例: config set slowlog-max-len 1000 修改服务器慢izhi的最大长度为1000

        config get paramter   查看redis服务器的配置 

        config resetstat 重置Info命令中的统计数据

        config rewrite 改写redis配置文件

        bgrewriteaof  执行aof文件重写操作

        save 将数据同步保存到磁盘中

        bgsave 将数据异步保存到磁盘中

        sync redis复制功能的内部命令

        psync <master_run_id> <offset> 

        slaveof host port 动态修改复制功能,修改当前服务器,使其转变为指定服务器的从服务器,如果当前服务器是某个主服务器的从服务器,那么会丢弃旧数据库,再和主服务器保持同步,如果不想丢弃数据集,则可以使用slave no one命令,可以在主服务器宕机时,将从服务器用作新的主服务器,实现数据不丢失,不间断运行。

        role 查看主从服务器的角色

        slowlog subcommand [argument] 管理redis慢日志

                slowlog get 3 查看3个慢日志信息

                slowlog len 查看当前慢日志的数量

                slowlog reset 清空慢日志

        shutdown [save|nosave] 关闭redis服务器或客户端

                说明:save会强制执行redis保存命令,即使没有设置保存点也会保存,nosave命令会阻止redis数据库执行保存操作。

        config set notify-keyspace-events AKE 设置开启数据通知功能(AKE相关说明需查阅)

        subscribe __keyspace@0__:name5 订阅获取0号数据库关于name5键的所有命令

        subscribe __keyevent@0__:set 订阅获取0号数据库关于set命令的键

四、redis进阶命令

        client list flags 标志属性

        客户端缓冲区:服务器采用软性限制和硬性限制来限制客户端缓冲大小,软性限制如果缓冲区大小超出软件限制所设置大小,并且持续时间超过服务器设定的时长,服务器会关闭这个客户端。硬性限制,缓冲区超出设置硬性限制大小则会立即关闭这个客户端。

        redis.conf配置中

                client-output-buffer-limit <class> <hard limit> <soft limit> <soft seconds>

                client-output-buffer-limit normal 0 0 0 #设置普通客户端的硬性限制和软性限制均为0表示不限制这个客户端的输出缓冲区大小。
                client-output-buffer-limit slave 256mb 64mb 60 #设置从服务器客户端硬性限制256,软性限制64时间为60秒。
                client-output-buffer-limit pubsub 32mb 8mb 60 #设置执行消息订阅发布功能的客户端硬性限制256,软性限制64时间为60秒。

五、redis5种数据类型(object encoding key)

        字符串对象编码方式

                int  存储时的时一个Long类型的整数值

                raw 长度超过32字节的字符串

                embstr 长度小于或等于32字节的字符串

        哈希对象的编码方式

                ziplist 压缩列表

                hashtable 如果不满足所有键值对中的键和值的字符串长度不超过64字节,哈希对象保存的键值对的个数在512以内,则会变为hashtable存储方式。

        列表对象的编码方式

                ziplist 压缩列表

                quicklist 快速列表是由压缩列表组成的双向列表

                linkedlist 节点都保存了一个字符串对象

        集合对象的编码方式

                intset 集合对象所包含 所有元素都会被保存到这个整数集合中。

                hastable 集合对象每个键都是一个字符串对象,每个字符串对象都包含一个集合元素

        有序集合对象编码方式

                ziplist 每个有序集合的元素使用两个相连的压缩列表节点来保存,第一个压缩列表节点保存有序集合元素的成员(member),第二个压缩列表的节点保存有序集合元素的分数值(score).

                skiplist 同时包含一个跳表和一个字典

六、redis事务

        multi 开启事务

        exec 执行从multi到此命令的队列

        discard取消事务,会清空事务队列中的命令,并从事务状态中退出。

        watch 监视键值对,如果监视的键值对发送改变,那么事务不会被执行。

        redis事务一次性、按顺序(multi之后放入队列中的命令是有序的,执行的时候也是按队列中的顺序执行)、排他性的执行。在事务开启状态时,执行一条命令,会返回一个queued的结果。执行exec时,将会以数组的方式返回执行结果

        事务中,命令类型错误不会影响整个事务中其他命令的执行,但命令格式错误(参数错误、参数数量错误、参数顺序错误)都会导致入队失败,导致事务执行失败。

        在执行事务中,如果突发断电、服务器停机,导致事务出错,会中断事务,不会影响数据一致性。

        乐观锁:watch命令。unwatch退出监视,除了这个命令,exec、discard店铺可以清除连接中的监视,断开连接也会取消事务和监视。

七、消息订阅

           publish a_channel testMeg 返回的数值则是表示有几个订阅者

           subscribe a_channel  

                  返回的信息第一个subscribe字符串,第二个订阅频道名称,第三个已经成功订阅的频道数量。message消息,表示已经订阅的客户端已经成功收到另一个客户端发送的消息,第一个值是message字符串,第二个是频道名称,第三个是消息内容。

          unsubscribe a_channel 退订频道  返回信息第一个值是unsubscribe字符串,第二个是退订的频道名称,第三个是当前客户端订阅的频道数量。

          psubscribe订阅频道 pubscribe pattern
                    ?单个任意字符
                    *匹配任意字符,包含空字符
                    [ae]匹配a和e其中一个字符
                    如果有? * [] 特殊符号则需要转义\?

        psubscribe 返回信息第一个是psubscribe字符串,第二个是订阅模式的名称,第三个当前客户端订阅的模式数量。

        pmessage 表示订阅模式的客户端已经成功收到另一个客户端发送的消息,第一个是pmessage的字符串,第二个是订阅的客户端模式,第三个准备发送的客户端通道,第三个是收到消息。

        punsubscribe a?e
            "punsubscribe" 第一个字符串
            "a?e" 第二个订阅频道的模式
            (integer) 0 客户端订阅模式的数量

        pubsub channnels <pattern>
            列出当前活跃的频道,pattern匹配模式
        pubsub numsub [channel...channels>
            用于获取指定频道的订阅者的数量
        pubsub numpat 
            统计所有客户端运行psubscribe命令的次数.

八、持久化
    AOF
    说明:
        1> redis服务器每执行一条命令,就会加入带aof_buf缓存区中,在追加命令时,并没有直接写入文件而是追加命令到缓存区aof_buf末尾,目的避免频繁I/O
        2> aof文件写入和文件同步是根据appendfsync参数设置来把aof_buf同步到磁盘的。flushAppendOnlyFile函数来决定是否将aof_buf中的数据写入和保存在aof中,和这个函数和appendfsync参数有关,当appendfsync为no时,此时flushAppendOnlyFile函数会将缓存区aof_buf中的所有内容写入aof文件中,但不会同步aof文件,同步系统决定(通常30s)。
    AOF重写
    说明:
        子进程触发重写,redis进程内的数据转换为写命令,然后同步到新的aof文件中,在重写时,会创建一个新的aof文件替代旧的aof文件。
    目的:
        1>丢弃过期数据
        2>丢弃无效命令
        3>合并多条命令为一条
    触发方式:
        1>手动触发 bgrewriteaof和bgsave相似都是在启动时阻塞
        2>自动触发 auto-aof-rewrite-percentage 100 、auto-aof-rewrite-min-size 64mb 以及aof_current_size(当前aof文件大小)和aof_base_size(上一次aof文件大小)状态来确定何时触发)
    注意:
        redis为了防止执行命令时造成客户端溢出,在重写列表、hash表、集合、有序集合含有多个元素的键时,会提前检查键所包含的元素个数,如果64个,那么会拆分程多条命令(sadd、rpush)来记录数据。
    实现原理
        redis单独开子线程去进行重写,主线程仍然接受命令,但这样会造成数据不一致,redis引入了文件缓存区(aof_buf)和aof文件重写缓存区。在redis执行aof文件重写时,当执行一条命令会先加入aof文件缓存区,然后在把命令加入aof文件重写缓存区,当子进程完成了重写操作,会发送一个完成信号告诉主进程,当主进程收到信号之后,旧会调用信号处理函数把aof文件重写缓存区中的内容都写入新的aof文件中。只有在信号处理函数执行中,服务器进程会被阻塞、
    参数说明:
        appendonly yes 开启持久化机制
        appendfilename "my.aof" 修改aof文件名称
        dir ./ aof文件和rdb文件所在的目录
        # appendfsync always 每次写命令都会保存
        appendfsync everysec 每一秒保存一次
        # appendfsync no 
        no-appendfsync-on-rewrite no 重写aof文件时,是否禁止fsync 如果为yes,则减轻重写aof文件时cpu和硬盘负载,但同时可能会丢失重写aof过程中的数据。
        auto-aof-rewrite-percentage 100 对比上次生存的aof文件大小,如果当前的aof文件增长量大于上次aof文件的100%,就会处罚重写操作。
        auto-aof-rewrite-min-size 64mb 当aof文件达到64mb时会触发重写。 注意:aof触发重写必须同时满足auto-aof-rewrite-percentage和auto-aof-rewrite-min-size才会触发。
        aof-load-truncated yes 当aof文件结尾遭到损坏时,redis在启动时是否仍然加载aof文件
    aof文件被损坏之后服务器会拒绝加载这个文件
        1>备份现有aof
        2>redis自带的redis-check-aof来进行修复 redis-check-aof -fix aofname
        3>diff -u 对比原始aof和修复后的aof文件,找出不同
        4>修复aof文件之后重启服务器进行数据恢复。
    rdb
    说明:
        在指定的时间间隔内,redis会将内存中的所有数据以快照的方式保存在磁盘。
    触发条件
        1>自动触发
            配置文件中save 900 1 表示900秒内有1个或1个以上的键被修改就会生存快照文件,通过serverCron函数和dirty计数器以及lastsave时间戳实现
                serverCron每100毫秒执行一次,来查看save m n 是否满足,满足则会触发bgsave命令
                dirty计数器,记录上一次执行save或bgsave命令后,记录服务器进行了多少次的状态修改(删除、添加、修改),而不是客户端执行了多少次修改数据的命令(sadd name zhangsan lisi wangwu 计数器会加3,代表执行了3次),当执行完save或bgsave之后dirty重置为0。
                lastsave 记录上一次成功执行save或bgsave命令的时间,如果当前服务器时间减去lastsave大于m并且dirty计数器大于n才会自动触发快照保存。
        2>手动触发
            save(阻塞)、bgsave(异步不会阻塞)
        3>如果用户定义了自动快照条件,当执行flushall命令会清空库中的所有数据,就会触发服务器执行一次快照。(flushdb 清空数据库,但是不执行持久化操作)
        4>主从复制时,从节点执行全量复制操作,则主节点会执行bgsave命令,将执行完成之后的rdb文件发送给从节点完成快照操作。
    参数说明:
        dbfilename ""
        rdbcompression yes 对rdb文件压缩 默认开启状态
        stop-writes-on-bgsave-error yes 当执行bgsave出错时,redis是否终止执行写命令,默认是终止。
        rdbchecksum yes 是否开启rdb文件的校验。
    文件结构
        头部 redis(字符串),redis会以次字符串判断是不是rdb文件
        db_version rdb文件的版本号
        databases 各个数据库的键值对数据
        eof 标志rdb文件的正文结束
        check_sum 校验和,对redis、db_version、databases、eof 4部分计算得出,来判断rdb文件是否被损害或错误。
    注意:
        当执行bgsave过程中,当客户端发送save或bgsave都会拒绝,当bgrewriteaof会推迟到bgsave执行完成之后才会被执行,相反当执行bgrewriteaof会拒绝bgsave
        
九、redis主从复制
    说明
    1>主服务器不仅可以有从服务器,从服务器也可以有自己的从服务器。
    2>复制功能不会阻塞主服务器,即使有多个从服务器正在进行第一次同步,主服务器也可以继续处理客户端的命令请求。
    3>同理,复制功能也不会阻塞从服务器,即使是从服务器第一次同步,从服务器也可以使用旧版本的数据集来处理命令请求。
    4>当从服务器删除旧版本数据集并加载新版本数据集的时候,连接请求会被阻塞,直到加载完毕。
    slaveof ip port(port为主服务器端口)
    slaveof no one 取消复制
    配置master密码
        1>首先在主服务器设置config set requirepass 123456
        2>其次在从服务器设置config set  masterauth 123456 即可完成同步。
    slave-serve-stale-data yes 当slave和master断开连接或者复制正在进行时,slave有两种运行方式,
        当为yes时,服务器继续处理客户端的命令请求,当值为no时,表示服务器对除info和slaveof命令之外的任何命令都会返回一个错误。
    slave-read-only yes slave是否为只读,不建议设置为no。
    repl-diskless-sync no 是否使用socket方式复制数据。redis提供两种复制方式,disk和socket。如果新的slave连上或者重连slave无法实现部分同步,就会执行全量同步,master会生存rdb文件。
        disk方式,master会创建一个新的进程,先把rdb文件保存到磁盘,再把磁盘中的rdb文件传递给slave。保存rdb文件过程中,多个slave能共享rdb文件。
        socket方式,master会创建一个新的进程,直接把rdb文件以socket方式发送给slave,socket方式就是一个个slave顺序复制。
    repl-diskless-sync-delay 5 复制的延迟时间,默认5秒。其实是为了等待部分的slave连接上.
    repl-ping-slave-period 10 slave根据指定的时间间隔向master发起ping请求,默认时间间隔为10秒。
    repl-timeout 60 复制连接超时时间 60秒,如果slave检测到上次和master交互的时间超过了这个值,就会认为master离线。
    repl-disable-tcp-nodelay no 是否禁止复制tcp链接的tcp nodelay参数。如果此值为yes,会禁止使用tcp nodelay那么在把数据复制给slave的时候,会减少包的数量和网络带宽,同时也会带来数据延迟。
    repl-backlog-size 1mb 设置复制缓冲区的大小,保存复制的命令。当slave离线的时候,不需要完全复制master的数据。
    repl-backlog-ttl 3600 设置了一段时间,master和slave断开连接会释放复制缓冲区的内存。
    slave-priority 100 设置slave优先级,当master故障时,会选举一个master,值越小,越有可能被选中。
    min-slaves-to-write 3 提供了可以让master停止写入的方式,如果配置了选项,那么当健康的slave个数小于N时,master会禁止写入。
    min-slaves-max-lag 10 延迟时间小于10秒的slave才会被认为是健康的。否则master会禁止写入。
    全量同步
        处理第一次复制情况,通过让主服务器创建并发送rdb文件以及向服务器发送保存在缓冲区里面的写命令进行同步。
    部分同步
        从服务器重新连接到主服务器,主服务器可以将在从服务器断开连接期间执行最新写命令发送给从服务器,从服务器接受并执行写命令后,就可以将数据更新到主服务器相同的状态。
    psync命令替代了sync命令。
    部分同步
        1>主服务器的复制偏移量和从服务器的复制偏移量。执行复制操作,主从服务器都有一个复制偏移量.(主服务器同步一次会在自己的复制偏移量上加N)
            master_repl_offset为主服务器的复制偏移量,slave_repl_offset从服务器的复制偏移量.
        2>主从服务器的运行id,运行id在服务器启动的时候自动生成,当从服务器对主服务器进行初次复制同步时,从服务器会保存主服务器的id.当服务器离线,当再次连接主服务器时,那么从服务器会向主服务器发送之前保存id进行比对.
            1.当从服务器保存的id和当前所连接的主服务器id相同,则会进行部分同步.
            2.当从服务器保存的id和当前所连接的主服务器id不用,则不会进行全量同步.
        3>复制缓冲区
            主服务器维护一个固定长度,先进先出的队列.默认复制缓存区为1MB.作用是在同步的时候,保存新写的命令.
    psync命令实现过程
        1、从服务器第一次同步psync ? -1(? 代替runid -1 代替offset) 命令,主动请求主服务器执行全量同步操作,此时不能执行部分同步操作
        如果从服务器以及复制过主服务器,那么从服务器在开始一次新的复制时,会向主服务器发送psync runid offset 命令来判断执行哪种操作.
            1.当从服务器返回fullresync runid offset 表示对从服务器执行全量同步
            2.返回continue表示执行部分同步
            3.返回err 表示执行不了psync命令.
        2、主服务器接到从服务器的同步命令之后,判断slave做全量复制,把自己的runid和offset发送给slave.
        3、slave接收到之后及时保存.
        4、master执行bgsave命令生成rdb文件,在此期间新写的命令存到复制缓冲区.
        5、master生成rdb文件之后,发送rdb文件给slave.同时把复制积压缓冲区最新数据发送给slave.
        6、slave在接收rdb文件和复制缓冲区的数据之前会清空自身的数据.
    redis心跳机制
        1、从服务器以每秒一次的频率发送命令replconf ack <replication_offset(从服务器当前的偏移量)>到主服务器,检测主从服务器之间的网络连接情况,当主服务器超过1秒没有接收到从服务器发送过来的命令,就会认为网络连接出现了问题.
            lag(info 中slave查看),当lag值大于1秒,则表示主从服务器之间网络连接出现了问题.(正常情况lag[0-1])
        2、设置min-slaves防止主服务器在不安全的情况下执行写命令.
            min-slaves-to-write 3
            min-slaves=max-lag  10 
            当从服务器数量小于或等于3台从服务器的延迟时间超过10秒,主服务器会拒绝执行写命令.
        3、检测命令传播过程中是否有丢失.
            在主从服务器进行,传播会比对主从偏移量,如果丢失会补发从服务器.
    redis哨兵模式
        作用:
            1>监控主从服务器是否故障.
            2>故障转移
            3>当监控的服务器发生成故障,哨兵会向管理员发送通知.
        实现:
            1>创建sentinel26379.conf文件(sentinel26380.conf、sentinel26381.conf 配置一样)
            2>配置 
                port26379
                sentinel monitor mymaster 127.0.0.1 6379 2 #sentinel监控一个名为mymaster主服务器,当这个主服务器出现故障时,至少需要2个sentinel同意才能认定主服务器故障.
                sentinel down-after-milliseconds mymaster 30000 #sentinel认为服务器已经离线所需要的毫秒数 30s,如果服务器在指定的毫秒数没有sentinel发送的ping命令回复,那么sentinel会标记这台服务器为主观下线,等多个sentinel都将这台服务器标记为主观下线后,这台服务器就会标记为客观下线,然后触发故障转移.
                sentinel parallel-syncs mymaster 1 #会一个接一个挂到新的master上面去,一个挂完后,而且从新的master,sync完数据之后,再挂接下一个。
                sentinel failover-timeout mymaster 180000 #指定了在规定时间内(ms),如果没有完成failover操作,则认为failover失败。
            3>启动redis-server sentinel26379.conf --sentinel
            4>info sentinel 信息
                sentinel_masters:1  #sentinel的master的个数
                sentinel_tilt:0   #sentinel 是否进入了tilt模式
                sentinel_running_scripts:0 #sentinel 正在运行的脚本
                sentinel_scripts_queue_length:0 # sentinel在队列中正在排队的脚本的个数
                sentinel_simulate_failure_flags:0
                master0:name=mymaster,status=ok,address=127.0.0.1:6379,slaves=2,sentinels=1
            5>当sentinel启动成功,redis sentinel26379.conf 文件内容发生变化
                sentinel myid bf1282460e81f51082e3280d67219d8988a732f1
                sentinel monitor mymaster 127.0.0.1 6379 2
                sentinel config-epoch mymaster 0
                sentinel leader-epoch mymaster 0
                sentinel known-slave mymaster 127.0.0.1 6380
                sentinel known-slave mymaster 127.0.0.1 6381
                sentinel known-sentinel mymaster 127.0.0.1 26381 5990ac44bf4171fcac429d680bc0ce27f63d588f
                sentinel known-sentinel mymaster 127.0.0.1 26380 462390cd29ecd6326d13f57af14b8b0a39f93d76
                sentinel current-epoch 0
        哨兵模式常用命令:
                sentinel masters 查看哨兵监控的主服务器的相关信息及状态
                sentinel slaves <master name> 列出指定主服务器的所有从服务器的信息及状态。
                sentinel get-master-addr-by-name <master name> 返回指定名字的主服务器的ip端口信息
                sentinel reset<pattern> 重置所有名字和给定模式(pattern)相匹配的主服务器。一旦执行此命令,它会清除主服务器目前的所有状态,包括故障转移,以及删除目前已经发现和关联的、主服务器的所有从服务器和sentinel.
                sentinel failover<master name> 当主服务器出现故障时,在不询问其他sentinel意见下,强制开始一次自动故障转移操作,它会给另外的sentinel发送一个最新配置,其他sentinel接收到最新的配置后自动更新。
        获取主服务器的信息
                1、sentinel启动并完成初始化后,会以每10s一次的频率,并向主服务器发送info命令,然后根据回复信息来获取主服务器的当前信息(runid,和role),就可以对主服务器的实例进行更新,
                还可以自动主服务器从属服务器的信息,通过slave开头的行记录(ip,port)发现从服务器的信息。
                sentinel会把master和slave存入实例结构,会与新加入的从服务器建立连接之后,每10秒一次频率发送info命令,保存从服务器的(run_id,role,slave_priority优先级、复制偏移量slave_repl_offset、主服务器的ip,port,连接状态)
                2、sentinel向主从给服务器信息,以2s一次频率,发送命令
                    publish _sentinel_:hello频道,有多个参数 sentinel ip、port、runid、epoch(当前的配置纪元,版本号)、m_name主服务器的名字,m_ip 主服务器的ip地址。m_port,m_eoch主服务器配置纪元。
                    sentinel之间也会互相进行网络连接,检查对方可用性,每个sentinel都订阅了被它监控的主从服务器的_sentinel_:hello频道,用于判断查找新的sentinel.
                3、接收主从服务器的频道消息
                    当sentinel读取到_sentinel_:hello,会从消息中取出(sentinel的ip、port、runid),
                        当id和当前sentinelid相同,说明此信息时自己发送,不做处理。
                        当id和当前sentinelid不同,接收各个参数,对相应的主服务器的实例结构进行更新。
                4、监控主从服务器的下线状态和多个sentinel之间的下线状态
                5、完成故障转移
                    多个sentinel判断为客观下线后,sentinel内部会选出一个领导,让它去从slave中选出新的master,并让选中的slave执行slaveof no one命令。
                    sentinel会通知其余的slave成为新的master的slave,这些slave就会复制新的master数据,并在其余的slave中发送slaveof 命令来完成。
                    sentinel会通知相应的客户端新的master,就能避免客户端再去连接旧的master,从而导致读取数据失败的问题产生。
                    sentinel会一直监控旧的master,当旧的master复活之后,就会成为新的master的slave节点,然后在复制新的master数据。
        选择合适的slave节点作为新的master
                1、slave-priority 参数值最小的slave节点,如果不满足此条件,
                2、进一步判断slave节点的复制偏移量大,如果slave和master节点偏移量相同,
                3、根据slave的runid小的来选取,因为runid小的说明它时最早的一个节点。    
        sentinel下线状态
            sentinel每隔10s对master和slave执行Info命令,用于发送slave节点,以及发生故障时确认master与slave关系
            sentinel每隔2s通过master节点的_sentinel:hello频道交换信息,此信息包含sentinel节点的信息和它对master节点,slave节点所做的一些判定信息。
            每隔1s,每个sentinel对其他的sentinel和redis节点执行ping命令,用于心跳检测。            

十、redis集群
    多个节点组成,节点之间共享数据。
    cluster meet ip port 连接各个独立节点,然后加入集群。(meet完成节点相互通信)
    redis为了存储大量数据,采用分片的方式将大量数据保存在数据中,并分为16384个槽。
    实战
        1、 cluster-enabled yes 开启集群
            cluster-config-file nodes-6379.conf 集群所采用配置文件
            cluster-require-full-coverage no 是否需要集群中的所有节点都对外提供,yes表示集群中的一个服务器宕机则不会对外提供服务。
            cluster-node-timeout 15000 表示故障转移的时间或节点超时的时间15s
        2、meet操作(如果用ruby此步骤省略)
            cluster meet 127.0.0.1 6380 建立相连
        cluster info
            cluster_state:ok 集群处于上线状态
            cluster_slots_assigned:3 表示槽的总个数
            cluster_slots_ok:3 表示槽的状态是ok的个数
            cluster_slots_pfail:0
            cluster_slots_fail:0
            cluster_known_nodes:1 表示已经建立连接的节点数
            cluster_size:1 表示指派槽的节点个数
            cluster_current_epoch:0
            cluster_my_epoch:0
            cluster_stats_messages_sent:0
            cluster_stats_messages_received:0
        3、addslots 指派槽(Windows的redis安装文件中是没有这个文件的,我们需要去官网下载Redis,官网的Redis是Linux版本,在其源码src文件夹下,将redis-trib.rb拷贝到本机中Redis的安装目录中)
            ruby redis-trib.rb create --replicas 1 127.0.0.1:6379 127.0.0.1:6380 127.0.0.1:6381 127.0.0.1:6382 127.0.0.1:6383 127.0.0.1:6384
            分配三主三从节点。(前三主、后三从)
            
            gem install --local D:\java\soft\ruby\Ruby23-x64\redis-3.2.2.gem 下载ruby支持redis驱动
        4、cluster slots 查看集群槽的指派信息,同时也能看到主从关系
        5、操作key
            127.0.0.1:6379> set name lisi
            (error) MOVED 5798 127.0.0.1:6380
            redis通过算法来计算key属于哪个槽,通过127.0.0.1:6379> cluster keyslot name 返回(integer) 5798来得知。
        6、redis重新分片
            将已经分配的槽重新分配给新的目标节点,重新分片后,相关槽的键值对也会从源节点转移到目标节点。
            具体思路:
                1、redis-trib会对目标节点发送指令,告诉trib有新的键值对所对应的槽会被导入
                2、redis-trib会对源节点发送指令,告诉trib属于槽的键值对将会被转移到目标节点
                3、redis-trib会对源节点发送指令,来从源节点获取count个属于槽的键值对的键名
                4、redis-trib向源节点发送命令,将选中的键名及其值移到目标节点,一直循环执行该命令,直到完成
                5、redis-trib向集群中任意一个节点发送指令,来通知集群中的所有节点,槽已经转移。
            实战:
                修改port、cluster-enabled、cluster-config-file、cluster-require-full-coverage之后启动两个新端口(6385、6386)
                1、添加新节点
                    redis-trib.rb add-node 127.0.0.1:6385 127.0.0.1:6379
                2、把这个节点变成主节点,使用redis-trib程序,将集群中的某些哈希槽移动到新节点里面, 这个新节点就成为真正的主节点了。
                    redis-trib.rb reshard 127.0.0.1:6379
                   系统会提示我们要移动多少哈希槽,这里移动1000个
                   
                   然后还需要指定把这些哈希槽转移到哪个节点上
                   
                   输入我们刚才新增的节点的ID
                   
                   输入all 表示从所有的主节点中随机转移,凑够1000个哈希槽
                   
                   然后再输入yes,redis集群就开始分配哈希槽了。
                   
                   至此,一个新的主节点就添加完成了。
                   
                   添加从节点
                    redis-trib.rb add-node 127.0.0.1:6386 127.0.0.1:6379
                    将6386变为6385的从节点
                    redis-cli.exe -c -p 6386 cluster replicate e42fd447712cd23816e67d2d56feb12e399bf454
                3、删除节点
                    首先要把节点中的槽移到其他节点
                    redis-trib.rb reshard 127.0.0.1:6379
                    系统会提示我们要移动多少哈希槽,这里移动1000个,因为127.0.0.1:6385节点有1000个哈希槽

                    然后系统提示我们输入要接收这些哈希槽的节点的ID,这里使用127.0.0.1:6379的节点ID

                    然后要我们选择从那些节点中转出哈希槽,这里一定要输入127.0.0.1:6385这个节点的ID,最后输入 done  表示输入完毕

                    此时从节点6386挂载到6379成为从节点
                    
                    最后一步,使用下面的命令把这个节点删除
                    redis-trib.rb del-node 127.0.0.1:6385 e42fd447712cd23816e67d2d56feb12e399bf454
                    
                    如果节点是从节点的,直接使用下面的命令删除即可。
                    redis-trib.rb del-node 127.0.0.1:6386 5822d390088344d602eec64df0e072632b0f74bf

        7、节点互相通信
            1、ping消息 各个节点互相发送ping消息,来检测是否在线, 每个节点以每隔1s就会从已知节点列表中随机选出5个节点,然后对这5个节点中最长时间没有发送ping消息的节点发送ping来确定是否在线。
            2、pong消息 消息收到ping或meet消息后,会回复pong。另外一个节点也可以向其他节点广播自己的pong消息,来让其他节点确认自己的在线状态
            3、meet消息 让其他消息接受者成为集群中的节点
            4、fall消息 当一个主节点(m1)判断另一个主节点进(m2)入下线状态,会通知其他节点,其他节点接收到主节点(m1)发送过来的fall消息会立即将(m2)标记为下线状态,m1从节点进行master选举,(m2)从节点代替这个(m2)主节点,完成故障转移。
                如果没有从节点,则这个主节点宕机它所分配的槽不会丢失,直到主节点恢复(从节点恢复只会成为这个主节点从节点,并不会代替主节点)
            5、publish消息 集群中的某个节点收到一条publish命令,该节点再去执行这条命令,同时向集群中其他节点广播这个publish消息,然后其他节点再去执行publish命令
十一、geo(地理位置3.2版本之后引入)
    geoadd location-set longitude latitude name [longitude latitude name ...]  存储地理位置信息
        location-set 存储地理位置集合 longitude latitude name 经度、纬度、名称
        geoadd city 114.0661345267 22.5485544122 shenzhen
        geoadd city 111.748280 37.286050 lijiazhuang
    geopos location-set name [name ...]
        geopos city shenzhen 查询地理位置信息
        1) 1) "114.06613379716873" 经度
           2) "22.548553721810329" 纬度
    geodist location-set name1 name2 [unit](km、m、mi、ft)计算两个地理位置之间的距离 
        geodist city shenzhen lijiazhuang km
    georadius key longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DESC] 选取的中心点是用户给定的经纬度信息
        参数说明
            radius 指定的范围半径 m|km|ft|mi 距离单位
            WITHCOORD 将地理位置的经纬度信息一起返回
            WITHDIST 返回位置元素的同时,将中心点与位置元素之间的距离一起返回,单位保持一致
            WITHHASH 返回位置元素经过原始geohash编码的有序集合的分值,52位整数不常用
            COUNT 返回的结果数量
            [ASC|DESC] 从近到远|从远到近
        实例
            georadius city 112.548879 37.870590 2000 km withdist desc 查询以太原为中心点距离2000km的坐标
            1) 1) "shenzhen"
               2) "1710.3671"
            2) 1) "lijiazhuang"
               2) "95.9549"
            georadius city 112.548879 37.870590 2000 km WITHCOORD count 1 desc
            1) 1) "shenzhen"
            2) 1) "114.06613379716873"
            2) "22.548553721810329"
    georadiusbymember key member radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DESC] 选取的中心点是存储在redis位置集合中的某个地理位置信息
        实例
            georadiusbymember city lijiazhuang 1900 km WITHCOORD desc 以lijiazhuang名称为中心点
            1) 1) "shenzhen"
                2) 1) "114.06613379716873"
                    2) "22.548553721810329"
            2) 1) "lijiazhuang"
                2) 1) "111.74828141927719"
                    2) "37.286051153054508"              

        

        

        

       

   

    

    

    

         

    

        

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值