1、redis的主从服务器搭建
1.1 下载redis的配置文件
官网下载地址Redis configuration | Redis
1.2创建redis挂载文件目录
在/usr/local下创建software/redis目录
在redis目录下创建3个redis服务器以端口号命名的目录文件: 6379,6380,63801
在每个文件夹下都创建data, conf, 和logs文件夹。
-
data、conf和logs文件夹
-
conf:存储redis配置文件
-
logs: 存储redis日志文件
[root@localhost redis]# mkdir -p 6379/conf 6379/data 6379/logs
[root@localhost redis]# mkdir -p 6380/conf 6380/data 6380/logs
[root@localhost redis]# mkdir -p 6381/conf 6381/data 6381/logs
1.3 创建redis配置文件
1.3.1 上传配置文件
将官网下载的配置文件redis.conf上传到6379,6380,63801文件夹下的conf文件目录下
1.3.2 创建日志文件
在6379,6380,63801文件夹下的logs文件下创建redis.log文件
[root@localhost redis]# touch 6379/logs/redis.log
[root@localhost redis]# touch 6380/logs/redis.log
[root@localhost redis]# touch 6381/logs/redis.log
1.3.3 修改配置文件权限
1.4 创建redis的master容器(redis_6379)
1.4.1修改配置文件
- 修改6379/conf/redis.conf文件
[root@localhost redis]# vim 6379/conf/redis.conf
- 显示文编编号
Shift+ Ctrl + ; set number
74 # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
75 bind 0.0.0.0
93 # are explicitly listed using the "bind" directive.
94 protected-mode no
303 # output for logging but daemonize, logs will be sent to /dev/null
304 logfile "/var/log/redis/redis_6379.log"
305
306 # To enable logging to the system logger, just set 'syslog-enabled' to yes,
1.4.2 创建redis_6379启动容器
docker run -itd --name redis_6379 --privileged=true -v
# 红色部分创建配置文件的文件路径,蓝色部分是redis镜像文件的路径(下面也是如此)
/usr/local/software/redis/6379/conf/redis.conf:/usr/local/etc/redis/redis.conf -v /usr/local/software/redis/6379/data/:/data -v /usr/local/software/redis/6379/logs/redis.log:/var/log/redis.log -p 6379:6379 redis /usr/local/etc/redis/redis.conf
1.4.3 测试容器
- 进入容器
[root@localhost redis]# docker exec -it redis_6379 bash
- 运行redis客户端
root@0eb9147d8dd7:/data# redis-cli
127.0.0.1:6379> ping
PONG
1.4.4 查看master容器IP
[root@localhost ~]# docker inspect redis_6379 |grep IPA
"SecondaryIPAddresses": null,
"IPAddress": "172.17.0.4",
"IPAMConfig": null,
"IPAddress": "172.17.0.4",
1.5 创建redis从服务器(redis_6380)
1.5.1 修改配置文件
- 修改6370/conf/redis.conf配置文件
[root@localhost redis]# vim 6380/conf/redis.conf
74 # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
75 bind 0.0.0.0
93 # are explicitly listed using the "bind" directive.
94 protected-mode no
303 # output for logging but daemonize, logs will be sent to /dev/null
304 logfile "/var/log/redis/redis_6380.log"
305
306 # To enable logging to the system logger, just set 'syslog-enabled' to yes,
1253
1254 appendonly yes
1255
1256 # The name of the append only file (default: "appendonly.aof")
2051 # to suppress
2052 #
2053 # ignore-warnings ARM64-COW-BUG
2054 slave-read-only no
2055 replicaof 172.17.0.4 6379 # 172.17.0.4表示master容器的地址创建后可以再改
1.5.2 创建运行容器
docker run -itd --name redis_6380 --privileged=true -v /usr/local/software/redis/6380/conf/redis.conf:/usr/local/etc/redis/redis.conf -v /usr/local/software/redis/6380/data/:/data -v /usr/local/software/redis/6380/logs/redis.log:/var/log/redis/redis_6380.log -p 6380:6379 docker.io/redis /usr/local/etc/redis/redis.conf
1.5.2 测试主从
127.0.0.1:6379> info Replication
1.6 创建从服务器(redis_6381)
1.6.1修改配置文件
- 修改6381/conf/redis.conf配置文件
[root@localhost redis]# vim 6381/conf/redis.conf
74 # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
75 bind 0.0.0.0
93 # are explicitly listed using the "bind" directive.
94 protected-mode no
303 # output for logging but daemonize, logs will be sent to /dev/null
304 logfile "/var/log/redis/redis_6381.log"
305
306 # To enable logging to the system logger, just set 'syslog-enabled' to yes,
1253
1254 appendonly yes
1255
1256 # The name of the append only file (default: "appendonly.aof")
2051 # to suppress
2052 #
2053 # ignore-warnings ARM64-COW-BUG
2054 slave-read-only no
2055 replicaof 172.17.0.4 6379 # 172.17.0.4表示master容器的地址
1.6.2 创建运行容器
docker run -itd --name redis_6381 --privileged=true -v /usr/local/software/redis/6381/conf/redis.conf:/usr/local/etc/redis/redis.conf -v /usr/local/software/redis/6381/data/:/data -v /usr/local/software/redis/6381/logs/redis.log:/var/log/redis/redis_6381.log -p 6381:6379 docker.io/redis /usr/local/etc/redis/redis.conf
1.6.3测试主从
127.0.0.1:6379> info Replication
1.7 查看主从情况
进入redis主服务器
2、redis的数据过期策略
redis对有些key都设置了过期时间,时间一到自动删除key,但是redis保存了大量的key,要精准保证每个键的过期删除机制太消耗CPU,这对单线程的redis来说付出的代价比较大,因此Redis采用惰性删除和定时任务删除机制实现过期键的内存回收。
- 惰性删除:
过期的key不删除,当redis读取到这些设用过期时间的key,redis会进行判断,如果超过了key设定的过期时间,会执行删除操作并返回空,这种策略是出于节省CPU成本考虑,不需要单独维护每个键的过期删除机制来处理过期键的删除。
这种机制的优点是删除key只发生在客户端读取到了过期时间的key的时候会发生,所以删除操作占用的cpu会很少,缺点就是若大量的key过期不删除,而且在很长的一段时间都不没有被获取到,这些过期的key会占用大量的内存,导致内存泄漏(无用的垃圾数据占用了大量的内存空间)。正因为如此,Redis还提供另一种定时任务删除机制作为惰性删除的补充。
- 定时任务删除:
Redis内部维护一个定时任务,默认每秒运行10次(根据具体服务器运行情况而定)。定时任务中删除过期键逻辑采用了自适应算法,根据键的过期比例,随机抽取一些设置了过期时间的key,检查是否过期,如果过期就删除。。
这种机制的优点是可以通过控制删除操作的时间和频率,来降低对CPU的占用,相比较key过期就删除的机制来说,对cpu的占用会少。定期删除key可以清除一些无用的垃圾,也并不是所有过期很长时间的key都会被清除,也会有很多会遗漏,这些过期的key没有被删除的也没有走惰性删除,最后也还是会堆积在内存里面,这时候就需要内存淘汰策略了。
参考文献: