Redis详解【持久化、读写分离、主从同步、哨兵模式】

Redis

知识体系结构:

​ 数据类型、基本操作

​ 持久化AOF/RDB

​ 事务的控制

​ 复制

NoSQL: not only sql 泛指非关系性数据库,克服了关系性数据库在【海量数据】和【高并发】情况下的缺点

  • 非关系性数据的特点:

    1. 数据主要存储在内存中,因而读写效率高,但断电易丢失数据。
    2. 有些非关系性数据支持持久化数据到硬盘,如redis
  • 非关系型数据库的分类:

    1. 键值(key-value)型数据库:代表Redis、MemcacheDB
    2. 列存储数据库:代表Hbase
    3. 文档型数据库:代表MongoDB
    4. 图形数据库
  • 什么是Redis?

    Redis:Remote Dictionary Server 远程字典服务器

    Redis是开源的、C语言写的非关系性数据库,键值(key-value)型数据库

  • Redis的特点

    1. 数据存储在内存中,为保证数据安全,能不定期持久化数据到硬盘

    2. Redis支持的五种数据类型:

      字符串【String】、哈希【hash】、列表【list】、集合【set】、有序集合【sorted set】

      • Hash存储对象的命令:HMSet key field value,其中key为对象名,field为对象的字段名,value为对象的字段值

      • Set存储对象的命令:SADD key member1 ,其中key为集合名,member1为String类型的元素。

        set是无序集合,元素不能重复

      • ZSet存储对象的命令:ZADD key score member1,其中key为集合名,score为用于排序分数,member1为String类型的元素。

        (1)zset是有序集合,元素重复,但分数(score)却可以重复

        (2)添加的key与集合中已经存在,但分值不同,则更新这个分值

        (3)ZSet类型中分数值非常重要

      • Redis的list数据类型是双向链表实现的,set和zset底层是哈希包

    3. 存取速度快,支持高并发、集群、分布式、主从同步

    4. 支持多种语言的客户端

    5. 支持存储过期----存储过期:存储数据设置一个有效期,时间到了就没了,如vip、微信红包、短信验证码

    6. 支持订阅和发布

  • Redis的应用场景

  1. 中央缓存:最主要的应用
  2. 计数器和定时器:利用Redis的自增和自减方法
  3. 防止暴力攻击:登录失败次数达到指定次数后锁死,访问量大的时候,采用redis集群,支持存储过期(达到一定时长后解锁)
  • Redis和MemcacheDB的异同:

    MemcacheDB逐渐被Redis取代
    相同点:都是key-value类型的nosql,数据存储在内存中,存取速度快,支持并发和集群,都支持存储过期
    不同点:(1)Redis支持的value数据类型比memcached多

    ​ (2)Redis支持持久化数据到硬盘,数据更安全,MemcacheDB只能存内存

Redis的安装

  1. 下载:Redis官网只支持linux版本,windows版本由微软进行维护,需要导GitHub上下载:

    https://github.com/MicrosoftArchive/redis/releases

    Redis的安装:编译后的版本免安装,解压到指定位置即可

  2. 启动redis

Windows版的Redis有2个配置文件,一个是:redis.windows.conf,另一个是redis.windows-service.conf

以服务的方式启动Redis

注册服务:redis-server --service-install 配置文件名【redis.windows-service.conf一般用于注册服务】

停止服务:redis-server --service-stop

卸载服务:redis-server --service-uninstall 【卸载服务之前必须停止服务】

开启服务:redis-server --service-start

直接以dos命令的方式

  • Redis服务端的启动:Redis服务端目录下cmd进行dos窗口:redis-server.exe redis.windows.conf

  • Redis自带客户端的启动:

    (1)服务端在本地时,双击redis-cli.exe,默认取连接本地6379端口----这种方式只能连接本地Redis服务器(2)服务端不在本地时【端口默认为6379】,Redis客户端目录的dos窗口下:

    ​ Redis-cli.exe -h ip地址 -p 6379----------这种方式既能连接本地,也能连接非本地redis服务器
    注意:在本地时,启动Redis的服务端和客户端要分别打开2个dos窗口进行命令操作

  • 界面化的客户端工具:redis desktop manager

Redis密码的设置

  • 设置临时密码,重启就会失效:config set requirepass 密码
    登录:auth 密码
    取消密码:config set requirepass “”—必须登录才能取消

  • 设置永久密码:
    (1)在配置文件redis.windows.conf中搜索requirepass,找到后在【#requirepass】设置密码

    (2)重启redis,服务端启动时需要加载该文件
    (3)客户端密码登录:auth 密码

  • Redis的16个数据库

    Redis默认有16个数据库,索引为0-15,在redis.windows.conf配置文件中可以修改。默认使用 0 号数据库

    • 选择1号数据库:select 1
    • 将1号库的数据移动到5号库:【move 键名 库的编号】
    • 清空当前数据库中的所有key:flushdb
    • 清空所有数据库中的所有key:flushall
    • 请求服务器关闭与当前客户端的连接:quit
    • 客户端测试服务端是否正常运行命令:ping ,如果返回pong,则服务端运行正常

常用简单命令

  • 查看Redis数据库中所有的key:keys *

    Redis模糊查询命令:keys k?, 其中?只占一位,也可以用:keys h???

  • 删除某个键值对:del age

  • 查看类型:type age

  • 设置某个某个键值对的过期时间:expire sex 30【expire 键 时间】

    设置值的时候设置过期时间:setex key 过期时间 value

  • 查看某个某个键值对还有多少秒过期:ttl sex 【查看键为sex的值还有多久过期,-1为永不过期】

    当过期后查询get sex,显示为nil【没有该值】

  • 自增:incr age----age对应的value自增1(如果键不存在,则设置初始化age对应的value为0,再加1)

    自减:decr age-----age对应的value自减1(如果键不存在,则设置初始化age对应的value为0,再减1)

    增加多少:incrBy age 10 age对应的value值加10

    减少多少:decrBy age 5 age对应的value值加5

String类型的常用命令

  • 单个操作

设置值:set name zs----字符串值 value 关联到 key

(1)如果key已有value,则覆盖它。

(2)如果已存在的键值对存在有效期,则有效期对覆盖后的新值不起作用

获取值: get name----假如 key 储存的值不是字符串类型,返回一个错误,因为 GET 只能用于处理字符串值。

追加值:append name ls-----结果:zsls

  • 批量操作 m前缀表示:more

批量设置value值:mset name ls age 18 sex true【mset key1 value1 key2 value2】

批量获取value值:mget age name【mget key1 key2】

  • 区间操作

getrange key start stop:获取指定区间的数据

setrange key start value :设置从指定起点开始的内容,覆盖原有内容,未覆盖的保留

不存在相同的key键才存储值:setnx key value【if not exist】
批量也可以:msetnx key1 value1 key2 value2

List类型的常用命令

List列表中:0表示第一个元素,1表示第2个元素,-1表示倒数第1个元素,-2表示倒数第2个元素

  • 添加列表元素

lpush key value1 value2:各个 value 值按从左到右的顺序依次插入到表头----返回值:列表长度

rpush key value1 value2:各个 value 值按从左到右的顺序依次插入到表尾----返回值:列表长度

如果 key 不存在,一个空列表会先创建再执行 lpush/rpush操作

  • 获取列表元素

lrange key start stop:返回列表 key 中指定区间内的元素【闭区间】

lrange key 0 -1:查询列表的所有元素

  • 获取列表长度:llen key
  • 删除列表元素
lpop key:移除并返回列表 key 的第一个元素【key为列表名】
rpop key: 移除并返回列表 key 的最后一个元素
lrem key cout value:根据参数 count 的值,移除列表key中与参数 value 相等的元素。
count > 0 : 从表头开始向表尾搜索,移除与 value 相等的元素,数量为 count 。
count < 0 : 从表尾开始向表头搜索,移除与 value 相等的元素,数量为 count 的绝对值。
count = 0 : 移除表中所有与 value 相等的值。
lindex key index:返回列表 key 中,下标为 index 的元素
ltrim key start stop:让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除

Hash类型的常用命令

单个
HSET key field value:将哈希表 key 中的域 field 的值设为 value 
HGET key field:返回哈希表 key 中给定域 field 的值

批量
HMSET key field value [field value ...]:同时将多个 field-value (域-值)对设置到哈希表 key 中
HMGET key field [field ...]:返回哈希表 key 中,一个或多个给定域的值


HKEYS key 返回哈希表 key 中的所有键
HVALS key 返回哈希表 key 中所有域的值
HGETALL key 返回哈希表 key 中,所有的域和值

hdel obj field value 删除对象里某个字段
hlen key  获取对象中的字段个数
hexists obj field  判断对象中是否存在某个字段,存在返回1,不存在返回-1

Redis六大最大内存淘汰策略

**Redis淘汰策略:**当redis缓存的数据到达配置的最大内存后,会按照配置淘汰策略进行淘汰,可以在redis.windows.conf配置文件中的【 MAXMEMORY POLICY】处进行配置

LRU算法:Least Recently Used 最近最少使用的算法

  1. volatile-lru :在设置了过期时间的Key空间中,移除最近最少使用的key。
  2. allkeys-lru: 在所有Key中,优先移除最近最少使用的key
  3. volatile-random : 在设置了过期时间的key中,随机移除一个键
  4. allkeys-random : 在所有Key中,随机移除某个key。
  5. volatile-ttl: 在设置了过期时间的Key中,优先移除最先过期的key
  6. noeviction:不做任何处理,内存达到阀值时,返回错误命令

Redis的配置文件redis.conf

Redis的配置文件redis.conf中:

  1. daemonize 守护进程,设为yes,后台运行的意思,linux下它不会弹窗口,windows下不起作用
  2. 端口号设置
  3. bind ip地址—绑定地址,Redis服务器只能有绑定的IP地址来访问
  4. 数据库个数,默认16个
  5. 密码设置requirepass
  6. 配置淘汰策略
  7. 持久化策略
  8. 配置日志等级

Redis的持久化策略

  • 什么是Redis的持久化策略:通过RDB快照和AOF日志策略来持久化缓存数据,以保证数据安全
  • Redis有两种持久化策略:RDB快照和AOF日志,RDB默认是开启的,AOF默认是关闭的
RDB快照
  • RDB快照策略:Redis在【指定时间间隔内】【至少执行了指定次数】的写操作,就将缓存数据的快照保存到磁盘中,恢复时直接将快照读取到内存中。
  • RDB快照策略保存的默认文件名为dump.rdb,备份时后一次备份会覆盖前一次备份
  • 每次快照持久化都是将内存数据完整写入到新的rdb文件,并不是只同步脏数据(更新部分的数据)
  • RDB的缺点:RDB文件每隔一段时间才会保存一次内存中的缓存数据,一旦发生掉电,服务器将丢失最后一次写入的数据
  • 如果想立即备份,则控制台直接输入:save或者bgsave,不等到指定时间就可以立即备份
  • 禁用RDB策略:在配置文件中,不要使用任何save指令,或者save “” 【save一个空字符串】
# save ""
save 900 1   -------------900秒内至少有1个更改
save 300 10  -------------300秒内至少有10个更改
save 60 10000-------------60秒内至少有10000个更改

dbfilename dump.rdb-----设置保存数据的RDB文件名称,默认的文件名为:dump.rdb
dir ./----------------设置RDB文件的存放目录,默认本地数据库目录下
  • RDB快照策略的应用场景:适合大规模的数据恢复
save与bgsave保存RDB文件的区别

执行save和bgsave命令后,不必等时间间隔到了再执行

  • Save 命令执行一个同步保存操作,将缓存中所有数据的快照以RDB文件的形式保存到硬盘

    bgsave命令执行后,Redis会fork出一个新子进程,原来的 Redis 进程继续处理客户端请求,而子进程则负责将数据保存到磁盘

  • SAVE 保存是阻塞主进程,客户端无法连接redis,等SAVE完成后,主进程才开始工作,客户端可以连接。

    BGSAVE 是fork一个save的子进程,在执行save过程中,不影响主进程,客户端可以正常链接redis,等子进程fork执行save完成后,通知主进程,子进程关闭。

  • BGSAVE方式比较适合线上的维护操作
    在这里插入图片描述

AOF日志
  • AOF策略:Append Only File 以日志的形式来记录每个写操作,将Redis执行过的所有写操作指令记录下来(读操作不记录),每条记录都追加到AOF日志文件的末尾。重启时,就日志中保存的写操作指令从前往后执行一次,来恢复数据
  • AOF日志保存的默认文件名为:appendonly.aof
  • AOF策略默认关闭,在redis.windows.conf配置文件中进行配置
  • AOF日志文件遵循resp协议编写。
    在这里插入图片描述
appendonly no  #开关AOF模式-----------yes开启 no则关闭
appendfilename "appendonly.aof"--------设置保存数据的AOF文件名称,默认文件名为appendonly.aof

注意:

AOF策略和RDB策略可以同时配置,当同时存在dump.rdb和appendonly.aof两个文件时,redis启动时优先加载appendonly.aof 文件来恢复数据

  • RDB快照文件是二进制文件,远比AOF日志文件小,恢复时直接加装文件到内存,AOF日志文件则是将日志文件中的指令一条一条执行,效率要比RDB慢
  • Redis启动时,即有aof文件,又有rdb文件,优先选择aof文件恢复数据,因为aof文件数据完整一些。aof需要一条指令一条指令的去恢复,恢复速度相对较慢;rdb是二进制文件,恢复要快些
RDB快照和AOF日志的修复

修饰时都要从redis-check-aof.exe命令和edis-check-rdb.exe命令所在目录进入dos窗口执行

  • aof修复命令:redis-check-aof --fix appendonlly.aof

    扫描aof文件找出第一个出错的命令,并且删除出错命令之后的所有命令,只保留那些为出错的命令,在大多情况下,被删除的都是aof文件末尾的不完整的命令

  • rdb修复命令:redis-check-rdb --fix dump.rdb

    目前没有办法修复出错的快照文件,因为快照文件本身时进行过了压缩,快照中的错误可能会导致剩余不问无法读取,解决办法是将重要的快照保留多个备份,在后期的数据恢复是通过计算快照文件的SHA1散列值和SHA256散列值来对内容进行验证

AOF持久化三种策略
  • appendfsync always:每次发送数据变化会立即同步到磁盘-----性能差,但数据完整性比较好
  • appendfsync Everysec:出厂默认配置,异步操作,每秒记录一次 -----掉电会丢失一秒内的数据
  • appendfsync no:redis不主动同步,由操作系统决定何时同步-----丢失的数据不确定

redis.windows.conf配置文件中进行配置

# appendfsync always
appendfsync everysec
# appendfsync no

AOF的重写机制
在这里插入图片描述

  • 主动触发:使用bgrewriteaof命令,前提是必须开启AOF日志功能。
    在这里插入图片描述
  • 被动触发
    重写原理: 随着AOF文件越来越大,需要定期对AOF文件进行重写,父进程执行fork创建子进程,由子进程根据内存快照执行AOF重写,父进行继续响应后面的命令,在子进程完成重写后,父进程再把新增的写入命令写入到新的AOF文件中

注意: aof重写会fork一个子进程去做,不会对redis正常命令处理有太多影响。

触发重写的条件: Redis会记录上次重写时aof文件的大小,默认当aof文件大小是上次重写后大小的一倍且文件大于64M,触发一次重写。

auto-aof-rewrite-percentage 100----100%即上次重写文件大小的一倍
auto-aof-rewrite-min-size 64mb----重写时文件最小为64M

AOF和RDB的对比: aof占用空间比RDB大,aof恢复速度比RDB慢,AOF比RDB丢失数据少

建议只在从服务器上使用RDB策略

RDB快照文件和AOF日志文件的创建时间: dump.rdb文件是在满足rdb持久化的条件或直接指向save命令时才创建,appendonly.aof文件是配置文件中开启了aof持久化功能启动redis时创建

Redis重启时持久化数据的加载顺序: redis重启时读取配置文件,如果开启了aof持久化功能,则优先加载aof日志文件恢复数据;如果没有则使用rdb快照恢复数据

混合持久化

Redis 4.0 开始引入混合持久化,配置文件中配置开启混合持久化。

aof-use-rdb-preamble yes

原理:
(1)将当前Redis的内存数据生成快照,以RDB文件的格式写入新的aof文件中。
(2)快照写入完成后,将写入快照期间修改数据的指令追加到新aof文件。新的aof文件一开始还不叫appendonly.aof,等到重写完新的aof文件才会改名,覆盖旧的aof文件。
(3)Redis重启时,先加载aof文件中的rdb格式的数据,再加载aof日志格式的数据,这样大大提高了恢复数据的效率。

混合持久化结合了RDB持久化 和 AOF 持久化的优点, 由于绝大部分都是RDB格式,加载速度快,同时结合AOF,增量的数据以AOF方式保存了,数据更少的丢失。

Redis事务

Redis事务的三阶段:开启、入队、执行

muti:开启事务

exec:执行事务

入队:将多个命令入队到事务中,接收到命令后事务并不会立即执行,而是放到等待执行队列当中

discard:放弃事务 watch key:监控key unwatch:放弃监控

Redis事务不是同生共死,执行过程报错,其余未报错的继续执行

  • watch监控,相当于key加一把了乐观锁。通过watch命令监控了多个key,如果在watch之后任何key的值发送了变化,exec执行的事务都会放弃,同时返回调用失败的通知
  • 执行exec后,watch监控会终止

Redis的订阅发布机制

进程间的通信机制:消息发布者发布消息,sub消息订阅者订阅消息后接收消息

主从复制

Redis常见的主从复制架构:一主多从、级联

Redis主从复制的原理

Redis主从复制分为两步:全量复制和增量复制

  • 全量复制:Redis全量复制一般发生在slave发初始化阶段,将master上的所有数据都复制一份到slave

    只要是重新连接master,就会执行一次全量复制

  1. slave连接master,发送SYNC命令
  2. master接收到SYNC命名后,开始执行BGSAVE命令生成快照,并记录生成快照期间的写命令
  3. master器执行完bgsave命令后,向所有slave发送快照文件,并记录发送快照期间的写命令
  4. slave收到快照文件后丢弃所有旧数据,载入收到的快照生成数据
  • 增量复制:全量复制完成后,master每执行一个写命令就会向slave发送相同的写命令,slave接收并执行收到的写命令

总结:全量复制实际是将建立同步关系之前的数据一次性完全复制到slave,增量复制实际是将建立同步关系之后master执行的每条写命令同步到slave

一主多从
  • 复制redis的安装目录【本身就是免安装】,分别命名为master、slave,并修改两者的配置文件redis.windows.conf,将端口号分别命名为9000、9002
  • 将slave的redis.windows.conf配置文件都进行修改:【Replication功能区的配置】

修改前:

# slaveof <masterip> <masterport> 从服务器绑定主服务器
# masterauth <master-password>  从服务器绑定主服务器的密码

修改后:

slaveof 127.0.0.1 9000
masterauth root

  • 测试主从复制:在master服务器进行写操作,slave服务器也会跟随主服务器发生变化

在任何一个redis的客户端执行命令:info,可以查看该服务器的所有相关信息

在master客户端执行此命令:info replication ,可以查看跟主服务器绑定的从服务器数量和状态

Redis默认作为slave作为从服务器时不能进行写操作

配置文件中的默认配置:
slave-read-only yes

总结:

  • 从Redis会同步主Redis的所有文件,即使是在配置主从复制之前的文件,也会复制到从服务器【与Mysql的不同之处】
  • Redis通过配置文件配置主从复制,宕机重启后仍然可以继续工作
级联复制

级联复制:级联复制模式下,部分slave的数据同步不连接主节点,而是连接从节点

只需将redis的配置文件redis.windows.conf中配好端口号和绑定的主服务器即可,这里的主服务器有可能本身也是从服务器

slaveof 127.0.0.1 9002
masterauth root

哨兵模式

  • Redis2.6版本开始提供哨兵模式,但不稳定。Redis2.8开始提供稳定的哨兵模式
  • 哨兵模式是主从模式的升级版,哨兵模式拥有主从复制的所有优点,哨兵为Redis提供了高可用性
  • 单个哨兵进程来监控redis集群是不可靠的,单个哨兵故障后整个集群系统将无法按照预期的方式运行,因此有必要将哨兵集群
  • 哨兵可以监视任意多个主服务器(复用),以及主服务器属下的从服务器,并在被监视的主服务器下线时,自动执行故障转移操作。
哨兵系统的作用

Redis的哨兵系统主要有以下三个功能:监控、提醒、自动故障转移

  1. 监控(Monitoring):哨兵(sentinel) 会不断地检查你的Master和Slave是否运作正常。
  2. 提醒(Notification):当被监控的某个 Redis出现问题时, 哨兵(sentinel) 可以通过 API 向管理员或者其他应用程序发送通知。
  3. 自动故障迁移(Automatic failover):当一个Master不能正常工作时,哨兵(sentinel) 会开始一次自动故障迁移操作,它会将失效Master的其中一个Slave升级为新的Maste,并让失效Master的其他Slave改为复制新的Master; 当客户端试图连接失效的Master时,集群也会向客户端返回新Master的地址,使得集群可以使用Master代替失效Master。
  • 主观下线(Subjectively Down, 简称 SDOWN)指的是单个哨兵对服务器做出的下线判断。
  • 客观下线(Objectively Down, 简称 ODOWN)指的是多个哨兵在对同一个服务器做出 SDOWN 判断,系统就会认为该服务器下线

哨兵的自动故障转移原理

哨兵的自动故障转移原理:当主服务器master宕机,那么哨兵会通过选举(算法)机制,从Salve中选出一个作为新Master,并删除监听列表中出现故障的Master服务器。之前宕机的master重新启动,自动切换成slave,不会自动恢复成master。

哨兵模式的配置
  1. 复制三份redis的安装目录,分别命名为redis1、redis2、redis3,将redis.windows.conf配置文件中端口号分别修改为9000,9001,9002

  2. 启动三个redis服务器,通过redis2、redis3的客户端,分别执行命令:slaveof 127.0.0.1 9000【slaveof 主服务器IP 端口号】,将redis1做为主服务器,redis2、redis3作为从服务器

    如果配置文件中配置:slaveof 主服务器IP 端口号,则不需要执行命令

  3. 配置哨兵:在redis1、redis2、redis3的安装目录下,分别创建一个哨兵的配置文件:sentinel.conf【名称随便取】,配置内容如下:

    # 配置哨兵服务的端口号
    port 9600
    # 配置哨兵监视的主服务器和表决的最少票数
    sentinel monitor mymaster 127.0.0.1 9000 2
    # 3s内mymaster无响应,则认为mymaster宕机了
    sentinel down-after-milliseconds mymaster 3000
    #如果10秒后,mysater仍没启动过来,则启动failover  
    sentinel failover-timeout mymaster 10000  
    
    

    sentinel.conf中的重要配置:sentinel monitor 主服务器的名称 主服务器的IP地址 端口号 表决票数

    failover:故障切换,指系统中其中一项设备或服务失效而无法运作时,另一项设备或服务即可自动接手原失效系统所执行的工作

    • 主服务器的名称随便取
    • 表决票数:用来判断某个Redis 服务器是否下线的参数,Redis下线需要的最少票数。比如有10个哨兵在监控某个master节点,如果需要至少6个哨兵发现master下线后,才认为master真正下线,那么命令中就需要配置参数为6
  4. 启动哨兵:从redis-server.exe 所在的目录进入dos命令窗口,执行:

    redis-server.exe sentinel.conf --sentinel

  5. 启动哨兵后发现:每个哨兵会监视主服务器、从服务器和其他哨兵的运行情况

  6. 关掉主服务器redis1,从服务器会变为主服务器,这个过程中会删除配置文件中的原配置:salveof 新master的IP地址 端口号,另一个从服务器也会更新配置文件中绑定主机IP地址

  7. 一段时间后再启动原主服务器redis1,redis1自动由 master状态变为salve状态,配置文件的末尾会自动添加一行配置:salveof 新master的IP地址 端口号

  • 注意:在哨兵模式的监控过程中,哨兵的配置文件根据master、slave的状态动态修改,主从服务器的配置文件也会动态的添加或删除【salveof 新master的IP地址 端口号】

DOS命令行配置Redis主从复制

  • 直接从服务器的客户端输入命令:slaveof 主服务器IP地址 端口号,也可以实现主从复制
  • 命令行的方式进行配置,会暂时替代配置文件中配置,但重启后就是失效了,仍然以配置文件的为准
  • 当主服务器宕机后,直接在某从服务器的客户端输入命令:slaveof no one,当前从服务就会变为主服务器,其他从服务器只需在客户端输入命令:slaveof 新主服务器IP地址 端口号。如果从服务器变为新的主服务器后,原来的主服务器又恢复正常了,原主服务器就无小弟了。

Redis日志文件

安装目录下的logs文件夹下的redis.log日志文件可以查看redis的相关操作

缓存雪崩

  • **缓存雪崩:**同一时刻,大量的key的集中过期,造成数据库瞬时压力大,甚至引起宕机

    原因:设置了相同的缓存过期时间,重启后过期时间完全相同

  • 解决办法:

  1. 设置不同的缓存过期时间,比如设置10分钟+1到5的随机分钟数
  2. 给每条缓存设置相应的缓存标记,缓存标记的过期时间比缓存数据的过期时间短,缓存标记失效就更新缓存

缓存穿透

  • 缓存穿透: 用户查询的数据,数据库中没有,自然缓存中也没有。这样用户每次查询的时候,相当于进行了两次无效查询:在缓存中找不到,每次都要去数据库查询一次,然后返回空。
  • 解决办法:
  1. 采用布隆过滤器,使用一个足够大的bitmap,用于存储可能访问的key,不存在的key直接被过滤
  2. 访问key未在数据库查询到,也将空值写进缓存,但设置较短过期时间,这样下次同样的请求就有值

缓存击穿

  • 缓存击穿: 一个存在的key,在缓存过期的瞬间,同时有大量的请求,这些请求会直接访问数据库,造成数据库瞬间压力过大
  • 解决办法: 热点数据永不过期或加锁

缓存雪崩和缓存击穿:缓存击穿并发查询同一条数据,缓存雪崩是不同的缓存都过期了,缓存中查询不到而都从查数据库

缓存预热

缓存预热: 系统上线后,将相关的缓存数据直接加载到缓存系统

解决办法: 定期更新缓存

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值