Redis
知识体系结构:
数据类型、基本操作
持久化AOF/RDB
事务的控制
复制
NoSQL: not only sql 泛指非关系性数据库,克服了关系性数据库在【海量数据】和【高并发】情况下的缺点
-
非关系性数据的特点:
- 数据主要存储在内存中,因而读写效率高,但断电易丢失数据。
- 有些非关系性数据支持持久化数据到硬盘,如redis
-
非关系型数据库的分类:
- 键值(key-value)型数据库:代表Redis、MemcacheDB
- 列存储数据库:代表Hbase
- 文档型数据库:代表MongoDB
- 图形数据库
-
什么是Redis?
Redis:Remote Dictionary Server 远程字典服务器
Redis是开源的、C语言写的非关系性数据库,键值(key-value)型数据库
-
Redis的特点
-
数据存储在内存中,为保证数据安全,能不定期持久化数据到硬盘
-
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底层是哈希包
-
-
存取速度快,支持高并发、集群、分布式、主从同步
-
支持多种语言的客户端
-
支持存储过期----存储过期:存储数据设置一个有效期,时间到了就没了,如vip、微信红包、短信验证码
-
支持订阅和发布
-
-
Redis的应用场景
- 中央缓存:最主要的应用
- 计数器和定时器:利用Redis的自增和自减方法
- 防止暴力攻击:登录失败次数达到指定次数后锁死,访问量大的时候,采用redis集群,支持存储过期(达到一定时长后解锁)
-
Redis和MemcacheDB的异同:
MemcacheDB逐渐被Redis取代
相同点:都是key-value类型的nosql,数据存储在内存中,存取速度快,支持并发和集群,都支持存储过期
不同点:(1)Redis支持的value数据类型比memcached多 (2)Redis支持持久化数据到硬盘,数据更安全,MemcacheDB只能存内存
Redis的安装
-
下载:Redis官网只支持linux版本,windows版本由微软进行维护,需要导GitHub上下载:
https://github.com/MicrosoftArchive/redis/releases
Redis的安装:编译后的版本免安装,解压到指定位置即可
-
启动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 最近最少使用的算法
- volatile-lru :在设置了过期时间的Key空间中,移除最近最少使用的key。
- allkeys-lru: 在所有Key中,优先移除最近最少使用的key
- volatile-random : 在设置了过期时间的key中,随机移除一个键
- allkeys-random : 在所有Key中,随机移除某个key。
- volatile-ttl: 在设置了过期时间的Key中,优先移除最先过期的key
- noeviction:不做任何处理,内存达到阀值时,返回错误命令
Redis的配置文件redis.conf
Redis的配置文件redis.conf中:
- daemonize 守护进程,设为yes,后台运行的意思,linux下它不会弹窗口,windows下不起作用
- 端口号设置
- bind ip地址—绑定地址,Redis服务器只能有绑定的IP地址来访问
- 数据库个数,默认16个
- 密码设置requirepass
- 配置淘汰策略
- 持久化策略
- 配置日志等级
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,就会执行一次全量复制
- slave连接master,发送SYNC命令
- master接收到SYNC命名后,开始执行BGSAVE命令生成快照,并记录生成快照期间的写命令
- master器执行完bgsave命令后,向所有slave发送快照文件,并记录发送快照期间的写命令
- 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的哨兵系统主要有以下三个功能:监控、提醒、自动故障转移
- 监控(Monitoring):哨兵(sentinel) 会不断地检查你的Master和Slave是否运作正常。
- 提醒(Notification):当被监控的某个 Redis出现问题时, 哨兵(sentinel) 可以通过 API 向管理员或者其他应用程序发送通知。
- 自动故障迁移(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。
哨兵模式的配置
-
复制三份redis的安装目录,分别命名为redis1、redis2、redis3,将redis.windows.conf配置文件中端口号分别修改为9000,9001,9002
-
启动三个redis服务器,通过redis2、redis3的客户端,分别执行命令:slaveof 127.0.0.1 9000【slaveof 主服务器IP 端口号】,将redis1做为主服务器,redis2、redis3作为从服务器
如果配置文件中配置:slaveof 主服务器IP 端口号,则不需要执行命令
-
配置哨兵:在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
-
启动哨兵:从redis-server.exe 所在的目录进入dos命令窗口,执行:
redis-server.exe sentinel.conf --sentinel
-
启动哨兵后发现:每个哨兵会监视主服务器、从服务器和其他哨兵的运行情况
-
关掉主服务器redis1,从服务器会变为主服务器,这个过程中会删除配置文件中的原配置:salveof 新master的IP地址 端口号,另一个从服务器也会更新配置文件中绑定主机IP地址
-
一段时间后再启动原主服务器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的集中过期,造成数据库瞬时压力大,甚至引起宕机
原因:设置了相同的缓存过期时间,重启后过期时间完全相同
-
解决办法:
- 设置不同的缓存过期时间,比如设置10分钟+1到5的随机分钟数
- 给每条缓存设置相应的缓存标记,缓存标记的过期时间比缓存数据的过期时间短,缓存标记失效就更新缓存
缓存穿透
- 缓存穿透: 用户查询的数据,数据库中没有,自然缓存中也没有。这样用户每次查询的时候,相当于进行了两次无效查询:在缓存中找不到,每次都要去数据库查询一次,然后返回空。
- 解决办法:
- 采用布隆过滤器,使用一个足够大的bitmap,用于存储可能访问的key,不存在的key直接被过滤
- 访问key未在数据库查询到,也将空值写进缓存,但设置较短过期时间,这样下次同样的请求就有值
缓存击穿
- 缓存击穿: 一个存在的key,在缓存过期的瞬间,同时有大量的请求,这些请求会直接访问数据库,造成数据库瞬间压力过大
- 解决办法: 热点数据永不过期或加锁
缓存雪崩和缓存击穿:缓存击穿并发查询同一条数据,缓存雪崩是不同的缓存都过期了,缓存中查询不到而都从查数据库
缓存预热
缓存预热: 系统上线后,将相关的缓存数据直接加载到缓存系统
解决办法: 定期更新缓存