docker的安装参考连接
https://blog.csdn.net/u014069688/article/details/100532774
https://www.docker.org.cn/dockerppt/106.html
https://www.cnblogs.com/ningy1009/p/12750416.html
通过docker安装redis
# 拉取最后的版本
docker pull redis
# 拉取指定版本
docker pull redis:6.2.5
![](https://img-blog.csdnimg.cn/img_convert/e5197728dbb5667f1aade6a07b48c926.png)
上图是拉取过后,重新拉取的结果显示。
查看镜像
# 查看镜像
docker images
# 查看镜像
docker image ls
![](https://img-blog.csdnimg.cn/img_convert/f2fab29aa82719a5a56a9d09393e6ae6.png)
获取 Redis 的默认配置模版
可以通过官网下载
# 获取 redis 的默认配置模版
# redis 的 docker 运行参数提供了 --appendonly yes 但没 password
wget https://raw.githubusercontent.com/antirez/redis/6.0/redis.conf -O XXX
XXX 替换为自己需要存放的目录--》例如我的:/data/home/docker/redis/conf
配置例子:
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~redis 配置~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# 指定Redis 只接收来自于该IP 地址的请求,如果不进行设置,那么将处理所有请求,在生产环境中为了安全最好设置该项。默认注释掉,不开启
#bind 127.0.0.1
# #默认yes,开启保护模式,限制为本地访问
protected-mode no
# 监听端口,默认为6379
port 6379
# 链接密码
requirepass 123456
tcp-backlog 511
# 设置客户端连接时的超时时间,单位为秒。当客户端在这段时间内没有发出任何指令,那么关闭该连接
timeout 0
# 指定TCP连接是否为长连接,"侦探"信号有server端维护。默认为0.表示禁用
tcp-keepalive 300
# 默认情况下,redis 不是在后台运行的,如果需要在后台运行,把该项的值更改为yes。
daemonize no
supervised no
# 当Redis 在后台运行的时候,Redis 默认会把pid 文件放在/var/run/redis.pid,你可以配置到其他地址。当运行多个redis 服务时,需要指定不同的pid 文件和端口
pidfile /var/run/redis_6379.pid
# log 等级分为4 级,debug,verbose, notice, 和warning。生产环境下一般开启notice
loglevel notice
# 配置log 文件地址,默认使用标准输出,即打印在命令行终端的窗口上,修改为日志文件目录
logfile ""
# 设置数据库的个数,可以使用SELECT 命令来切换数据库。默认使用的数据库是0号库。默认16个库
databases 16
always-show-logo yes
# 保存数据快照的频率,即将数据持久化到dump.rdb文件中的频度。用来描述"在多少秒期间至少多少个变更操作"触发snapshot数据保存动作
#默认设置,意思是:
# if(在60 秒之内有10000 个keys 发生变化时){
# 进行镜像备份
# }else if(在300 秒之内有10 个keys 发生了变化){
# 进行镜像备份
# }else if(在900 秒之内有1 个keys 发生了变化){
# 进行镜像备份
# }
save 900 1
save 300 10
save 60 10000
# 当持久化出现错误时,是否依然继续进行工作,是否终止所有的客户端write请求。默认设置"yes"表示终止,一旦snapshot数据保存故障,那么此server为只读服务。如果为"no",那么此次snapshot将失败,但下一次snapshot不会受到影响,不过如果出现故障,数据只能恢复到"最近一个成功点"、
stop-writes-on-bgsave-error yes
# 在进行数据镜像备份时,是否启用rdb文件压缩手段,默认为yes。压缩可能需要额外的cpu开支,不过这能够有效的减小rdb文件的大,有利于存储/备份/传输/数据恢复 读取和写入时候,会损失10%性能
rdbcompression yes
# 是否进行校验和,是否对rdb文件使用CRC64校验和,默认为"yes",那么每个rdb文件内容的末尾都会追加CRC校验和,利于第三方校验工具检测文件完整性
rdbchecksum yes
# 镜像备份文件的文件名,默认为 dump.rdb
dbfilename dump.rdb
rdb-del-sync-files no
# 数据库镜像备份的文件rdb/AOF文件放置的路径。这里的路径跟文件名要分开配置是因为Redis 在进行备份时,先会将当前数据库的状态写入到一个临时文件中,等备份完成时,再把该临时文件替换为上面所指定的文件,而这里的临时文件和上面所配置的备份文件都会放在这个指定的路径当中
dir ./
replica-serve-stale-data yes
replica-read-only yes
repl-diskless-sync no
repl-diskless-sync-delay 5
repl-diskless-load disabled
repl-disable-tcp-nodelay no
replica-priority 100
acllog-max-len 128
lazyfree-lazy-eviction no
lazyfree-lazy-expire no
lazyfree-lazy-server-del no
replica-lazy-flush no
lazyfree-lazy-user-del no
# 默认情况下,redis 会在后台异步的把数据库镜像备份到磁盘,但是该备份是非常耗时的,而且备份也不能很频繁。所以redis 提供了另外一种更加高效的数据库备份及灾难恢复方式。开启append only 模式之后,redis 会把所接收到的每一次写操作请求都追加到appendonly.aof 文件中,当redis 重新启动时,会从该文件恢复出之前的状态。但是这样会造成appendonly.aof 文件过大,所以redis 还支持了BGREWRITEAOF 指令,对appendonly.aof 进行重新整理。如果不经常进行数据迁移操作,推荐生产环境下的做法为关闭镜像,开启appendonly.aof,同时可以选择在访问较少的时间每天对appendonly.aof 进行重写一次。
appendonly no
appendfilename "appendonly.aof"
# 设置对appendonly.aof 文件进行同步的频率。always 表示每次有写操作都进行同步,everysec 表示对写操作进行累积,每秒同步一次。no不主动fsync,由OS自己来完成。这个需要根据实际业务场景进行配置
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
aof-use-rdb-preamble yes
lua-time-limit 5000
slowlog-log-slower-than 10000
slowlog-max-len 128
latency-monitor-threshold 0
notify-keyspace-events ""
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-size -2
list-compress-depth 0
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
hll-sparse-max-bytes 3000
stream-node-max-bytes 4096
stream-node-max-entries 100
# 是否开启顶层数据结构的rehash功能,如果内存允许,请开启。rehash能够很大程度上提高K-V存取的效率
activerehashing yes
# 客户端buffer控制。在客户端与server进行的交互中,每个连接都会与一个buffer关联,此buffer用来队列化等待被client接受的响应信息。如果client不能及时的消费响应信息,那么buffer将会被不断积压而给server带来内存压力.如果buffer中积压的数据达到阀值,将会导致连接被关闭,buffer被移除。
#buffer控制类型包括:normal -> 普通连接;slave ->与slave之间的连接;pubsub ->pub/sub类型连接,此类型的连接,往往会产生此种问题;因为pub端会密集的发布消息,但是sub端可能消费不足.
#指令格式:client-output-buffer-limit <class> <hard> <soft> <seconds>",其中hard表示buffer最大值,一旦达到阀值将立即关闭连接;
#soft表示"容忍值",它和seconds配合,如果buffer值超过soft且持续时间达到了seconds,也将立即关闭连接,如果超过了soft但是在seconds之后,buffer数据小于了soft,连接将会被保留.
#其中hard和soft都设置为0,则表示禁用buffer控制.通常hard值大于soft.
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit replica 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
# Redis server执行后台任务的频率,默认为10,此值越大表示redis对"间歇性task"的执行次数越频繁(次数/秒)。"间歇性task"包括"过期集合"检测、关闭"空闲超时"的连接等,此值必须大于0且小于500。此值过小就意味着更多的cpu周期消耗,后台task被轮询的次数更频繁。此值过大意味着"内存敏感"性较差。建议采用默认值。
hz 10
dynamic-hz yes
aof-rewrite-incremental-fsync yes
rdb-save-incremental-fsync yes
jemalloc-bg-thread yes
设置配置文件运行redis
# 删除redis容器
docker rm -f myredis
# 设置挂载重新运行redis
docker run -d --privileged=true -p 8808:8808 --restart always -v /usr/local/docker/redis_8808/conf/redis.conf:/etc/redis/redis.conf -v /usr/local/docker/redis_8808/data:/data --name myredis redis redis-server /etc/redis/redis.conf --appendonly yes --requirepass "123456"
-d -> 以守护进程的方式启动容器
-p 6379:6379 -> 绑定宿主机端口
--name myredis -> 指定容器名称
--restart always -> 开机启动
--privileged=true -> 提升容器内权限
-v /root/docker/redis-6379/conf:/etc/redis/redis.conf -> 映射配置文件
-v /root/docker/redis-6379/data:/data -> 映射数据目录
redis-server /etc/redis/redis.conf --appendonly yes -> 在容器里执行redis-server命令,打开redis持久化
--requirepass -> 密码
开启两个redis容器例程:
配置文件结构:
![](https://img-blog.csdnimg.cn/img_convert/ea34fa9cfc9d0bf344d95de4e9f63a04.png)
配置文件区别,只是修改这两处地方为对应的端口号
![](https://img-blog.csdnimg.cn/img_convert/a6826b036f621ead5bded48e489740e7.png)
启动端口号为8808的redis 的容器:
docker run -d --privileged=true -p 8808:8808 --restart always -v /usr/local/docker/redis_8808/conf/redis.conf:/etc/redis/redis_8808.conf -v /usr/local/docker/redis_8808/data:/data_8808 --name redis_8808 redis redis-server /etc/redis/redis_8808.conf --appendonly no --requirepass "123456"
启动端口号为6379的redis 的容器:
docker run -d --privileged=true -p 6379:6379 --restart always -v /usr/local/docker/redis_6379/conf/redis.conf:/etc/redis/redis_6379.conf -v /usr/local/docker/redis_6379/data:/data_6379 --name redis_6379 redis redis-server /etc/redis/redis_6379.conf --appendonly no --requirepass "123456"
测试工具测试
![](https://img-blog.csdnimg.cn/img_convert/1a4311b4ef50f801f8c0a3e57ab694c4.png)