Redis 作为高效的缓存数据库,单机也能够表现出很好的性能。但是随着数据的增加、并发的增加,单机模式的 Redis 会受到单机性能、容量、稳定性的限制,即使 Redis 提供了稳定的持久化方案,但是单机服务器始终是部署在单个机器上,如果运行机器本身的服务器出现问题我们很难在短时间恢复服务。所以 Redis 提供了三种多机模式:
主从复制模式解决了数据备份和单机可能存在的性能问题,但是也引入了新的问题,一主多从,在使用过程中,如果主服务器挂掉那么整个 Redis 服务的写就挂掉了,如果一个从服务器挂掉那么调用方就无法正确的读数据了,只能通过修改调用方配置和 Redis 各个服务器的配置重新分配主从服务器。而哨兵模式的出现就是为了解决这个问题,哨兵模式会在除了主从模式需要的服务之外另外起N个 sentinel 节点,节点的作用就是监控各个 Redis 的服务是否正常,如果主服务器挂掉那么 sentinel 就会在从服务器中重新选举主服务器,等主服务恢复工作那么他将会变成从服务。
哨兵模式的主从节点配置和主从复制模式的一样,我们这里依旧使用docker配置一个最简单的哨兵系统,1个主节点myredis、2个从节点myredis1 myredis2。
$ docker run --name myredis -d -p 6379:6379 -v /Users/liushuai/Documents/dockerProject/redis/redis.conf:/etc/redis/redis.conf redis /etc/redis/redis.conf
$ docker run --name myredis1 -d -p 6380:6379 -v /Users/liushuai/Documents/dockerProject/redis/redis.conf:/etc/redis/redis.conf redis /etc/redis/redis.conf
$ docker run --name myredis2 -d -p 6381:6379 -v /Users/liushuai/Documents/dockerProject/redis/redis.conf:/etc/redis/redis.conf redis /etc/redis/redis.conf
使用docker inspect container查看3个redis的IP
然后使用命令slaveof 172.17.0.2 6379配置myredis1 myredis2为myredis的从节点。 在myredis上查看从节点信息
127.0.0.1:6379> INFO replication
# Replication
role:master
connected_slaves:2
slave0:ip=172.17.0.3,port=6379,state=online,offset=15105,lag=1
slave1:ip=172.17.0.4,port=6379,state=online,offset=15105,lag=1
master_replid:b9fae659260b39c9c3ad8ec56fd3f6f7c34fde2a
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:15105
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:15105
可以看到主节点有两个从节点,配置完毕
配置三个哨兵分别为:mysentinel-16379、mysentinel-16380、mysentinel-16381。并为他们添加3个配置文件 sentinel-16379.conf、sentinel-16380.conf、sentinel-16381.conf,内容统一为
dir "/data"
logfile "./sentinel-01.log"
sentinel monitor master 172.17.0.2 6379 2
启动三个哨兵
$ docker run --name mysentinel-16379 -d -p 16379:6379 -v /Users/liushuai/Documents/dockerProject/redis/sentinel-16379.conf:/etc/redis/sentinel.conf redis /etc/redis/sentinel.conf --sentinel
$ docker run --name mysentinel-16380 -d -p 16380:6379 -v /Users/liushuai/Documents/dockerProject/redis/sentinel-16380.conf:/etc/redis/sentinel.conf redis /etc/redis/sentinel.conf --sentinel
$ docker run --name mysentinel-16381 -d -p 16381:6379 -v /Users/liushuai/Documents/dockerProject/redis/sentinel-16381.conf:/etc/redis/sentinel.conf redis /etc/redis/sentinel.conf --sentinel
我们可以查看下mysentinel-16379的配置变化
$ cat sentinel-16379.conf
dir "/data"
logfile "./sentinel-01.log"
sentinel myid a9c2f61c55f0297948c3e390f042ad747c2da90d
# Generated by CONFIG REWRITE
port 26379
sentinel deny-scripts-reconfig yes
sentinel monitor master 172.17.0.2 6379 2
sentinel config-epoch master 0
sentinel leader-epoch master 0
sentinel known-slave master 172.17.0.3 6379
sentinel known-slave master 172.17.0.4 6379
sentinel known-sentinel master 172.17.0.7 26379 5e750af533eff5fd1eed0391af37773ba6134345
sentinel known-sentinel master 172.17.0.6 26379 f1de98d5af0653f53c6bb77c37ab015304ba2c99
sentinel current-epoch 0
可以看到哨兵已经拿到了3台redis服务器相关信息。
我们先停掉myredis,等待1分钟再启动myredis(哨兵进行故障转移需要一定时间,所以这里需要等待一会)
$ docker stop myredis // 执行完等待一分钟
$ docker start myredis
再次查看mysentinel-16379的配置
$ cat sentinel-16379.conf
dir "/data"
logfile "./sentinel-01.log"
sentinel myid a9c2f61c55f0297948c3e390f042ad747c2da90d
# Generated by CONFIG REWRITE
port 26379
sentinel deny-scripts-reconfig yes
sentinel monitor master 172.17.0.4 6379 2
sentinel config-epoch master 1
sentinel leader-epoch master 1
sentinel known-slave master 172.17.0.3 6379
sentinel known-slave master 172.17.0.2 6379
sentinel known-sentinel master 172.17.0.7 26379 5e750af533eff5fd1eed0391af37773ba6134345
sentinel known-sentinel master 172.17.0.6 26379 f1de98d5af0653f53c6bb77c37ab015304ba2c99
sentinel current-epoch 1
我们可以看到当前的主节点是172.17.0.4(即myredis2),而原来的主节点myredis则变成了从节点。
非著名程序员,全栈开发工程师,长期专注系统开发与架构设计。
功能待开通!
redis 的 string 类型是支持过期设置的,默认是永不过期的。 Redis 设置过期 redis 中设置设置 key 过期有3中方式 第一种在设置值的时候指定过期时间 Set 命令格式 SET key value [EX seconds] [PX milliseconds] [NX|XX] EX second :设置键的过期时间为 second 秒。 SET key value EX second 效果等同于 SETEX key second value 。 PX millisecond :设置键的过期时间为 millisecond 毫秒。 3. SET key value PX m
Redis 作为高效的缓存数据库,单机也能够表现出很好的性能。但是随着数据的增加、并发的增加,单机模式的 Redis 会受到单机性能、容量、稳定性的限制,即使 Redis 提供了稳定的持久化方案,但是单机服务器始终是部署在单个机器上,如果运行机器本身的服务器出现问题我们很难在短时间恢复服务。所以 Redis 提供了三种多机模式: 主从复制模式 哨兵模式 集群模式 redis集群模式 哨兵模式解决了主节点挂掉的问题,但是没有解决从节点挂掉的问题,而 redis 集群模式可以有效的解决这个问题。redis集群中的数据是和槽(slot)挂钩的,一共定义了16384个槽,所有的数据使用一致性哈希分
redis 中内存管理没有直接使用 C 语言提供的方法而是做了一个可管理已分配内存大小及添加了自己分配策略的实现,下面从 SDS 开始去了解 redis 的内存管理实现及策略。 SDS 内存管理函数定义如下: src/sdsalloc.h #include "zmalloc.h" #define s_malloc zmalloc #define s_realloc zrealloc #define s_free zfree s_malloc 内存申请、s_realloc 内存重新分配、s_free 内存释放,这里定义分别是 zmalloc.h 里三个函数的别名,而 zmalloc zrea
有时候我们需要在短时间内往 redis 里插入大量的数据,我们如果单条单条的出入会浪费很多时间和服务器资源,我们可以使用管道来实现快速的插入。 netcat 我们把需要插入 redis 的数据创建为如下的一个命令集文件 set key1 val1 set key2 val2 ... set key3 val3 我们使用如下命令执行数据导入 > $ cat /tmp/test|nc localhost 6379 +OK +OK +OK pipe mode 使用 netcat 并不是一个可靠地方式,因为用netcat进行大规模插入时不能检查错误。从Redis 2.6开始redis-cli支
在面试过程中只要涉及到 Redis,一定会问到 Redis是多进程还是多线程?为什么单线程还可以有这么高的性能? Redis为什么是单线程的 Redis 是基于内存的操作,CPU 不是 Redis 的瓶颈,Redis 的瓶颈最有可能是机器的内存的大小和网络的带宽,而且单线程的性能已经非常高了,就没有必要使用多线程了,所以 Redis 是单进程单线程的。 提示: 如果我们运行的服务器是多核服务器,为了充分利用多核优势我们可以在单台服务器起多个 Redis 服务,或者架设 主从复制、哨兵模式、集群模式等多机方案。 Redis 服务运行时只是处理客户端请求是单进程单线程的,但是服务运行时会有其他进