拉取Redis镜像
docker pull redis
官网下载redis.conf配置文件
新建Redis本地配置文件和数据存储的目录,并上传官网下载的redis.conf配置文件到新建的配置文件夹下面
# 切换到根路径
cd /
# 在根路径下新建docker-images/redis/conf,docker-images/redis/data,文件目录,建立多级目录加 -p
# 创建好后将下载的redis.conf配置文件上传到/docker-images/redis/conf目录下,作为redis启动的配置文件
mkdir -p docker-images/redis/{conf,data}
启动redis镜像,并挂载之前创建的文件目录
docker run -d --privileged=true --name redis-server -p 6379:6379 -v /docker-images/redis/conf/redis-6379.conf:/etc/redis/redis.conf -v /docker-images/redis/data:/data redis redis-server /etc/redis/redis.conf
进入容器产看redis是否可以连接
# 以redis-cli的方式进入redis-server容器,可以查看redis是否运行成功
docker exec -it redis-server redis-cli
配置文件注释过滤操作和复制命令如下
# 控制台输出配置文件,过滤了注释和空格
cat redis.conf | grep -v "#" | grep -v "^$"
# 将过滤后的配置文件的内容输出到redis-6379.conf文件中
cat redis.conf | grep -v "#" | grep -v "^$" > redis-6379.conf
注意docker方式安装redis,在redis的配置文件中daemonize不可以配置为yes,否则redis启动不起来
Docker 常用命令如下
# 强制删除镜像redis-server
docker rm -f redis-server
# 删除容器镜像
docker container rm redis-server
# 查看运行中的镜像
docker ps
# 查看下载的镜像
docker images
注意点:
应用:
key的命名规范:
user:id:123:name
String的数据结构为简单动态字符串(Simple Dynamic String,缩写SDS)。是可以修改的字符串,内部结构实现上类似于Java的ArrayList,采用预分配冗余空间的方式来减少内存的频繁分配。
如图中所示,内部为当前字符串实际分配的空间capacity一般要高于实际字符串长度len。当字符串长度小于1M时,扩容都是加倍现有的空间,如果超过1M,扩容时一次只会多扩1M的空间。需要注意的是字符串最大长度为512M。
注意点:
应用:
Hash类型对应的数据结构是两种:ziplist(压缩列表),hashtable(哈希表)。当field-value长度较短且个数较少时,使用ziplist,否则使用hashtable。
注意点:
应用场景:
List的数据结构为快速链表quickList。
首先在列表元素较少的情况下会使用一块连续的内存存储,这个结构是ziplist,也即是压缩列表,它将所有的元素紧挨着一起存储,分配的是一块连续的内存,当数据量比较多的时候才会改成quicklist,因为普通的链表需要的附加指针空间太大,会比较浪费空间。比如这个列表里存的只是int类型的数据,结构上还需要两个额外的指针prev和next。
注意点:
应用:
Set数据结构是dict字典,字典是用哈希表实现的。
Java中HashSet的内部实现使用的是HashMap,只不过所有的value都指向同一个对象,Redis的set结构也是一样,它的内部也使用hash结构,所有的value都指向同一个内部值。
注意点:
应用:
SortedSet(zset)是Redis提供的一个非常特别的数据结构,一方面它等价于Java的数据结构Map
zset底层使用了两个数据结构:
导入依赖
<dependency>
<groupId>redis.clientsgroupId>
<artifactId>jedisartifactId>
<version>3.2.0version>
dependency>
配置连接信息
redis.host=127.0.0.1
redis.port=6379
# 最大连接数
redis.maxTotal=30
# 可用连接数
redis.maxIdle=10
创建封装连接
public class JedisUtil {
private static Jedis jedis = null;
private static String host = null;
private static int port;
private static int maxTotal;
private static int maxIdle;
//使用静态代码块,只加载一次
static {
//读取配置文件
ResourceBundle resourceBundle = ResourceBundle.getBundle("redis");
//获取配置文件中的数据
host = resourceBundle.getString("redis.host");
port = Integer.parseInt(resourceBundle.getString("redis.port"));
//读取最大连接数
maxTotal = Integer.parseInt(resourceBundle.getString("redis.maxTotal"));
//读取最大活跃数
maxIdle = Integer.parseInt(resourceBundle.getString("redis.maxIdle"));
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
jedisPoolConfig.setMaxTotal(maxTotal);
jedisPoolConfig.setMaxIdle(maxIdle);
//获取连接池
JedisPool jedisPool = new JedisPool(jedisPoolConfig, host, port);
jedis = jedisPool.getResource();
}
public Jedis getJedis() {
return jedis;
}
}
Jedis的API和redis命令相同
Redis 提供了2个不同形式的持久化方式:
概述:在指定的时间间隔内将内存中的数据集快照写入磁盘, 也就是行话讲的Snapshot快照,它恢复时是将快照文件直接读到内存里
执行过程:
Redis会单独创建(fork)一个子进程来进行持久化,会先将数据写入到 一个临时文件中,待持久化过程都结束了,再用这个临时文件替换上次持久化好的文件。 整个过程中,主进程是不进行任何IO操作的,这就确保了极高的性能如果需要进行大规模数据的恢复,且对于数据恢复的完整性不是非常敏感,那RDB方式要比AOF方式更加的高效。RDB的缺点是最后一次持久化后的数据可能丢失。
方式1
手动命令方式,redis客户端连接后输入以下命令,就可手动保存,但是其只管保存,其它不管,全部阻塞,不建议。
save
方式2
手动命令方式,redis客户端连接后输入以下命令,Redis会在后台异步进行快照操作, 快照同时还可以响应客户端请求,可以通过lastsave 命令获取最后一次成功执行快照的时间
bgsave
# 两种特殊启动方式
# 1.服务器运行过程中重启
debug reload
# 2.关闭服务器时指定保存数据
shutdown save
方式3
修改redis.conf配置文件配置save的参数,具体查看下面
配置文件示例
# 绑定的主机地址
bind 127.0.0.1
# 保护模式启动
protected-mode yes
#启动的端口
port 6379
# 是否后台启动,docker环境下设为no,否则redis启动不了
daemonize no
supervised no
#pid文件存放位置
pidfile /var/run/redis_6379.pid
# 设置服务器以指定日志记录级别,debug|verbose|notice|warning
loglevel notice
#日志文件名
logfile "6379.log"
#默认数据库的数量
databases 16
#是否显示日志
always-show-logo yes
#配置RDB持久化策略 每20秒2个key变化就持久化
save 20 2
#bgsave持久化错误就不保存当前数据
stop-writes-on-bgsave-error yes
#开启RDB文件的压缩
rdbcompression yes
#校验RDB文件
rdbchecksum yes
#配置RDB持久化的文件名
dbfilename dump-6379.rdb
rdb-del-sync-files no
#配置数据保存的目录
dir ./
#设置同一时间最大客户端连接数,默认无限制。当客户端连接到达上限,Redis会关闭新的连接
maxclients 0
#客户端闲置等待最大时长,达到最大值后关闭连接。如需关闭该功能,设置为 0
timeout 30
#导入并加载指定配置文件信息,用于快速创建redis公共配置较多的redis实例配置文件,便于维护
include /path/server-6379.conf
注意:
概述:以日志的形式来记录每个写操作(增量保存),将Redis执行过的所有写指令记录下来(读操作不记录), 只许追加文件但不可以改写文件,redis启动之初会读取该文件重新构建数据,换言之,redis 重启的话就根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作,目前已经是Redis持久化的主流方式
执行过程:
概述
随着命令不断写入AOF,文件会越来越大,为了解决这个问题,Redis引入了AOF重写机制压缩文件体积。AOF文件重 写是将Redis进程内的数据转化为写命令同步到新AOF文件的过程。简单说就是将对同一个数据的若干个条命令执行结 果转化成最终结果数据对应的指令进行记录。
作用
原理
AOF文件持续增长而过大时,会fork出一条新进程来将文件重写(也是先写临时文件最后再rename),redis4.0版本后的重写,是指把rdb 的快照,以二进制的形式附在新的aof头部,作为已有的历史数据,替换掉原来的流水账操作。
方式1
手动以命令方式开启,命令如下
bgrewriteaof
方式2
配置文件配置AOF重写条件
# 触发AOF重写的最小文件大小
auto-aof-rewrite-min-size size
# 触发AOF重写的百分比
auto-aof-rewrite-percentage percent
运行指令redis-cli 连接Redis服务后使用info Persistence命令获取aof_current_size与aof_base_size参数,这两个参数为系统载入时或者上次重写完毕时,Redis会记录的AOF大小
方式2根据如下添加是否成立来进行自动的AOF重写
AOF写数据三种策略(appendfsync)
配置文件AOF持久化相关配置属性
配置示例
#基本配置
bind 127.0.0.1
protected-mode yes
port 6379
daemonize no
supervised no
pidfile /var/run/redis_6379.pid
loglevel notice
logfile "6379.log"
databases 16
always-show-logo yes
save 20 2
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump-6379.rdb
rdb-del-sync-files no
dir ./
#开启密码
requirepass 666
#开启AOF持久化
appendonly yes
#AOF持久化的文件名
appendfilename "appendonly-6379.aof"
#AOF持久化策略
appendfsync everysec
no-appendfsync-on-rewrite no
#AOF重写条件百分比设置
auto-aof-rewrite-percentage 100
#AOF重写条件文件大小设置
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
aof-use-rdb-preamble yes
概述:
redis事务就是一个命令执行的队列,将一系列预定义命令包装成一个整体(一个队列)。当执行时,一次性 按照添加顺序依次执行,中间不会被打断或者干扰,一个队列中,一次性、顺序性、排他性的执行一系列命令
基本命令
语法错误,指命令书写格式有误
运行错误 指命令格式正确,但是无法正确的执行,例如对list进行incr操作
一个请求想给金额减8000
一个请求想给金额减5000
悲观锁(Pessimistic Lock):顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。
乐观锁(Optimistic Lock):顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。乐观锁适用于多读的应用类型,这样可以提高吞吐量。Redis就是利用这种check-and-set机制实现事务的。
基本命令
应用
基本命令
利用setnx命令的返回值特征,有值则返回设置失败,无值则返回设置成功
锁过期时间的设定
由于操作通常都是微秒或毫秒级,因此该锁定时间不宜设置过大,具体时间需要业务测试后确认。
*
120%+平均网络延迟*
110%应用
Redis是一种内存级数据库,所有数据均存放在内存中,内存中的数据可以通过TTL指令获取其状态
数据删除策略的目标
在内存占用与CPU占用之间寻找一种平衡,顾此失彼都会造成整体redis性能的下降,甚至引发服务器宕机或 内存泄露
定时删除
惰性删除
定期删除
当新数据进入redis时,如果内存不足怎么办?
相关配置
配置文件属性
相关删除策略如下
检测易失数据(可能会过期的数据集server.db[i].expires )
检测全库数据(所有数据集server.db[i].dict )
放弃数据驱逐
调优依据
概述
现代计算机用二进制(位) 作为信息的基础单位, 1个字节等于8位, 例如“abc”字符串是由3个字节组成, 但实际在计算机存储时将其用二进制表示, “abc”分别对应的ASCII码分别是97、 98、 99, 对应的二进制分别是01100001、 01100010和01100011,如下图
合理地使用操作位能够有效地提高内存使用率和开发效率,Redis提供了Bitmaps这个数据类型可以实现对位的操作:
基本命令
注意点
应用
概述
在工作当中,我们经常会遇到与统计相关的功能需求,比如统计网站PV(PageView页面访问量),可以使用Redis的incr、incrby轻松实现,但像UV(UniqueVisitor,独立访客)、独立IP数、搜索记录数等需要去重和计数的问题如何解决?这种求集合中不重复元素个数的问题称为基数问题。
解决基数问题有很多种方案:
以上的方案结果精确,但随着数据不断增加,导致占用空间越来越大,对于非常大的数据集是不切实际的。
能否能够降低一定的精度来平衡存储空间?Redis推出了HyperLogLog
Redis HyperLogLog 是用来做基数统计的算法,HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定的、并且是很小的。
在 Redis 里面,每个 HyperLogLog 键只需要花费 12 KB 内存,就可以计算接近 2^64 个不同元素的基数。这和计算基数时,元素越多耗费内存就越多的集合形成鲜明对比,但是,因为 HyperLogLog 只会根据输入元素来计算基数,而不会储存输入元素本身,所以HyperLogLog 不能像集合那样,返回输入的各个元素。
什么是基数?
比如数据集 {1, 3, 5, 7, 5, 7, 8}, 那么这个数据集的基数集为 {1, 3, 5 ,7, 8}, 基数(不重复元素)为5。 基数估计就是在误差可接受的范围内,快速计算基数。
基本命令
注意点
应用
概述
Redis 3.2 中增加了对GEO类型的支持。GEO,Geographic,地理信息的缩写。该类型,就是元素的2维坐标,在地图上就是经纬度。redis基于该类型,提供了经纬度设置,查询,范围查询,距离查询,经纬度Hash等常见操作。
基本命令
应用
概述
Redis 发布订阅 (pub/sub) 是一种消息通信模式:发送者 (pub) 发送消息,订阅者 (sub) 接收消息,Redis 客户端可以订阅任意数量的频道。
流程图
注意
概述
为了避免单点Redis服务器故障,准备多台服务器,互相连通。将数据复制多个副本保存在不同的服 务器上,连接在一起,并保证数据是同步的。即使有其中一台服务器宕机,其他服务器依然可以继续 提供服务,实现Redis的高可用,同时实现数据冗余备份。
多服务器连接方案
主从复制即将master中的数据即时、有效的复制到slave中
特征:一个master可以拥有多个slave,一个slave只对应一个master
职责:
概述
大致可以分为三个阶段
建立slave到master的连接,使master能够识别slave,并保存slave端口号
步骤
状态
在slave初次连接master后,复制master中的所有数据到slave
将slave的数据库状态更新成master当前的数据库状态
数据同步阶段master说明
解决方法
配置文件中配置一下属性,具体配置数据大小参考如下说明
#配置复杂缓冲区的内存大小
repl-backlog-size 1mb
数据同步阶段slave说明
配置命令
# 配置从机进行全量复制和部分复制时该机是否对外服务
slave-serve-stale-data yes|no
当master数据库状态被修改后,导致主从服务器数据库状态不一致,此时需要让主从数据同步到一致的 状态,同步的动作称为命令传播,master将接收到的数据变更命令发送给slave,slave接收命令后执行命令
命令传播阶段的部分复制
命令传播阶段出现了断网现象
部分复制的三个核心要素
服务器运行ID(runid)
复制缓冲区
主从服务器复制偏移量(offset)
心跳机制
心跳阶段注意事项
当slave多数掉线,或延迟过高时,master为保障数据稳定性,将拒绝所有信息同步操作
#slave数量少于2个,或者所有slave的延迟都大于等于10秒时,强制关闭master写功能,停止数据同步
min-slaves-to-write 2
min-slaves-max-lag 10
slave数量由slave发送REPLCONF ACK命令做确认
slave延迟由slave发送REPLCONF ACK命令做确认
创建一台主机,两台从机的3个配置文件,使用include引入默认的配置文件
注意:以docker方式配置主从复制,配置文件中要注释一下两个配置属性bind 127.0.0.1
,protected-mode yes
,否则配置后主从机无法连接通信,protected-mode yes
可以改为no
#主机配置文件-6379
port 6379
tcp-backlog 511
timeout 0
tcp-keepalive 300
daemonize no
supervised no
pidfile /var/run/redis_6379.pid
loglevel notice
logfile "6379.log"
rdb-del-sync-files no
databases 16
always-show-logo yes
save 20 2
dbfilename dump6379.rdb
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dir ./
#从机1配置文件-6380
port 6380
tcp-backlog 511
timeout 0
tcp-keepalive 300
daemonize no
supervised no
pidfile /var/run/redis_6380.pid
loglevel notice
logfile "6380.log"
rdb-del-sync-files no
databases 16
always-show-logo yes
save 20 2
dbfilename dump6380.rdb
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dir ./
#从机1配置文件-6381
port 6381
tcp-backlog 511
timeout 0
tcp-keepalive 300
daemonize no
supervised no
pidfile /var/run/redis_6381.pid
loglevel notice
logfile "6381.log"
rdb-del-sync-files no
databases 16
always-show-logo yes
save 20 2
dbfilename dump6381.rdb
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dir ./
技巧快速创建并修改文件中的端口
# 将redis-6379.conf文中所有的6379端口变为6380之后保存到redis-6380.conf中
sed 's/6379/6380/g' redis-6379.conf > redis-6380.conf
#6379主机
docker run -d --name redis-79 -p 6379:6379 -v /docker-images/redis/conf/redis-6379.conf:/etc/redis/redis.conf -v /docker-images/redis/data:/data redis redis-server /etc/redis/redis.conf
#6380从机1
docker run -d --name redis-80 -p 6380:6380 -v /docker-images/redis/conf/redis-6380.conf:/etc/redis/redis.conf -v /docker-images/redis/data:/data redis redis-server /etc/redis/redis.conf
#6381从机2
docker run -d --name redis-81 -p 6381:6381 -v /docker-images/redis/conf/redis-6381.conf:/etc/redis/redis.conf -v /docker-images/redis/data:/data redis redis-server /etc/redis/redis.conf
3. 使用redis客户端连接查看redis的信息,此时全部为主机
#使用客户端工具连接主机
docker exec -it redis-79 redis-cli
#使用客户端工具连接从机1
docker exec -it redis-80 redis-cli -p 6380
#使用客户端工具连接从机2
docker exec -it redis-81 redis-cli -p 6381
4. 进入6379、6380、6381容器查看各个容器的ip地址,主要记住6379主机的ip地址,这里为172.17.0.2
root@veo:/# docker inspect redis-79 redis-80 redis-81 | grep IPAddress
"SecondaryIPAddresses": null,
"IPAddress": "",
"IPAddress": "172.17.0.2",
"SecondaryIPAddresses": null,
"IPAddress": "",
"IPAddress": "172.17.0.3",
"SecondaryIPAddresses": null,
"IPAddress": "",
"IPAddress": "172.17.0.4",
配置6380和6381从机的主机
#6380 配置如下
127.0.0.1:6380> slaveof 172.17.0.2 6379
OK
#6381配置如下
127.0.0.1:6381> slaveof 172.17.0.2 6379
OK
以上主从复制搭建成功
以配置文件配置主从复制,按如上流程下来,只需在6380和6381机子的配置文件添加如下
#从机1配置文件-6380中添加主机的ip和端口,ip之前以查出容器中的ip
slaveof 172.17.0.2 6379
#从机1配置文件-6381中添加
slaveof 172.17.0.2 6379
概述
哨兵(sentinel) 是一个分布式系统,用于对主从结构中的每台服务器进行监控,当出现故障时通过投票机制选择新的master并将所有slave连接到新的master。
作用
注意点
哨兵在进行主从切换过程中经历三个阶段
阶段一:监控阶段
用于同步各个节点的状态信息
阶段二:通知阶段
阶段三:故障转移阶段
小结
根据上面的主从复制,接下来为其添加三个哨兵,创建三个哨兵的配置文件,主要配置哨兵要监听的主机的ip地址和端口号
快速复制 sed "s/26379/26381/g" sentinel-6379.conf > sentinel-6381.conf
#哨兵1的端口
port 26379
#取消后台启动否则docker中启动不了
daemonize no
#pid存储位置
pidfile /var/run/redis-sentinel.pid
#日志文件名
logfile "sentinel-26379.log"
dir /tmp
#其中172.17.0.2 为 redis-79主机 的 ip,6379 为 redis-79主机 的端口,2 为最小投票数(因为有 3 台 Sentinel 所以可以设置成 2)
sentinel monitor mymaster 172.17.0.2 6379 2
#指定哨兵在监控Redis服务时,判定服务器挂掉的时间周期,默认30秒(30000),也是主从切换的启动条件之一
sentinel down-after-milliseconds mymaster 10000
#指定同时进行主从的slave数量,数值越大,要求网络资源越高,要求约小,同步时间约长
sentinel parallel-syncs mymaster 1
#指定出现故障后,故障切换的最大超时时间,超过该值,认定切换失败,默认3分钟
sentinel failover-timeout mymaster 180000
#哨兵2
port 26380
daemonize no
pidfile /var/run/redis-sentinel.pid
logfile "sentinel-26380.log"
dir /tmp
sentinel monitor mymaster 172.17.0.2 6379 2
sentinel down-after-milliseconds mymaster 10000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
sentinel deny-scripts-reconfig yes
#哨兵3
port 26381
daemonize no
pidfile /var/run/redis-sentinel.pid
logfile "sentinel-26381.log"
dir /tmp
sentinel monitor mymaster 172.17.0.2 6379 2
sentinel down-after-milliseconds mymaster 10000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
sentinel deny-scripts-reconfig yes
启动三个哨兵
#第一个哨兵
docker run -d --name sentinel-1 -p 26379:26379 -v /docker-images/redis/conf/sentinel-26379.conf:/etc/redis/sentinel.conf redis redis-sentinel /etc/redis/sentinel.conf
#第二个哨兵
docker run -d --name sentinel-2 -p 26380:26380 -v /docker-images/redis/conf/sentinel-26380.conf:/etc/redis/sentinel.conf redis redis-sentinel /etc/redis/sentinel.conf
#第三个哨兵
docker run -d --name sentinel-3 -p 26381:26381 -v /docker-images/redis/conf/sentinel-26381.conf:/etc/redis/sentinel.conf redis redis-sentinel /etc/redis/sentinel.conf
3. 进入哨兵容器内部,使用info sentinel
命令查看内部配置信息
docker exec -it sentinel-1 redis-cli -p 26379
docker exec -it sentinel-2 redis-cli -p 26380
docker exec -it sentinel-3 redis-cli -p 26381
4. 此时使用docker stop redis-79
停掉主机,在进入容器内部查看信息,此时经过三个哨兵投票选择了slave2成为新的主机,此时重启master后,master会成为slave2的从机
概述
当容量不够,redis如何进行扩容,并发写操作, redis如何分摊?
另外,主从模式,主机宕机,导致ip地址发生变化,应用程序中配置需要修改对应的主机地址、端口等信息,之前通过代理主机来解决,但是redis3.0中提供了解决方案,就是无中心化集群配置。
Redis 集群实现了对Redis的水平扩容,即启动N个redis节点,将整个数据库分布存储在这N个节点中,每个节点存储总数据的1/N。
Redis 集群通过分区(partition)来提供一定程度的可用性(availability): 即使集群中有一部分节点失效或者无法进行通讯, 集群也可以继续处理命令请求。
作用
一个 Redis 集群包含 16384 个插槽(hash slot), 数据库中的每个键都属于这 16384 个插槽的其中一个,
集群使用公式 CRC16(key) % 16384 来计算键 key 属于哪个槽, 其中 CRC16(key) 语句用于计算键 key 的 CRC16 校验和 。
集群中的每个节点负责处理一部分插槽。 举个例子, 如果一个集群可以有主节点, 其中:
注意点
搭建一个三主三从的主从复制结构,可参考上方配置,配置6个配置文件6379、6380、6381、6382、6383、6384内容如下
#6379端口配置文件,其他配置文件就该一下端口和配置文件名即可
port 6379
tcp-backlog 511
timeout 0
tcp-keepalive 300
daemonize no
supervised no
pidfile /var/run/redis_6379.pid
loglevel notice
logfile "6379.log"
rdb-del-sync-files no
databases 16
always-show-logo yes
save 20 2
dbfilename dump6379.rdb
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dir ./
#开启集群模式
cluster-enabled yes
#集群模式的配置文件名
cluster-config-file nodes-6379.conf
#节点服务响应超时时间,用于判定该节点是否下线或切换为从节点
cluster-node-timeout 15000
# master连接的slave最小数量
cluster-migration-barrier 1
启动六个redis容器实例
docker run -d --name redis-79 -p 6379:6379 -v /docker-images/redis/conf/redis-6379.conf:/etc/redis/redis.conf -v /docker-images/redis/data:/data redis redis-server /etc/redis/redis.conf
docker run -d --name redis-80 -p 6380:6380 -v /docker-images/redis/conf/redis-6380.conf:/etc/redis/redis.conf -v /docker-images/redis/data:/data redis redis-server /etc/redis/redis.conf
docker run -d --name redis-81 -p 6381:6381 -v /docker-images/redis/conf/redis-6381.conf:/etc/redis/redis.conf -v /docker-images/redis/data:/data redis redis-server /etc/redis/redis.conf
docker run -d --name redis-82 -p 6382:6382 -v /docker-images/redis/conf/redis-6382.conf:/etc/redis/redis.conf -v /docker-images/redis/data:/data redis redis-server /etc/redis/redis.conf
docker run -d --name redis-83 -p 6383:6383 -v /docker-images/redis/conf/redis-6383.conf:/etc/redis/redis.conf -v /docker-images/redis/data:/data redis redis-server /etc/redis/redis.conf
docker run -d --name redis-84 -p 6384:6384 -v /docker-images/redis/conf/redis-6384.conf:/etc/redis/redis.conf -v /docker-images/redis/data:/data redis redis-server /etc/redis/redis.conf
3. 查看每个redis的实例记录其ip,这里使用docker网络模式的桥接模式,内部通过docker-0来转换网络的连接
4. 随机进入一个redis容器,使用ip地址配置6个redis集群,记住--cluster-replicas
后面要加一个配置的数字,数字表示一个master连接几个slaves
docker exec -it redis-79 redis-cli --cluster create --cluster-replicas 1 172.17.0.2:6379 172.17.0.3:6380 172.17.0.4:6381 172.17.0.5:6382 172.17.0.6:6383 172.17.0.7:6384
直接以普通方式登录主机,存储数据时,会出现MOVED重定向操作,所以,应该以集群方式登录
docker exec -it redis-79 redis-cli -c
docker exec -it redis-80 redis-cli -c -p 6380
当其中一台主机下线后后,其对应的从机就会替代主机的位置成为主机,当下线的主机重启后会变成其之前从机的从机
问题
服务器启动后迅速宕机
原因
解决方案
小结
缓存预热就是系统启动前,提前将相关的缓存数据直接加载到缓存系统,避免在用户请求的时候,先查询数据库,然后再将数据缓存的问题,用户直接查询事先被预热的缓存数据。
问题
原因
解决方案
问题
原因
解决方案
小结
缓存击穿就是单个高热数据过期的瞬间,数据访问量较大,未命中redis后,发起了大量对同一数据的数据库访问,导致对数据库服 务器造成压力。应对策略应该在业务数据分析与预防方面进行,配合运行监控测试与即时调整策略,毕竟单个key的过期监控难度 较高,配合雪崩处理策略即可。
问题
解决方案