Redis

Redis概述


Redis是什么

  1. Redis(Remote Dictionary Server 远程字段服务)是一个开源的使用ANSI C语言编写、支持网
    络、内存亦可持久化的key-value数据库,并提供多种语言的API。
  2. Redis是一个key-value存储系统,它支持存储的value类型相对更多,包括string、list、set、
    zset(sorted set --有序集合)和hash。这些数据结构都支持push/pop、add/remove及取交集并
    集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,Redis支持各种不同方式的
    排序。为了保证效率,数据都是缓存在内存中,Redis会周期性的把更新的数据写入磁盘或者把修
    改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。
  3. Redis提供了java、C/C++、PHP、JavaScript、Perl、Object-C、Python、Ruby、Erlang等客户
    端,使用很方便。

Redis能干嘛

  1. 读写效率高,用于高速缓存
  2. 发布,订阅消息(消息通知)
  3. 地图信息分析
  4. 活动排行榜或计数
  5. …………

Redis特点

  1. 多样的数据类型:Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,
    hash等数据结构的存储。
  2. Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使
    用。
  3. Redis的所有操作都是原子性的。
  4. 支持主从复制及集群。

Redis安装


下载地址

Redis官方网址:Downloads - Redis

没注册要先注册,不懂就搜。

下载Redis

  1. 下滑找到Install Redis from source

在这里插入图片描述

  1. 下载到/opt目录下

    cd /opt
    wget https://download.redis.io/releases/redis-7.0.15.tar.gz
    
  2. 解压,解压后得到redis-stack-server-7.2.0-v10目录

    解压命令:

    tar -zxvf redis-7.0.15.tar.gz
    

安装GCC

安装C语言编译环境

yum group install "Development Tools" -y

通过使用 gcc --version 命令打印 GCC 版本,来验证 GCC 编译器是否被成功安装:

gcc --version

安装Redis

  1. 编译Redis
    在redis-7.0.15目录下执行:
cd redis-stack-server-7.2.0-v10/
make

出现下图代表编译成功

在这里插入图片描述

  1. 安装Redis

    在redis-7.0.15下执行:

    make install
    

    出现下图代表安装成功

    在这里插入图片描述

  2. 安装目录: /usr/local/bin

    在这里插入图片描述

    redis-benchmark:Redis自带的基准性能测试工具
    redis-check-aof:对有问题的 AOF 文件进行修复,AOF和RDB文件后面会说明
    redis-check-rdb:对有问题的 RDB文件进行修复
    redis-sentinel:Redis集群使用
    redis-cli:客户端
    redis-server:服务器启动

  3. 服务启动

    前台启动:/usr/local/bin下执行

    在这里插入图片描述

    后台启动:

    拷贝redis-6.2.4目录中的redis.conf文件到其他目录

    mkdir /usr/local/myredis
    cd /opt/redis-7.0.15/
    cp redis.conf /usr/local/myredis/redis.conf
    

    设置/usr/local/myredis/redis.conf文件中的daemonize属性,由no改为yes

    cd /usr/local/myredis/
    vim redis.conf
    

    在这里插入图片描述

    在/usr/local/bin下执行

    cd /usr/local/bin/
    ./redis-server /usr/local/myredis/redis.conf
    

    通过ps aux | grep redis-server查看服务是否启动

    ps aux | grep redis-server
    

    在这里插入图片描述

  4. 客户端启动

    /usr/local/myredis/下执行

    cd /usr/local/myredis/
    redis-cli
    

    在这里插入图片描述

    ping命令可以检测服务器是否正常(服务器返回PONG)

    ping
    

    在这里插入图片描述

Redis基本知识


  1. 端口6379的由来

    6379 = Merz

    在这里插入图片描述

    Merz全名Alessia Merz,是意大利的一位广告女郎。

  2. 默认有16个数据库,且初始状态默认选择0号数据库(即第一个数据库)。

  3. 可以使用select 进行数据库切换。

    select 8 切换到8号数据库
    
  4. 统一密码管理,所有库密码都一致。

  5. dbsize-查看当前数据库的key数量。

  6. flushdb-清空当前库。

  7. flushall-清空所有库。

  8. 为什么Redis是单线程且效率极高:

    • 绝大部分请求是纯粹的内存操作。
    • 避免了不必要的上下文切换和竞争条件,也不存在多进程或者多线程导致的切换而消耗 CPU,
    • 不用去考虑。各种锁的问题,不存在加锁释放锁操作。
    • 使用IO多路复用技术,可以处理并发的连接。

Redis数据类型


key键

  1. keys * 查看当前库中所有的key 。

在这里插入图片描述

  1. exists key 判断某个key是否存在。

    可以设置多个key,只返回存在的个数,但不返回哪一个存在/不存在。

    exists k1 查看k1是否存在,如果存在返回1
    exists k1 k2 k3 查看k1 k2 k3是否存在,如果k1 k2存在,k3不存在,则返回2
    

    在这里插入图片描述

  2. move key db 将当前数据库的 key 移动到给定的数据库 db 当中。

    move k1 8 将k1从当前数据库移动到8号库
    
  3. type key 查看当前key 所储存的值的类型。

    返回当前key所储存的值的类型,如string 、list等。
    在这里插入图片描述

  4. del key 删除已存在的key,不存在的 key 会被忽略。

    可以设置多个key,返回删除成功的个数。

    del k1 删除k1,如果成功返回1,失败返回0
    del k1 k2 k3 删除k1 k2 k3,如果k1 k2存在,k3不存在,则返回2
    

    在这里插入图片描述

  5. expire key time 给key设置time秒的过期时间。

    设置成功返回 1 。 当 key 不存在返回 0。

    expire k1 10 给k1设置10秒后过期
    
  6. ttl key 以秒为单位返回 key 的剩余过期时间。

    当 key 不存在时,返回 -2 。 当 key 存在但没有设置剩余生存时间时,返回 -1 。 否则,以秒为单位,返回 key 的剩余生存时间。

  7. persist key 移除给定 key 的过期时间,使得 key 永不过期。

    当过期时间移除成功时,返回 1 。 如果 key 不存在或 key 没有设置过期时间,返回 0 。

五大数据类型-String(字符串)

简介

  • String是Redis最基本的类型,一个key对应一个value。
  • String是二进制安全的,意味着String可以包含任何数据,比如序列化对象或者一张图片。
  • String最多可以放512M的数据。

String底层数据结构

  • String底层数据结构是简单动态字符串(simple dynamic string,SDS)。
  • 类似于 Python 中的 List ,采用预分配方式来减少内存的频繁分配。

在这里插入图片描述

如图,内存实际大小一般都要高于字符串实际大小。当字符串长度小于1M时,扩容都是加倍现有的空
间,如果超过1M,扩容时每次只会多扩1M的空间。字符串最大长度为512M。

常用命令

  1. set key value 用于设置给定 key 的值。如果 key 已经存储其他值, set 就重写旧值,且无视类型。

    set k1 v1 向Redis中设置一个k1的键值对
    set k1 100 将k1的值由v1重置为100
    

    在这里插入图片描述

  2. get key 用于获取指定 key 的值。如果 key 不存在,返回 nil 。

    在这里插入图片描述

  3. append key value 将给定的value追加到key原值末尾。

    如果 key 已经存在并且是一个字符串, append 命令将 value 追加到 key 原来的值的末尾。
    如果 key 不存在, append 就简单地将给定 key 设为 value ,就像执行 set key value 一样。

    append k2 v2 在Redis中不存在k1,所以直接设置k1的值为v2
    append k1 v2 向k1的值末尾添加一个v2,最终结果为100v2
    

    在这里插入图片描述

  4. strlen key 获取指定 key 所储存的字符串值的长度。当 key 储存的不是字符串值时,返回一个错误。

    在这里插入图片描述

  5. setex key time value 给指定的 key 设置值及time 秒的过期时间。如果 key 已经存在, setex命令将会替换旧的值,并设置过期时间。

    setex k1 10 v1 向Redis中设置一个k1的键值对并且10秒后过期
    

    在这里插入图片描述

  6. setnx key value当key不存在时,设置给定 key 的值。如果key存在,则没有任何影响。

    setnx k1 v1 向Redis中设置一个k1的键值对
    setnx k1 v2 Redis中存在k1,则没有影响,k1的值仍然为v1
    

    在这里插入图片描述

  7. incr key 将 key 中储存的数字值增一。

    如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 incr 操作。
    如字符串类型的值不能表示为数字、或者是其他类型,那么返回一个错误。

    incr k3 因为Redis中不存在k3,所以先初始化为0,再递增,值为1
    incr k3 存在k3,递增后k3的值为2
    incr k1
    incr k2 因为k1,k2不为数值,Redis返回一个错误
    

    在这里插入图片描述

  8. decr key将 key 中储存的数字值减一。

    如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 decr 操作。
    如字符串类型的值不能表示为数字、或者是其他类型,那么返回一个错误。

    decr k4 因为Redis中不存在k4,所以先初始化为0,再递增,值为-1
    decr k4 存在k4,递增后k1的值为-2
    decr k2 因为k2不为数值,Redis返回一个错误
    

    在这里插入图片描述

  9. incrby/decrby key step 将key存储的数字值按照step进行增减。

    如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 incrby/decrby 命令。
    如字符串类型的值不能表示为数字、或者是其他类型,那么返回一个错误。

    在这里插入图片描述

  10. mset key1 value1 key2 value2 ……同时设置一个或多个 key-value 。

    mset k1 v1 k2 v2 k3 v3 同时向Redis中设置了k1 k2 k3
    

    在这里插入图片描述

  11. mget key1 key2 ……返回所有(一个或多个)给定 key 的值。

    如果给定的 key 里面,有某个 key 不存在,那么这个 key 返回特殊值 nil 。

    mget k1 k2 k3 k4 k5 k6 同时获取k1 k2 k3 k4 k5 k6
    

    在这里插入图片描述

  12. msetnx key1 value1 key2 value2 ……用于所有给定 key 都不存在时,同时设置一个或多个key-value 。

    msetnx具有原子性特性,有一个失败,则都失败。

    msetnx k6 v6 k7 v7 向Redis中设置k6 k7两个键值对
    msetnx k1 v6 k8 v8 Redis中存在k1,k1设置失败,由于原子性特性,k8也设置失败
    

    在这里插入图片描述

  13. getrange key start end用于获取存储在指定 key 中字符串的子字符串。字符串的截取范围由start 和 end 两个偏移量决定(包括 start 和 end 在内)。

    set java helloworld 设置一个key为java,value为helloworld的值
    getrange java 0 3 获取索引0-3的值,结果为hell
    

    在这里插入图片描述

  14. setrange key offset value用指定的字符串重写给定 key 所储存的字符串值,重写的位置从偏移量 offset 开始。

    set java helloworld 设置一个key为java,value为helloworld的值
    setrange java 5 baizhan 从偏移位置5(w)开始,用baizhan重写key
    

    在这里插入图片描述

五大数据类型-List(列表)


简介

List是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。

底层是一个双向链表,对两段操作性能极高,通过索引操作中间的节点性能较差。

在这里插入图片描述

一个List最多可以包含 2 32 − 1 2^{32}-1 2321个元素 ( 每个列表超过40亿个元素)。

常用命令

敲命令前先清除所有key和values

FLUSHALL

在这里插入图片描述

  1. lpush/ rpush key1 value1 value2 value3……从左边(头部)/右边(尾部)插入一个或多个值。
lpush k1 v1 v2 v3    从左边放入v1 v2 v3

在这里插入图片描述

在这里插入图片描述

rpush k1 v4 v5 v6 从右边放入v4 v5 v6

在这里插入图片描述

在这里插入图片描述

  1. lrange key start end返回key列表中的start和end之间的元素(包含start和end)。 其中 0 表示列表的第一个元素,-1表示最后一个元素。

    lrange k1 0 2 取出列表里前3个值,结果为v3 v2 v1
    lrange k1 0 -1 取出列表里全部值,结果为v3 v2 v1 v4 v5 v6
    

    在这里插入图片描述

  2. lpop/rpop key移除并返回第一个值/最后一个值。值在键在,值光键亡。

    lpop k1 从列表中删除v3,并返回,当前列表全部值v2 v1 v4 v5 v6
    rpop k1 从列表中删除v6,并返回,当前列表全部值v2 v1 v4 v5
    

    在这里插入图片描述

  3. lindex key index 获取列表index位置的值(从左开始)。

     lindex k1 3
    

    在这里插入图片描述

  4. llen key获取列表长度。

    llen k1
    

    在这里插入图片描述

  5. lrem key count value从左边开始删除与value相同的count个元素。

    lrem k1 2 v1 从左边开始删除k1列表中2个v1元素
    

    在这里插入图片描述

  6. linsert key before/after value newvalue 在列表中value值的前边/后边插入一个newvalue值(从左开始)。

    linsert k1 before v2 v5 在v2前面插入一个v5
    

    在这里插入图片描述

  7. lset key index value将索引为index的值设置为value

     lset k1 1 v1
    

    在这里插入图片描述

五大数据类型-Set(集合)


简介

与List类似是一个列表功能,但Set是自动排重的,当需要存储一个列表数据,又不希望出现重复数据时,Set是一个很好的选择。

Set是String类型的无序集合,它底层其实是一个value为null的hash表,所以添加、删除、查找的时间复杂度都是O(1)。

一般来说,一个算法如果是O(1),随着数据增加,查找数据的时间不变。

集合中最大的成员数为 2 32 − 1 2^{32}-1 2321( 每个集合超过40亿个元素)。

常用命令

敲命令前先清除所有key和values

FLUSHALL

在这里插入图片描述

  1. sadd key value1 value2……将一个或多个元素添加到集合key中,已经存在的元素将被忽略。

    sadd k1 v1 v2 v2 v3 v4 v5 v6向集合中添加值,最终只有v1 v2 v3 v4 v5 v6
    

    在这里插入图片描述

  2. smembers key取出该集合的所有元素。

    smembers k1
    

    在这里插入图片描述

  3. srandmember key count随机取出集合中count个元素,但不会删除。

    srandmember k1 2 随机取出集合中的2个元素
    

    在这里插入图片描述

  4. sismember key value判断集合key中是否含有value元素,如有返回1,否则返回0。

    sismember k1 v1
    

    在这里插入图片描述

  5. scard key返回该集合的元素个数。

    scard k1
    

    在这里插入图片描述

  6. smove sourcekey destinationkey value将value元素从sourcekey集合移动到destinationkey集合中。

    如果 sourcekey集合不存在或不包含指定的 value元素,则 smove 命令不执行任何操作,仅返回 0。

    smove k1 k2 v5 将元素v5从集合k1中移动到集合k2
    

    在这里插入图片描述

  7. srem key value1 value2……删除集合中的一个或多个成员元素,不存在的成员元素会被忽略。

    srem k1 v1 v2 删除v1 v2
    

    在这里插入图片描述

  8. spop key随机删除集合中一个元素并返回该元素。

    spop k1 随机删除一个元素,并返回
    

    在这里插入图片描述

  9. sinter key1 key2返回两个集合的交集元素。

    sadd k1 v1 v2 v3 v4 v5 v6	往k1添加值
    sadd k2 v5 v6	往k2添加值
    smembers k1	查看k1的值
    smembers k2	查看k2的值
    
    sinter k1 k2
    

    在这里插入图片描述

    在这里插入图片描述

  10. sunion key1 key2返回两个集合的并集元素。

    sunion k1 k2
    

    在这里插入图片描述

  11. sdiff key1 key2返回两个集合的差集元素(key1中的,不包含key2)

    在这里插入图片描述

    sdiff k2 k1 返回v4 v5
    

    在这里插入图片描述

五大数据类型-Zset(有序集合)


简介

Zset与Set非常相似,是一个没有重复元素的String集合。

不同之处是Zset的每个元素都关联了一个分数(score),这个分数被用来按照从低分到高分的方式排序集合中的元素。集合的元素是唯一的,但分数可以重复。

因为元素是有序的,所以可以根据分数(score)或者次序(position)来获取一个范围内的元素。

常用命令

敲命令前先清除所有key和values

FLUSHALL

在这里插入图片描述

  1. zadd key score1 value1 score2 value2……将一个或多个元素(value)及分数(score)加入到有序集key中。

    如果某个元素已经是有序集的元素,那么更新这个元素的分数值,并通过重新插入这个元素,来保
    证该元素在正确的位置上。

    分数值可以是整数值或双精度浮点数。

    如果有序集合 key 不存在,则创建一个空的有序集并执行 zadd 操作。

    zadd k1 100 python 200 js 300 sql 400 css
    

    在这里插入图片描述

  2. zrange key start end [withscores] 返回key集合中的索引start和索引end之间的元素(包含start和end)。

    其中元素的位置按分数值递增(从小到大)来排序。 其中 0 表示列表的第一个元素,-1表示最后一个元素。

    withscores是可选参数,是否返回分数。

    zrange k1 0 -1 返回集合中所有元素
    zrange k1 0 -1 withscores 返回集合中所有元素,并携带元素分数
    

    在这里插入图片描述

  3. zrangebyscore key minscore maxscore [withscores] 返回key集合中的分数minscore 和分数maxscore 之间的元素(包含minscore 和maxscore )。其中元素的位置按分数值递增(从小到大)来排序。

    zrangebyscore k1 200 400 返回200-400分之间的元素递增排序
    

    在这里插入图片描述

  4. zrevrangebyscore key maxscore minscore [withscores] 返回key集合中的分数maxscore和分数minxscore 之间的元素(包含maxscore和minxscore )。其中元素的位置按分数值递减(从大到小)来排序。

    zrevrangebyscore k1 400 200 返回200-400分之间的元素递减法排序
    

    在这里插入图片描述

  5. zincrby key increment value为元素value的score加上increment的值。

    zincrby k1 50 java 给java元素加上50分
    

    在这里插入图片描述

  6. zcount key minscore maxscore统计该集合在minscore 到maxscore分数区间中元素的个数。

    zcount k1 100 300 统计100分到300分中间元素的个数
    

    在这里插入图片描述

  7. zrank key value返回value在集合中的排名,从0开始。

    zrank k1 sql 返回sql排名
    

    在这里插入图片描述

  8. zrem key value删除该集合下value的元素。

    zrem k1 css 删除css
    

    在这里插入图片描述

五大数据类型-Hash(哈希)


简介

Hash是一个键值对的集合。

Hash 是一个 String 类型的 field(字段) 和 value(值) 的映射表,hash 特别适合用于存储对象。

Hash 是 Redis 中出现最为频繁的复合型数据结构,除了 dict 结构的数据会用到Hash外,整个 Redis 数据 库的所有 key 和 value 也组成了一个全局Hash,还有带过期时间的 key 集合也是一个Hash。set集合相 当于一个value为null的Hash,zset 集合中存储 value 和 score 值的映射关系也是通过 hash 结构实现 的。

每个 Hash 可以存储 2^32 - 1 键值对(40多亿)

在这里插入图片描述

常用命令

  1. hset key field value给key集合中的field赋值value。

    如果哈希表不存在,一个新的哈希表被创建并进行 HSET 操作。

    如果字段已经存在于哈希表中,旧值将被重写。

    hset user name czx	创建一个key为user的哈希,并创建name字段,给name字段赋值为cxz
    hset user age 22	在key为user的哈希中,创建age字段赋值为22
    hset user name tuzhon	将key为user的哈希name字段修改为tuzhon
    

    在这里插入图片描述

  2. hget key field从key哈希中,取出field字段的值。

    hget user name	从key为user的哈希中取出name字段的值,结果为tuzhon
    

    在这里插入图片描述

  3. hmset key field1 value1 field2 value2……批量设置哈希的字段及值。

    hmset user1 name cxz age 15	创建一个key为user1的哈希,有两个字段name和age
    

    在这里插入图片描述

  4. hsetnx key field value 给key哈希表中不存在的的字段赋值 。

    如果哈希表不存在,一个新的哈希表被创建并进行 hsetnx 操作。

    如果字段已经存在于哈希表中,操作无效。

    如果 key 不存在,一个新哈希表被创建并执行 hsetnx 命令。

    hsetnx user name cxz	已经存在显示0,设置失败
    hsetnx user2 name cxz	显示1,设置成功
    

    在这里插入图片描述

    在这里插入图片描述

  5. hexists key field 判断指定key中是否存在field

    如果哈希表含有给定字段,返回 1 。 如果哈希表不含有给定字段,或 key 不存在,返回 0 。

    hexists user name	
    

    在这里插入图片描述

  6. hkeys key获取该哈希中所有的field。

    hkeys user
    

    在这里插入图片描述

  7. hvals key获取该哈希中所有的value。

    hvals user
    

    在这里插入图片描述

  8. hincrby key field increment为哈希表key中的field字段的值加上增量increment。

    增量也可以为负数,相当于对指定字段进行减法操作。

    如果哈希表的 key 不存在,一个新的哈希表被创建并执行 hincrby 命令。

    如果指定的字段不存在,那么在执行命令前,字段的值被初始化为 0 。

    对一个储存字符串值的字段执行 hincrby 命令将造成一个错误。

    hincrby user age 10
    hincrby user age -5
    hincrby user age -30
    

    在这里插入图片描述

  9. hdel key field1 field2……删除哈希表 key 中的一个或多个指定字段,不存在的字段将被忽略。

    返回被成功删除字段的数量,不包括被忽略的字段。

    hdel user name age	删除user中的name和age字段
    

    在这里插入图片描述

  10. hgetall key获取在哈希表中指定 key 的所有字段和值

    hgetall user1
    

    在这里插入图片描述

新数据类型-Bitmaps


简介

在计算机中,用二进制(位)作为存储信息的基本单位,1个字节等于8位。

例如 “abc” 字符串是由 3 个字节组成,计算机存储时使用其二进制表示,"abc"分别对应的ASCII码是 97、98、99,对应的二进制是01100001、01100010、01100011,在内存中表示如下:

在这里插入图片描述

合理地使用 位 能够有效地提高内存使用率和开发效率。

Redis提供了Bitmaps这个 “数据结构” 可以实现对位的操作:

  1. Bitmaps 本身不是一种数据结构,实际上它就是字符串(key 对应的 value 就是上图中的一串二进 制),但是它可以对字符串的位进行操作。

  2. Bitmaps 单独提供了一套命令,所以在 Redis 中使用 Bitmaps 和使用字符串的方法不太相同。可 以把 Bitmaps 想象成一个以位为单位的数组,数组的每个单元只能存储 0 和 1,数组的下标在 Bitmaps中叫做偏移量。

    在这里插入图片描述

常用命令

  1. setbit key offset value设置Bitmaps中某个偏移量的值。

    偏移量从0开始,且value值只能为0或1。

    setbit sign 0 1 设置sign的第一位值为1
    setbit sign 1 1 设置sign的第二位值为1
    setbit sign 2 0 设置sign的第三位值为0
    setbit sign 3 1 设置sign的第四位值为1
    
  2. getbit key offset 获取Bitmaps中某个偏移量的值。

    获取key的offset 的值。

    getbit sign 3 获取偏移量为3的值,结果为1
    

    在这里插入图片描述

    如果偏移量未设置值,则也返回0。

    getbit sign 99 获取偏移量为99的值,结果为0
    

    在这里插入图片描述

  3. bitcount key [start end]统计字符串被设置为1的bit数量。一般情况下,给定的整个字符串都会 被进行统计,可以选择通过额外的start和end参数,指定字节组范围内进行统计(包括start和 end),0表示第一个元素,-1表示最后一个元素。

    bitcount sign 获取整个字符串被设置为1的bit数量,结果为3
    

    如:当前存在一个key为k1的bitmaps存储着[00000001,00000001,00000010,00000011],分别对 应[1,1,2,3]。

    setbit num 7 1
    setbit num 15 1
    setbit num 22 1
    setbit num 30 1
    setbit num 31 1
    bitcount num 1 2 统计索引1、2两个字节组中bit=1的数量,即统计00000001,00000010中
    bit=1的数量,结果为2
    bitcount num 1 3 统计索引1、2、3三个字节组中bit=1的数量,即统计
    00000001,00000010,00000011中bit=1的数量,结果为4
    bitcount num 0 -1 统计所有的字节组中bit=1的数量,结果为5
    

    setbit设置或获取的是bit(位)的位置,bitcount计算的是byte(字节)位置。

  4. bitop and/or destkey sourcekey1 sourcekey2……将多个bitmaps通过求交集/并集方式合并成 一个新的bitmaps。

    bitop and k3 k1 k2 通过求交集将k1 k2合并成k3
    bitop or k3 k1 k2 通过求并集将k1 k2合并成k3
    

    在这里插入图片描述

新数据类型-Geospatia


简介

GEO,Geographic,地理信息的缩写。

该类型就是元素的二维坐标,在地图上就是经纬度。Redis基于该类型,提供了经纬度设置、查询、范围 查询、距离查询、经纬度Hash等常见操作。

常用命令

  1. geoadd key longitude latitude member [longitude latitude member ………]用于存储指定 的地理空间位置,可以将一个或多个经度(longitude)、纬度(latitude)、位置名称(member)添加到 指定的 key 中。

    geoadd longitude 116.405285 39.904989 beijing 将北京的经纬度和名称添加到longitude
    geoadd longitude 104.065735 30.659462 chengdu 121.472644 31.231706 shanghai	将成都和上海的经纬度、名称添加到longitude
    

    在这里插入图片描述

    有效的经度:-180 ~ +180 有效的纬度:-85.05 ~ +85.05,当设置的经度纬度值超过范围会报错。

    两级无法直接添加。

    一般会直接下载城市数据,直接通过 Python 程序直接一次性导入。

  2. geopos key member [member ……]**从给定的 key 里返回所有指定名称(member)的位置(经度 和纬度),不存在的返回 nil。

    geopos longitude shanghai beijing
    

    在这里插入图片描述

  3. geodist key member1 member2 [m|km|ft|mi]用于返回两个给定位置之间的距离。

    geodist longitude shanghai beijing	返回shanghai和beijing之间的距离,单位米
    geodist longitude shanghai beijing km	返回shanghai和chengdu之间的距离,单位千米
    

    在这里插入图片描述

  4. georadius key longitude latitude radius m|km|ft|mi 以给定的经纬度(longitude latitude)为中心, 返回键包含的位置元素当中, 与中心的距离不超过给定最大距离(radius )的 所有位置元素。

    georadius longitude 116 40 1200 km	获取经纬度116 40为中心,在longitude内1200公里
    范围内的所有元素。
    

    在这里插入图片描述

新数据类型-Hyperloglog


简介

在我们做站点流量统计的时候一般会统计页面UV(独立访客:unique visitor)和PV(即页面浏览量:page view)。

什么是基数?

数据集{1,2,5,7,5,7,9},那么这个数据集的基数集为{1,2,5,7,9},基数(不重复元 素)为5,基数估计就是在误差可接受范围内,快速计算基数。

如果是通过Redis来处理,我们可以使用String类型然后自增计数即可达到统计PV,统计UV可以使用 Set,每个用户id是唯一的可以放到这个集合里。

以上方案虽然结果准确,但随着数据不断增加,导致占用的内存空间越来越大,对于非常大的数据集是 不合适的。

Hyperloglog 是一种基数估算统计,在输入元素的数量特别巨大时,计算基数所需的空间是固定的,并 且很小。

在Redis中,每个Hyperloglog 只占用12KB内存,就可以计算接近 2 64 2^{64} 264个不同元素的基数。

因为HyperLogLog 只会更具输入元素来计算基数,而不会存储输入元素本身,所以Hyperloglog 不能像 集合那样,返回输入的各个元素。

常用命令

  1. pfadd key element1 element2……将所有元素参数添加到 Hyperloglog 数据结构中。

    如果至少有个元素被添加返回 1, 否则返回 0。

    pfadd book1 python sql 	添加两个元素,当前book1数量为2
    pfadd book1 python js 	添加一个元素,当前book1数量为3
    

    在这里插入图片描述

  2. pfcount key1 key2……计算Hyperloglog 近似基数,可以计算多个Hyperloglog ,统计基数总 数。

    pfcount book1 				计算book1的基数,结果为3
    pfadd book2 html css 		添加两个元素到book2中
    pfcount book1 book2 		统计两个key的基数总数,结果为5
    

    在这里插入图片描述

  3. pfmerge destkey sourcekey1 sourcekey2……将一个或多个Hyperloglog(sourcekey1) 合并 成一个Hyperloglog (destkey )。

    比如每月活跃用户可用每天活跃用户合并后计算。

    pfmerge book book1 book2 	将book1和book2合并成book,结果为5
    

    在这里插入图片描述

Redis配置文件详解


units单位

配置大小单位,开头定义基本度量单位,只支持bytes,大小写不敏感。

在这里插入图片描述

INCLUDES

Redis只有一个配置文件,如果多个人进行开发维护,那么就需要多个这样的配置文件,这时候多个配置 文件就可以在此通过 include /path/to/local.conf 配置进来,而原本的 redis.conf 配置文件就作为一个 总闸。

在这里插入图片描述

NETWORK

  1. bind:绑定redis服务器网卡IP,默认为127.0.0.1,即本地回环地址。访问redis服务只能通过本机的 客户端连接,而无法通过远程连接。如果bind选项为空的话,那会接受所有来自于可用网络接口的 连接。

    在这里插入图片描述

  2. protected-mode:本机保护模式,值为yes时只能本机访问不能远程访问。

    在这里插入图片描述

  3. port:指定redis运行的端口,默认是6379。

    在这里插入图片描述

  4. timeout:设置客户端连接时的超时时间,单位为秒。当客户端在这段时间内没有发出任何指令, 那么关闭该连接。默认值为0,表示不关闭。

    在这里插入图片描述

GENERAL

  1. daemonize:设置为yes表示指定Redis以守护进程的方式启动(后台启动)。

    在这里插入图片描述

  2. pidfile:配置PID文件路径,当redis作为守护进程运行的时候,它会把 pid 默认写到 /var/redis/run/redis_6379.pid 文件里面。

    在这里插入图片描述

  3. loglevel :定义日志级别。默认值为notice,有如下4种取值:

    • debug(记录大量日志信息,适用于开发、测试阶段)。

    • verbose(较多日志信息)。

    • notice(适量日志信息,使用于生产环境)。

    • warning(仅有部分重要、关键信息才会被记录)。

      在这里插入图片描述

  4. logfile :配置log文件地址,默认打印在命令行终端的窗口上。

    在这里插入图片描述

  5. databases:设置数据库的数目。

    在这里插入图片描述

SECURITY

  1. requirepass:设置redis连接密码。

    比如: requirepass 123 表示redis的连接密码为123。

    在这里插入图片描述

其他配置

  1. maxclients :设置客户端最大并发连接数,默认无限制,Redis可以同时打开的客户端连接数为 Redis进程可以打开的最大数量。 如果设置 maxclients为0 ,表示不作限制。当客户端连接数到达 限制时,Redis会关闭新的连接并向客户端返回错误信息。

    在这里插入图片描述

  2. maxmemory:设置Redis的最大内存,如果设置为0 。表示不作限制。通常是配合maxmemory-policy参数一起使用。

    在这里插入图片描述

  3. maxmemory-policy :当内存使用达到maxmemory设置的最大值时,redis使用的内存清除策略。

    清除策略包括:

    • volatile-lru:利用LRU算法移除设置过过期时间的key (LRU:最近使用 Least Recently Used )
    • allkeys-lru:利用LRU算法移除任何key
    • volatile-random:移除设置过过期时间的随机key
    • allkeys-random:移除随机key
    • volatile-ttl:移除即将过期的key(minor TTL)
    • noeviction:不移除任何key,只是返回一个写错误 ,默认选项

    在这里插入图片描述

详细解释:

单位
#当你需要为某个配置项指定内存大小的时候,必须要带上单位,
#通常的格式就是 1k 5gb 4m 等:
#1k => 1000 bytes
#1kb => 1024 bytes
#1m => 1000000 bytes
#1mb => 10241024 bytes
#1g => 1000000000 bytes
#1gb => 10241024*1024 bytes


文件引入
#引入其他的配置文件
#include /path/to/local.conf
#include /path/to/other.conf


模块加载
#启动时加载模块
#loadmodule /path/to/my_module.so
#loadmodule /path/to/other_module.so


网络
#指定redis只能接受来自此IP绑定的网卡的请求,注意此默认值默认外网是不可访问的
bind 127.0.0.1

#是否开启保护模式。如果没有指定bind和密码,redis只会本地进行访问,拒绝外部访问。
protected-mode yes

#默认端口,建议生产环境不要使用默认端口避免被恶意扫描到
port 6379

#TCP连接中已完成队列(完成三次握手之后)的长度
tcp-backlog 511

#配置unix socket来让redis支持监听本地连接。
#unixsocket /tmp/redis.sock

#配置unix socket使用文件的权限
#unixsocketperm 700

#客户端连接空闲超过timeout将会被断开,为0则断开
timeout 0

#tcp keepalive参数
tcp-keepalive 300


基本配置
#是否后台启动
daemonize no

#可以通过upstart和systemd管理Redis守护进程
#选项:
#supervised no - 没有监督互动
#supervised upstart - 通过将Redis置于SIGSTOP模式来启动信号
#supervised systemd - signal systemd将READY = 1写入$ NOTIFY_SOCKET
#supervised auto - 检测upstart或systemd方法基于 UPSTART_JOB或NOTIFY_SOCKET环境变量
supervised no

#配置PID文件路径
pidfile /var/run/redis_6379.pid

#日志级别
#参数:
# debug
# verbose
# notice
# warning
loglevel notice

#日志文件
logfile “”

#是否打开记录syslog功能
#syslog-enabled no
#syslog标识符
#syslog-ident redis

#日志的来源
#syslog-facility local0

#数据库的数量,默认使用的数据库是DB 0
#可以通过”SELECT “命令选择一个db
#集群环境默认只有DB 0
databases 16

#是否一直显示logo
always-show-logo yes


数据持久化RDB
#保存数据到磁盘:
#save

#Will save the DB if both the given number of seconds and the given
#number of write operations against the DB occurred.

#In the example below the behaviour will be to save:

#15分钟有一个key发生变化就保存数据到磁盘
#after 900 sec (15 min) if at least 1 key changed

#5分钟有10个key发生变化就保存数据到磁盘
#after 300 sec (5 min) if at least 10 keys changed

#1分钟有10000个key发生变化就保存数据到磁盘
#after 60 sec if at least 10000 keys changed

#Note: you can disable saving completely by commenting out all “save” lines.

#还可以删除所有以前配置的保存。
#通过添加带有单个空字符串参数的保存指令
#like in the following example:

save 900 1
save 300 10
save 60 10000

#持久化出现错误后,是否依然进行继续进行工作
stop-writes-on-bgsave-error yes

#是否校验rdb文件
rdbcompression yes

#使用压缩rdb文件,rdb文件压缩使用LZF压缩算法,
rdbchecksum yes

#rdb文件名称
dbfilename dump.rdb

#rdb使用上面的“dbfilename配置指令的文件名保存到这个目录
dir ./


主从复制
#指定主节点。旧版本是:slaveof

#replicaof

#master的密码
#masterauth

#当一个slave失去和master的连接,或者同步正在进行中,slave的行为有两种可能:
#如果 replica-serve-stale-data 设置为 “yes” (默认值),slave会继续响应客户端请求,可能是正常数据,也可能是还没获得值的空数据。
#如果 replica-serve-stale-data 设置为 “no”,slave会回复"正在从master同步(SYNC withmaster in progress)"来处理各种请求,除了 INFO 和 SLAVEOF 命令。
replica-serve-stale-data yes

#配置从是否为只读,开启后从则不能写入数据,旧版本是:slave-read-only yes
replica-read-only yes

#同步策略: 磁盘或socket,默认磁盘方式
repl-diskless-sync no

#如果非磁盘同步方式开启,可以配置同步延迟时间,以等待master产生子进程通过socket传输RDB数据给slave。
#默认值为5秒,设置为0秒则每次传输无延迟。
repl-diskless-sync-delay 5

#slave根据指定的时间间隔向master发送ping请求。默认10秒。
#repl-ping-replica-period 10

#同步的超时时间
#slave在与master SYNC期间有大量数据传输,造成超时
#在slave角度,master超时,包括数据、ping等
#在master角度,slave超时,当master发送REPLCONF ACK pings#确保这个值大于指定的repl-pingslave-period,否则在主从间流量不高时每次都会检测到超时
#repl-timeout 60

#是否在slave套接字发送SYNC之后禁用 TCP_NODELAY
#如果选择yes,Redis将使用更少的TCP包和带宽来向slaves发送数据。但是这将使数据传输到slave上有延迟,Linux内核的默认配置会达到40毫秒。
#如果选择no,数据传输到salve的延迟将会减少但要使用更多的带宽。
#默认我们会为低延迟做优化,但高流量情况或主从之间的跳数过多时,可以设置为“yes”。
repl-disable-tcp-nodelay no

#设置数据备份的backlog大小
#repl-backlog-size 1mb

#从最后一个slave断开开始计时多少秒后,backlog缓冲将会释放。
#repl-backlog-ttl 3600

#优先级
replica-priority 100

#如果master少于N个延时小于等于M秒的已连接slave,就可以停止接收写操作。
#N个slave需要是“oneline”状态。
#延时是以秒为单位,并且必须小于等于指定值,是从最后一个从slave接收到的ping(通常每秒发送)开始计数。
#该选项不保证N个slave正确同步写操作,但是限制数据丢失的窗口期。
#例如至少需要3个延时小于等于10秒的slave用下面的指令:
#min-replicas-to-write 3
#min-replicas-max-lag 10


安全
#密码
#requirepass foobared

#命令重命名
#设置命令为空时禁用命令
#rename-command CONFIG “”

限制
#设置最多同时连接的客户端数量
#maxclients 10000

#内存限制
#maxmemory

#如果达到上方最大的内存限制,Redis如何选择删除key
#volatile-lru -> 根据LRU算法删除设置过期时间的key
#allkeys-lru -> 根据LRU算法删除任何key
#volatile-random -> 随机移除设置过过期时间的key
#allkeys-random -> 随机移除任何key
#volatile-ttl -> 移除即将过期的key(minor TTL)
#noeviction -> 不移除任何key,只返回一个写错误
#注意:对所有策略来说,如果Redis找不到合适的可以删除的key都会在写操作时返回一个错误。
#目前为止涉及的命令:
set setnx setex append incr decr rpush lpush rpushx lpushx
linsert lset rpoplpush sadd sinter sinterstore sunion sunionstore sdiff
sdiffstore zadd zincrby zunionstore zinterstore hset hsetnx hmset hincrby incrby
decrby getset mset msetnx exec sort
#maxmemory-policy noeviction

#LRU和最小TTL算法的样本个数
#maxmemory-samples 5


懒删除
#内存满逐出
lazyfree-lazy-eviction no
#过期key删除
lazyfree-lazy-expire no
#内部删除,比如rename oldkey newkey时,如果newkey存在需要删除newkey
lazyfree-lazy-server-del no
#接收完RDB文件后清空数据选项
replica-lazy-flush no


持久化方式AOF
#每次启动时Redis都会先把这个文件的数据读入内存里,先忽略RDB文件
appendonly no

#AOF文件名称
appendfilename “appendonly.aof”
#fsync() 系统调用告诉操作系统把数据写到磁盘上,而不是等更多的数据进入输出缓冲区。
#有些操作系统会真的把数据马上刷到磁盘上;有些则会尽快去尝试这么做。
#Redis支持三种不同的模式:
#no:不要立刻刷,只有在操作系统需要刷的时候再刷。比较快。
#always:每次写操作都立刻写入到aof文件。慢,但是最安全。
#everysec:每秒写一次。折中方案。
#默认的 “everysec” 通常来说能在速度和数据安全性之间取得比较好的平衡。
appendfsync everysec

#如果AOF的同步策略设置成 “always” 或者 “everysec”,并且后台的存储进程(后台存储或写入AOF 日志)会产生很多磁盘I/O开销。某些Linux的配置下会使Redis因为 fsync()系统调用而阻塞很久。
#注意,目前对这个情况还没有完美修正,甚至不同线程的 fsync() 会阻塞我们同步的write(2)调用。
#为了缓解这个问题,可以用下面这个选项。它可以在 BGSAVE 或 BGREWRITEAOF 处理时阻止fsync()。
#这就意味着如果有子进程在进行保存操作,那么Redis就处于"不可同步"的状态。
#这实际上是说,在最差的情况下可能会丢掉30秒钟的日志数据。(默认Linux设定)
#如果把这个设置成"yes"带来了延迟问题,就保持"no",这是保存持久数据的最安全的方式。
no-appendfsync-on-rewrite no

#自动重写AOF文件。如果AOF日志文件增大到指定百分比,Redis能够通过 BGREWRITEAOF 自动重写AOF日志文件。
#工作原理:Redis记住上次重写时AOF文件的大小(如果重启后还没有写操作,就直接用启动时的AOF大小)
#这个基准大小和当前大小做比较。如果当前大小超过指定比例,就会触发重写操作。
#你还需要指定被重写日志的最小尺寸,这样避免了达到指定百分比但尺寸仍然很小的情况还要重写。
#指定百分比为0会禁用AOF自动重写特性。

auto-aof-rewrite-percentage 100
#文件达到大小阈值的时候进行重写
auto-aof-rewrite-min-size 64mb

#如果设置为yes,如果一个因异常被截断的AOF文件被redis启动时加载进内存,redis将会发送日志通知用户
#如果设置为no,erdis将会拒绝启动。此时需要用"redis-check-aof"工具修复文件。
aof-load-truncated yes

#加载时Redis识别出AOF文件以“REDIS”开头字符串,
#并加载带此前缀的RDB文件,然后继续加载AOF
aof-use-rdb-preamble yes


Lua脚本配置
#Lua 脚本的最大执行毫秒数
lua-time-limit 5000


集群
#开启redis集群
#cluster-enabled yes

#配置redis自动生成的集群配置文件名。确保同一系统中运行的各redis实例该配置文件不要重名。
#cluster-config-file nodes-6379.conf


#集群节点超时毫秒数
#cluster-node-timeout 15000
#如果数据太旧,集群中的不可用master的slave节点会避免成为备用master。如果slave和master失联时间超过:(node-timeout * slave-validity-factor) + repl-ping-slave-period则不会被提升为master。
#如node-timeout为30秒,slave-validity-factor为10, 默认default repl-ping-slaveperiod为10秒,失联时间超过310秒slave就不会成为master。
#较大的slave-validity-factor值可能允许包含过旧数据的slave成为master,同时较小的值可能会阻止集群选举出新master。
#为了达到最大限度的高可用性,可以设置为0,即slave不管和master失联多久都可以提升为master
#cluster-replica-validity-factor 10

#只有在之前master有其它指定数量的工作状态下的slave节点时,slave节点才能提升为master。默认为1(即该集群至少有3个节点,1 master+2 slaves,master宕机,仍有另外1个slave的情况下其中1个slave可以提升)
#测试环境可设置为0,生成环境中至少设置为1
#cluster-migration-barrier 1

#默认情况下如果redis集群如果检测到至少有1个hash slot不可用,集群将停止查询数据。
#如果所有slot恢复则集群自动恢复。
#如果需要集群部分可用情况下仍可提供查询服务,设置为no。
#cluster-require-full-coverage yes

#选项设置为yes时,会阻止replicas尝试对其master在主故障期间进行故障转移
#然而,master仍然可以执行手动故障转移,如果强制这样做的话。
#cluster-replica-no-failover no


Docker集群配置
#默认情况下,Redis会自动检测自己的IP和从配置中获取绑定的PORT,告诉客户端或者是其他节点。
#而在Docker环境中,如果使用的不是host网络模式,在容器内部的IP和PORT都是隔离的,那么客户端和其他节点无法通过节点公布的IP和PORT建立连接。
#如果开启以下配置,Redis节点会将配置中的这些IP和PORT告知客户端或其他节点。而这些IP和PORT是通过Docker转发到容器内的临时IP和PORT的。
#cluster-announce-ip
#cluster-announce-port
#集群总线端口
#cluster-announce-bus-port


慢查询日志
#记录超过多少微秒的查询命令
#1000000等于1秒,设置为0则记录所有命令
slowlog-log-slower-than 10000

#记录大小,可通过SLOWLOG RESET命令重置
slowlog-max-len 128


延时监控系统
#记录执行时间大于或等于预定时间(毫秒)的操作,为0时不记录
latency-monitor-threshold 0


事件通知
#Redis能通知 Pub/Sub 客户端关于键空间发生的事件,默认关闭
notify-keyspace-events “”


内部数据结构
#当hash只有少量的entry时,并且最大的entry所占空间没有超过指定的限制时,会用一种节省内存的
#数据结构来编码。可以通过下面的指令来设定限制
hash-max-ziplist-entries 512
hash-max-ziplist-value 64

#当取正值的时候,表示按照数据项个数来限定每个quicklist节点上的ziplist长度。比如,当这个参数配置
#成5的时候,表示每个quicklist节点的ziplist最多包含5个数据项。
#当取负值的时候,表示按照占用字节数来限定每个quicklist节点上的ziplist长度。这时,它只能取-1到-5
#这五个值,每个值含义如下:
#-5: 每个quicklist节点上的ziplist大小不能超过64 Kb。(注:1kb => 1024 bytes)
#-4: 每个quicklist节点上的ziplist大小不能超过32 Kb。
#-3: 每个quicklist节点上的ziplist大小不能超过16 Kb。
#-2: 每个quicklist节点上的ziplist大小不能超过8 Kb。(-2是Redis给出的默认值)
#-1: 每个quicklist节点上的ziplist大小不能超过4 Kb。
list-max-ziplist-size -2


#这个参数表示一个quicklist两端不被压缩的节点个数。
#注:这里的节点个数是指quicklist双向链表的节点个数,而不是指ziplist里面的数据项个数。
#实际上,一个quicklist节点上的ziplist,如果被压缩,就是整体被压缩的。
#参数list-compress-depth的取值含义如下:
#0: 是个特殊值,表示都不压缩。这是Redis的默认值。
#1: 表示quicklist两端各有1个节点不压缩,中间的节点压缩。
#2: 表示quicklist两端各有2个节点不压缩,中间的节点压缩。
#3: 表示quicklist两端各有3个节点不压缩,中间的节点压缩。
#依此类推…
#由于0是个特殊值,很容易看出quicklist的头节点和尾节点总是不被压缩的,以便于在表的两端进行快速存取。
list-compress-depth 0


#set有一种特殊编码的情况:当set数据全是十进制64位有符号整型数字构成的字符串时。
#下面这个配置项就是用来设置set使用这种编码来节省内存的最大长度。
set-max-intset-entries 512


#与hash和list相似,有序集合也可以用一种特别的编码方式来节省大量空间。
#这种编码只适合长度和元素都小于下面限制的有序集合
zset-max-ziplist-entries 128
zset-max-ziplist-value 64


#HyperLogLog稀疏结构表示字节的限制。该限制包括
#16个字节的头。当HyperLogLog使用稀疏结构表示
#这些限制,它会被转换成密度表示。
#值大于16000是完全没用的,因为在该点
#密集的表示是更多的内存效率。
#建议值是3000左右,以便具有的内存好处, 减少内存的消耗
hll-sparse-max-bytes 3000


#Streams宏节点最大大小/项目。流数据结构是基数编码内部多个项目的大节点树。使用此配置
#可以配置单个节点的字节数,以及切换到新节点之前可能包含的最大项目数
#追加新的流条目。如果以下任何设置设置为0,忽略限制,因此例如可以设置一个
#大入口限制将max-bytes设置为0,将max-entries设置为所需的值
stream-node-max-bytes 4096
stream-node-max-entries 100


#启用哈希刷新,每100个CPU毫秒会拿出1个毫秒来刷新Redis的主哈希表(顶级键值映射表)
activerehashing yes

#客户端的输出缓冲区的限制,可用于强制断开那些因为某种原因从服务器读取数据的速度不够快的客户端
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60


#客户端查询缓冲区累积新命令。它们仅限于固定的默认情况下,
#多数情况下为了避免协议不同步导致客户端查询缓冲区中未绑定的内存使用量的错误
#但是,如果你有使用的话,你可以在这里配置它,比如我们有很多执行请求或类似的。
#client-query-buffer-limit 1gb

#在Redis协议中,批量请求,即表示单个的元素strings,通常限制为512 MB。
#但是,您可以z更改此限制
#proto-max-bulk-len 512mb
#默认情况下,“hz”的被设定为10。提高该值将在Redis空闲时使用更多的CPU时,但同时当有多个key
#同时到期会使Redis的反应更灵敏,以及超时可以更精确地处理
hz 10

#开启动态hz
dynamic-hz yes

#当一个子进程重写AOF文件时,如果启用下面的选项,则文件每生成32M数据会被同步
aof-rewrite-incremental-fsync yes
#当redis保存RDB文件时,如果启用了以下选项,每生成32 MB数据,文件将被fsync-ed。
#这很有用,以便以递增方式将文件提交到磁盘并避免大延迟峰值。
rdb-save-incremental-fsync yes


碎片整理
#启用主动碎片整理
#activedefrag yes

#启动活动碎片整理的最小碎片浪费量
#active-defrag-ignore-bytes 100mb

#启动碎片整理的最小碎片百分比
#active-defrag-threshold-lower 10

#使用最大消耗时的最大碎片百分比
#active-defrag-threshold-upper 100

#在CPU百分比中进行碎片整理的最小消耗
#active-defrag-cycle-min 5

#磁盘碎片整理的最大消耗
#active-defrag-cycle-max 75

#将从主字典扫描处理的最大set / hash / zset / list字段数
#active-defrag-max-scan-fields 1000

发布与订阅


什么是发布与订阅

Redis 发布订阅 (pub/sub) 是一种消息通信模式:发送者 (pub) 发送消息,订阅者 (sub) 接收消息。

Redis 客户端可以订阅任意数量的频道。

Redis的发布与订阅

  1. 客户端订阅频道

    在这里插入图片描述

  2. 当给这个频道发送消息后,消息就会发送给订阅的客户端

    在这里插入图片描述

  3. Redis中发布与订阅命令

    订阅:subscribe channel 订阅频道channel。

    发布:publish channel msg向频道channel 发送一条msg消息。

发布与订阅命令行实现

  1. 打开一个客户端订阅channel 1频道。

    subscribe channel1
    

    在这里插入图片描述

  2. 打开另一个客户端给channel 1频道发送一条hello消息。

    publish channel1 hello
    

    在这里插入图片描述

    返回1代表订阅者数量。

  3. 打开第一个客户端可以看到发送的消息

    在这里插入图片描述

    客户端只能收到订阅以后发送的消息。

    Redis持久化


由于Redis的数据都存放在内存中,如果没有配置持久化,Redis重启后数据就全丢失了,于是需要开启 Redis的持久化功能,将数据保存到磁盘上,当Redis重启后,可以从磁盘中恢复数据。

Redis提供了两个不同形式的持久化方式:

  • RDB(Redis DataBase)
  • AOF(Append Only File)

持久化操作-RDB

RDB是什么?

在指定的时间间隔内将内存的数据集快照写入磁盘,也就是行话讲的Snapshot快照,它恢复时是将快照 文件直接读到内存里。

备份过程

Redis会单独创建(fork)一个子进程来进行持久化,会先将数据写入到一个临时文件中,待持久化过程 都结束了,再用这个临时文件替换上次持久化好的文件。

整个过程中,主进程是不进行任何IO操作的,这就确保了极高的性能,如果需要进行大规模数据的恢 复,且对于数据恢复的完整性不是非常敏感,那RDB方式要比AOF方式更加的高效。RDB的缺点是最后 一次持久化后的数据可能丢失。

在这里插入图片描述

dump.rdb文件

  1. RDB保存的文件,在redis.conf中配置文件名称,默认为dump.rdb。

    在这里插入图片描述

  2. rdb文件的保存位置,也可以修改。默认在Redis启动时命令行所在的目录下。

    在这里插入图片描述

    redis.conf中配置文件路径

    在这里插入图片描述

如何触发快照?

配置文件中默认的快照配置

在这里插入图片描述

  1. 快照默认配置

    save 3600 1:表示3600秒内(一小时)如果至少有1个key的值变化,则保存
    300 100:表示300秒内(五分钟)如果至少有100个 key 的值变化,则保存
    60 10000:表示60秒内如果至少有 10000个key的值变化,则保存
    

    可以自己配置新的保存规则。

  2. 例:给redis.conf添加新的快照策略,30秒内如果有5次key的变化,则触发快照。配置修改后,需 要重启Redis服务。

    在这里插入图片描述

    dump.rdb默认大小是89字节,里面会有一些基本信息。

    在这里插入图片描述

    30秒内设置5个以上的值。

    set k1 v1
    set k2 v2
    set k3 v3
    set k4 v4
    set k5 v5
    set k6 v6
    set k7 v7
    

    在这里插入图片描述

    dump.rdb大小已经改变。

    在这里插入图片描述

flushall

执行flushall命令,也会触发rdb规则。

save与bgsave

手动触发Redis进行RDB持久化的命令有两种:

  1. save

    该命令会阻塞当前Redis服务器,执行save命令期间,Redis不能处理其他命令,直到RDB过程完成 为止,不建议使用。

    save命令是同步命令,会占用Redis的主进程。若Redis数据非常多时,save命令会执行速度非常慢,阻塞所有客户端的请求
    
  2. bgsave (推荐)

    执行该命令时,Redis会在后台异步进行快照操作,快照同时还可以响应客户端请求。 这两个命令是在Redis客户端中执行,并不是redis.conf中修改

    命令savebgsave
    IO类型同步异步
    阻塞是(阻塞发生在fock(),通常非常快)
    复杂度O(n)O(n)
    优点不会消耗额外的内存不阻塞客户端命令
    缺点阻塞客户端命令需要fock子进程,消耗内存
stop-writes-on-bgsave-error

默认值是yes。当Redis无法写入磁盘的话,直接关闭Redis的写操作。

在这里插入图片描述

rdbcompression

默认值是yes。对于存储到磁盘中的快照,可以设置是否进行压缩存储。如果是的话,redis会采用LZF算 法进行压缩。如果你不想消耗CPU来进行压缩的话,可以设置为关闭此功能,但是存储在磁盘上的快照 会比较大。

在这里插入图片描述

rdbchecksum

默认值是yes。在存储快照后,我们还可以让redis使用CRC64算法来进行数据校验,但是这样做会增加 大约10%的性能消耗,如果希望获取到最大的性能提升,可以关闭此功能。

在这里插入图片描述

恢复数据

只需要将rdb文件放在Redis的启动目录,Redis启动时会自动加载dump.rdb并恢复数据

持久化操作-AOF


AOF是什么?

以日志的形式来记录每个写操作,将Redis执行过的所有写指令记录下来(读操作不记录),只允许加文 件但不可以改写文件,redis启动之初会读取该文件重新构建数据,换言之,Redis重启的话就根据日志 文件的内容将写指令从前到后执行一次以完成数据的恢复工作。

AOF持久化流程

  1. 客户端的请求写命令会被append追加到AOF缓冲区内。
  2. AOF缓冲区根据AOF持久化策略[always,everysec,no]将操作同步到磁盘的AOF文件中。
  3. AOF文件大小超过重写策略或手动重写时,会对AOF文件rewrite重写,压缩AOF文件容量。
  4. Redis服务重启时,会重新load加载AOF文件中的写操作达到数据恢复的目的。

在这里插入图片描述

AOF默认不开启

可以在redis.conf中配置文件名称,默认为appendonly.aof。

AOF文件的保存路径,同RDB的路径一致。

在这里插入图片描述

如果AOF和RDB同时启动,Redis默认读取AOF的数据。

AOF启动/修复/恢复

  • 正常恢复
    1. 启动:设置Yes:修改默认的appendonly no,改为yes。
    2. 恢复:重启Redis然后重新加载。

例:设置appendonly为yes,配置修改后,需要重启Redis服务。

在这里插入图片描述

服务器启动后,生成appendonly.aof文件,且大小为0。

在这里插入图片描述

设置数据。

set k11 v11
set k12 v12
set k13 v13
set k14 v14
set k15 v15

在这里插入图片描述

  • 异常恢复
    1. 启动:设置Yes:修改默认的appendonly no,改为yes。
    2. 修复:如遇到AOF文件损坏,通过/user/local/bin/redis-check-aof --fix appendonly.aof进行 恢复。
    3. 恢复:重启Redis然后重新加载。

例:服务启动和数据设置同上,模拟损坏appendonly.aof文件

vim appendonly.aof.1.incr.aof

在文件最后追加Hello World文本,破坏appendonly.aof原有格式,使其不可用。

在这里插入图片描述

重启Redis服务,并连接。由于aof文件被破坏,导致服务器启动失败。

在这里插入图片描述

通过/user/local/bin/redis-check-aof --fix工具对appendonly.aof进行恢复。

redis-check-aof --fix appendonlydir/appendonly.aof.1.incr.aof

在这里插入图片描述

修复成功。再次查看aof文件,破坏的地方已经修复。再次启动服务器成功。

在这里插入图片描述

AOF同步频率设置

在这里插入图片描述

  1. appendfsync always

    始终同步,每次Redis的写入都会立刻记入日志,性能较差但数据完整性比较好。

  2. appendfsync everysec

    每秒同步,每秒记入日志一次,如果宕机,本秒的数据可能丢失。

  3. appendfsync no

    redis不主动进行同步,把同步时机交给操作系统。

Rewrite

  1. AOF采用文件追加方式,文件会越来越大为避免出现此种情况,新增了重写机制,当AOF文件的大 小超过所设定的阈值时,Redis就会启动AOF文件的内容压缩,只保留可以恢复数据的最小指令 集。

    例:设置k1为0,然后incr 进行了4次,k1对应的值会是4,其实就相当于set k1 4

  2. 重写虽然可以节约大量磁盘空间,减少恢复时间。但是每次重写还是有一定的负担的,因此设定 Redis要满足一定条件才会进行重写。

    在这里插入图片描述

    redis.conf默认配置

    auto-aof-rewrite-min-size:表示重写时,文件大小必须必这个值要大。

    auto-aof-rewrite-percentage:表示目前文件大小比上次重写后的文件大小大这么多才行。

Redis事务


Redis事务简介

  1. Redis事务是一组命令的集合,一个事务中的所有命令都将被序列化,按照一次性、顺序性、排他 性的执行队列系列的命令。
  2. Redis单条命令保证原子性,但是事务不保证原子性,且没有回滚。事务中任意命令执行失败,其 余的命令仍会被执行。
  3. Redis事务没有隔离级别的概念。批量操作在执行前被放入缓存队列,并不会被实际执行,也就不 存在事务内的查询要看到事务里的更新,事务外查询不能看到。
  4. Redis事务的三个阶段:
    • 开始事务
    • 命令入队
    • 执行事务

Redis事务基本操作

Multi、Exec、discard

事务从输入Multi命令开始,输入的命令都会依次压入命令缓冲队列中,并不会执行,直到输入Exec后, Redis会将之前的命令缓冲队列中的命令依次执行。

组队过程中,可以通过discard来放弃组队。

在这里插入图片描述

例1:

multi 开始事务
set k1 v1 进行组队,并不执行
set k2 v2 进行组队,并不执行
exec 执行队列命令,依次设置k1 k2

在这里插入图片描述

例2:

multi 开始事务
set k3 v3 进行组队,并不执行
set k4 v4 进行组队,并不执行
discard 取消组队,都不执行

在这里插入图片描述

事务的错误处理

  1. 语法错误,整个队列中的命令都不执行。

    在这里插入图片描述

    例:整个命令缓存队列都不会执行。

    在这里插入图片描述

  2. 运行报错,只有报错的命令不会执行,其他正常执行。

    在这里插入图片描述

    例:只有报错的命令没有执行。

    在这里插入图片描述

悲观锁与乐观锁


事务应用场景

  • 一个请求想给余额减8000
  • 一个请求想给余额减5000
  • 一个请求想给余额减1000

在这里插入图片描述

悲观锁(Pessimistic Lock)

每次去拿数据的时候都认为别人会修改,所以在每次拿数据的时候都会上锁,这样别人想拿这个数据就 会阻塞,直到它拿到锁。传统关系型数据库就用到很多悲观锁,比如行锁、表锁等。

在这里插入图片描述

乐观锁(Optimistic Lock)

每次去拿数据的时候都认为别人不会修改,所以不会上锁,但在更新的时候会判断一下在此期间别人有 没有去更新这个数据,可以使用版本号机制。乐观锁适用于多读的应用类型,可以提高吞吐量。Redis就 是乐观锁机制实现事务的。

在这里插入图片描述

Redis中的乐观锁

watch key [key……]

在执行multi之前,先执行watch监视一个或多个key,如果在事务执行之前这个(或这些)key被其它命 令所改动,那么事务将被打断。

例:开启两个客户端

1号客户端
set money 10000 设置一个money的key
watch money 监视money
multi 开启事务
set money 100 修改money,暂时不执行事务
2号客户端
watch money 监视money
multi 开启事务
set money 110 修改money,暂时不执行事务
1号客户端
exec 执行事务,返回成功
2号客户端
exec 执行事务,更新失败

1号客户端:

在这里插入图片描述

2号客户端:

在这里插入图片描述

unwatch

取消watch命令对所有key的监视

如果在执行watch命令之后,exec命令或discard命令先执行的话,那么就不需要再执行unwatch。

Redis主从复制简介


主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(Master),后 者称为从节点(Slave);数据的复制是单向的,只能由主节点到从节点。

默认情况下,每台Redis服务器都是主节点;且一个主节点可以有多个从节点(或没有从节点),但一个从 节点只能有一个主节点。

Master以写为主,Slave以读为主。

在这里插入图片描述

主从复制的作用:

  1. 数据冗余:主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式。
  2. 故障恢复:当主节点出现问题时,可以由从节点提供服务,实现快速的故障恢复;实际上是一种服 务的冗余。
  3. 负载均衡:在主从复制的基础上,配合读写分离,可以由主节点提供写服务,由从节点提供读服务 (即写Redis数据时应用连接主节点,读Redis数据时应用连接从节点),分担服务器负载;尤其是 在写少读多的场景下,通过多个从节点分担读负载,可以大大提高Redis服务器的并发量。
  4. 高可用基石:除了上述作用以外,主从复制还是哨兵和集群能够实施的基础,因此说主从复制是 Redis高可用的基础。

一般来说,要将Redis运用于工程项目中,不会只有一台Redis,原因如下:

  1. 从结构上,单个redis服务器会发生单点故障,并且一台服务器需要处理所有的请求负载,压力较大;
  2. 从容量上,单个redis服务器内存容量有限,就算一台Redis服务器内存容量为256G,也不能将所有 内存用做Redis存储内存,一般来说,单台Redis最大使用内存不应该超过20G。

Redis主从复制一主多从


搭建一主二从的Redis服务器

环境搭建

  1. 在同一台虚拟机上配置一主二从Redis服务器,由于单台机器,同一个端口只允许一个进程占用, 所以需要修改其他两台Redis的端口。

  2. 在/usr/local/myredis文件夹下,新创建三个redis的配置文件,分别为redis6379.conf、 redis6380.conf、redis6381.conf,由文件名可知,redis的端口号分别为6379、6380、6381。

    在这里插入图片描述

    创建出3个空文件,redis.conf是原有的配置文件。

  3. 在三个配置文件写入内容

    • 可以通过include /usr/local/myredis/redis.conf将公共基础配置直接引入文件。 将include /usr/local/myredis/redis.conf统一添加到这三个文件中

    • 在各个文件中,添加对应的pidfile、port、dbfilename

      如:

      redis6379.conf中添加

      include /usr/local/myredis/redis.conf
      pidfile /var/run/redis_6379.pid
      port 6379
      dbfilename dump6379.rdb
      

      在这里插入图片描述

      redis6380.conf中添加

      include /usr/local/myredis/redis.conf
      pidfile /var/run/redis_6380.pid
      port 6380
      dbfilename dump6380.rdb
      

      在这里插入图片描述

      redis6381.conf中添加

      include /usr/local/myredis/redis.conf
      pidfile /var/run/redis_6381.pid
      port 6381
      dbfilename dump6381.rdb
      

      在这里插入图片描述

  4. 通过不同的redis.conf文件,分别启动3个redis服务

    [root@centos7 myredis]$redis-server redis6379.conf
    [root@centos7 myredis]$redis-server redis6380.conf
    [root@centos7 myredis]$redis-server redis6381.conf
    

    在这里插入图片描述

    通过ps -ef | grep redis命令查看redis服务,3个服务均已启动

    在这里插入图片描述

  5. 在redis客户端中,通过info replication命令可以查看Redis服务器当前状态

    可以给redis-cli命令添加-p参数,来指定链接哪个服务器

    redis-cli -p 6379
    redis-cli -p 6380
    redis-cli -p 6381
    

    在这里插入图片描述

    所有的服务器目前都是master

  6. 配从(6380、6381)不配主(6379)

    slaveof ip port成为某个实例的从服务器。

    在从机6380和6381上执行:slaveof 127.0.0.1 6379
    

    在这里插入图片描述

    在这里插入图片描述

    有两个从库,分别为6380和6381。

  7. 在主库(6379)中写数据,可以在从库(6380、6381)中读取到。

注意:

  • 在从库中进行写操作,会报错。
  • 由于该主从复制在同一台虚拟机上搭建,所以需要修改端口号,如果在多台服务器上搭建主从复 制,则需要修改相对应的ip。
  • 如果在多台服务器上搭建主从复制,一定要开放远程链接。

Redis主从复制-复制原理


主从复制的一些问题

  1. 如果Master断开(宕机),Slave依然连接着Master,可以正常使用读操作,但是没有写操作。如 果Master恢复正常,Slave依旧可以直接获取Master写的信息。
  2. 如果Slave断开(宕机),当该Slave重启成功,则会变为Master,需要通过slaveof 恢复成Slave, 只要变为Slave,立刻可以从Master同步所有数据。

复制原理

  • Slave启动成功连接到Master后会主动发送一个同步(sync)命令。
  • Master接到Slave的命令,把Master数据进行持久化,把rdb文件发送给Slave,Slave拿到rdb进行 读取。
  • 每次Master进行写操作之后,会和Slave进行数据同步。

在这里插入图片描述

  • 全量复制:一般发生在Slave初始化阶段,这时Slave需要将Master上的所有数据都复制一份。
  • 增量复制:指Slave初始化后开始正常工作时主服务器发生的写操作同步到从服务器的过程。

薪火相传

上一个Slave(从机)是下一个Slave(从机)的Master(主机)。

在这里插入图片描述

优点:Slave同样可以接收其他Slave的连接和同步请求,那么该Slave作为了链条中下一个的Master, 可 以有效减轻Master的压力,去中心化降低风险。

缺点:一旦某个Slave宕机,后面的Slave都无法备份。

注意:

  • 也是通过slaveof ip port命令修改Master。
  • 中途变更转向:会清除之前的数据,重新建立拷贝最新的。
  • Slave6380本质上仍然是从库,只能读、不能写。

反客为主

当一个Master宕机后,后面的Slave可以立刻升为Master,其后面的Slave不用做任何修改。

在这里插入图片描述

通过slaveof no one 将Slave变为Master。

Redis主从复制-哨兵模式(Sentinel)


反客为主的自动版,能够后台监控Master是否故障,如果故障了,根据投票数自动将Slave转换为 Master。

哨兵模式是一种特殊的模式,首先Redis提供了哨兵的命令,哨兵是一个独立的进程,作为进程,它会独 立运行。其原理是哨兵通过发送命令,等待Redis服务器响应,从而监控运行的多个Redis实例。

哨兵模式的使用

  1. 将服务器调整为一主多从(6379带6380、6381)。

    在这里插入图片描述

  2. 在/usr/local/myredis文件夹下创建sentinel.conf文件(名字一定不能错)。

    在这里插入图片描述

  3. 配置哨兵,sentinel.conf添加内容

    # sentinel monitor <master-name> <ip> <port> <count>w
    sentinel monitor myredis 127.0.0.1 6379 1
    

    在这里插入图片描述

    其中:myredis 为监控对象起的服务器名称(随意),1代表至少有1个哨兵投票同意迁移

    如果Master存在密码,需要配置sentinel auth-pass 服务器名 密码

    sentinel auth-pass myredis 123456
    daemonize yes
    
  4. 启动哨兵,在/usr/local/bin/文件夹下执行./redis-sentinel /usr/local/myredis/sentinel.conf命 令。

    在这里插入图片描述

  5. 模拟Master宕机,哨兵会切换Master

    • 通过kill命令关闭Master(6379)

    在这里插入图片描述

    • 等待一段时间,哨兵窗口就会输出信息

    在这里插入图片描述

    根据窗口信息可知,Master由6379转换为6380,进入6380客户端执行info replication

    在这里插入图片描述

  6. 重新启动6379服务器后,自动转换为Slave。

    在这里插入图片描述

复制延迟

由于所有的写操作都是先在Master上操作,然后同步更新到Slave上,所以从Master同步到Slave机器有 一定的延迟,Slave机器数量的增加,会使延迟问题会更加严重。

Redis集群


Redis集群简介

Redis集群(RedisCluster)

RedisCluster实现了对Redis的水平扩容,即启动N个Redis节点,将整个数据库分布存储在这N个节点当 中,每个节点存储总数据的1/N。

RedisCluster通过分区(partition)来提供一定程度的可用性(availability):即集群有一部分节点失 效或者无法进行通讯,集群也可以继续处理命令。

Redis-Cluster采用无中心结构,每个节点保存数据和整个集群状态,每个节点都和其他所有节点连接,用 来交换彼此的信息。

在这里插入图片描述

为了使得集群在一部分节点宕机或者无法与集群的大多数节点进行通讯的情况下, 仍然可以正常运作, Redis 集群对节点使用了主从复制功能。

Redis集群搭建

  1. 删除持久化数据,aof、rdb。

    在这里插入图片描述

    在这里插入图片描述

  2. 创建6个实例,即在/usr/local/myredis文件夹下分别创建6379、6380、6381、6389、6390、 6391的conf。

    完成第4步再来复制

    在这里插入图片描述

    按:进入编辑模式输入%s/6379/6380		其他几个文件也是换成相应的数字
    

    在这里插入图片描述

  3. 在redis.conf中关闭appendonly和appendonly、protected-mode,注释bind 127.0.0.1 - :: 1。

    在这里插入图片描述

    在这里插入图片描述

  4. 在不同的conf文件中,配置对应的内容

    • 可以通过include /usr/local/myredis/redis.conf将公共基础配置直接引入文件。 将include /usr/local/myredis/redis.conf统一添加到这三个文件中

    • 在各个文件中,添加对应的pidfile、port、dbfilename、cluster-enabled(是否打开集 群)、cluster-config-file(设定节点配置文件名)、cluster-node-timeout (设置节点失联 时间,超过该时间(毫秒),集群自动进行主从切换)

      如:

      redis6379.conf中添加

      pidfile /var/run/redis_6379.pid
      port 6379
      dbfilename dump6379.rdb
      # 是否打开集群
      cluster-enabled yes
      # 设定节点配置文件名
      cluster-config-file nodes-6379.conf
      # 设置节点失联时间,超过该时间(毫秒),集群自动进行主从切换
      cluster-node-timeout 15000
      

      在这里插入图片描述

  5. 启动该6个redis,并确保是否全部生成nodes-xxxx.conf文件。(启动之前务必保证redis服务支持 远程连接)

    在这里插入图片描述

    在这里插入图片描述

  6. 进入redis安装目录下的src文件夹

    在这里插入图片描述

  7. 在该文件夹下执行命令

    redis-cli --cluster create --cluster-replicas 1 10.0.0.8:6379 10.0.0.8:6380 10.0.0.8:6381 10.0.0.8:6389 10.0.0.8:6390 10.0.0.8:6391
    

    此处使用真实ip地址,-replicas 1代表采用最简单的方式配置集群,一台主机,一台从机。 replicas表示每个master需要有几个slave。

    在这里插入图片描述

    执行命令后,redis提供推荐的主从配置建议,执行同意。

    在这里插入图片描述

    集群创建成功。

  8. 通过./redis-cli -c -p 6379可连接至集群(由于所有节点相通,任意端口号均可) 在redis客户端中执行cluster nodes查看节点状态。

    在这里插入图片描述

Redis集群操作


Slot

一个 Redis 集群包含 16384 个哈希槽(hash slot),每个键都属于这 16384 个哈希槽的其中一个。

集群使用公式 CRC16(key) % 16384 来计算键 key 属于哪个槽, 其中 CRC16(key) 语句用于计算键 key 的 CRC16 校验和 。

集群中的每个节点负责处理一部分哈希槽。 举个例子, 一个集群可以有三个节点, 其中:

  • 节点 1 负责处理 0 号至 5500 号哈希槽。
  • 节点 2 负责处理 5501 号至 11000 号哈希槽。
  • 节点 3 负责处理 11001 号至 16384 号哈希槽。

在这里插入图片描述

命令执行

set k1 v1

在这里插入图片描述

根据k1计算出的槽值进行切换节点,并存入数据。

不在一个slot下的键值,是不能使用mget、mset等多建操作。

mset k1 v1 k2 v2 k3 v3

在这里插入图片描述

可以通过{}来定义组的概念,从而是key中{}内相同内容的键值对放到同一个slot中

mset k1{test} v1 k2{test} v2 k3{test} v3

在这里插入图片描述

故障恢复

  1. 关闭6379服务器,进入redis-cli执行cluster nodes

    在这里插入图片描述

    6379服务器fail,6390成为了新的master

  2. 重新启动6379服务器,再次查看,6379成为了Slave

    在这里插入图片描述

    在这里插入图片描述

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

途中刂

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值