redis的使用-4
一个实例能存2.5亿个key
1、持久化
-
RDB:RDB持久化是指在指定的时间间隔内将内存中的数据集快照写入磁盘。也是 默认 的持久化方式,这种方式是就是将内存中数据以快照的方式写入到二进制文件中,默认的文件名为dump.rdb。
**三种触发机制:**save触发、bgsave触发、自动触发
**save:**该命令会阻塞当前Redis服务器,执行save命令期间,Redis不能处理其他命令,直到RDB过程完成为止。执行完成时候如果存在老的RDB文件,就把新的替代掉旧的。我们的客户端可能都是几万或者是几十万,这种方式显然不可取。
**bgsave:**执行该命令时,Redis会在后台异步进行快照操作,快照同时还可以响应客户端请求。具体操作是Redis进程执行fork操作创建子进程,RDB持久化过程由子进程负责,完成后自动结束。阻塞只发生在fork阶段,一般时间很短。基本上 Redis 内部所有的RDB操作都是采用 bgsave 命令。
**自动触发:**redis.conf配置文件配置如下
save # stop-writes-on-bgsave-error # rdbcompression # rdbchecksum # dbfilename # dir #
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-d7kWMTSO-1615212110847)(https://pics5.baidu.com/feed/1c950a7b02087bf43b4490d50ac25f2a11dfcf7e.jpeg?token=22f387ba78130c6115420059481b2393&s=EF48A15796784D8816E1D9EB03007024)]
-
RDB优缺点
优点:1、在不影响主进程的情况下,会独立创建fork子进程异步去生成文件快照,并替换之前的快照文件
2、数据较大时redis启动时性能相对较优
缺点:1、当对数据要求很高的时侯不宜使用RDB,因为RDB机制问题只存储给定时间内的数据,会导致数据的遗失
2、如果当数据集较大时,可能会导致整个服务器停止服务几百毫秒,甚至是1秒钟。
-
AOF优缺点
优点:1、写入操作采用的是append模式,出现宕机也不会破坏日志文件里的内容
2、当数据不是太大的时候,可以保证数据的完整性
缺点:1、当数据太大时,重启的时候性能太低
-
-
AOF:AOF持久化以日志的形式记录服务器所处理的每一个写、删除操作,查询操作不会记录,以文本的方式记录,可以打开文件看到详细的操作记录。
通过在配置文件中设置appendonly yes开启AOF此时RDB持久化则不再生效,设置为appendonly no 则RDB持久生效。
appendfsync always #每次有数据修改发生时都会写入AOF文件。 appendfsync everysec #每秒钟同步一次,该策略为AOF的缺省策略。 appendfsync no #从不同步。高效但是数据不会被持久化。
RDB原理图
AOF原理图
2、集群的搭建
docker版
# 主从
# 哨兵模式
# 搜索镜像
docker search redis
# 拉取镜像
docker pull redis:latest
# 启动
docker run --name redis1 -d -p 6381:6379 -v /mydata/redis1:/data redis:latest
docker run --name redis2 -d -p 6382:6379 -v /mydata/redis2:/data redis:latest
docker run --name redis3 -d -p 6383:6379 -v /mydata/redis3:/data redis:latest
# 进入redis
docker exec -it redis1 redis-cli
docker exec -it redis2 redis-cli
docker exec -it redis3 redis-cli
# 设置主从
redis2 :SLAVEOF 118.111.22.216 6381
redis3 :SLAVEOF 118.111.22.216 6381
# 查看角色
role
1) "master"
2) (integer) 112
3) 1) 1) "118.111.22.216"
2) "6379"
3) "112"
2) 1) "118.111.22.216"
2) "6379"
3) "112
# 修改每个sentinel.config文件
sentinel monitor mymaster 主节点ip 主节点端口 2
# 启动哨兵模式,进入每个redis
redis-sentinel sentinel.conf
# 当主redis突然宕机时,哨兵会自动重新选取一个主redis,当之前的redis重连后只能为从redis了
3、缓存穿透与雪崩
-
缓存穿透(击穿):在向redis获取某一个key值时,然而redis中不存在该key,此时就要向数据库发起请求,即“缓存穿透”
产生原因:
- 第一次访问
- 恶意访问不存在的key
- Key过期
如何解决与避免:
- 服务器启动时, 提前写入该key
- 规范key的命名, 通过中间件拦截
- 对某些高频访问的Key,设置合理的TTL或永不过期
-
雪崩:缓存层因不知原因宕机,此时所有的请求就会直接请求到存储层,这时存储层可能因大量的并发导致瘫痪,即“雪崩”
如何结局与避免:
- 使用Redis集群
- 限流