缓存雪崩、击穿、穿透
雪崩:某一个热点key失效,同时有大量请求访问数据库(热点key不过期,定时从数据库更新到缓存)
击穿:大量的key同时过期,请求直接访问数据库(给key设置不同过期时间,避免大量key同时失效)
穿透:恶意攻击,查询数据库中不存在的数据,这样每次都会访问数据库(空key也存放到缓存中,对数据合法性进行校验)
redis数据类型
string:字符串,比如验证码
hash:存放对象,比如用户信息
list:消息队列
set:不重复集合,共同好友
zset:带score的不重复集合,用来做热点数据,排行榜
redis持久化机制
RDB(RedisDataBase)持久化是指在指定的时间间隔内将内存中的数据集快照写入磁盘二进制文件中,默认的文件名为dump.rdb
默认如下配置: save 900 1 :表示900秒钟内至少1个键被更改则进行快照。 save 300 10 :表示300秒内至少10个键被更改则进行快照。 save 60 10000 :表示60秒内至少10000个键被更改则进行快照。
rdb : 有save和bgsave两种方式,执行save期间不能执行其他操作,不可取;bgsave会fork出一个子进程,异步进行快照操作
rdb是全量备份,用新的rdb文件替换掉原来的rdb文件。
AOF(AppendOnlyFile)将每一个收到的写命令都通过write函数追加到文件中。默认情况下Redis没有开启AOF方式的持久化。
开启方法:
# 可以通过修改redis.conf配置文件中的appendonly参数开启
appendonly yes
# AOF文件的保存位置和RDB文件的位置相同,都是通过dir参数设置的。
dir ./
# 默认的文件名是appendonly.aof,可以通过appendfilename参数修改
appendfilename appendonly.aof
redis实现分布式锁
1.0版本: setnx命令:表示SET if Not eXists,即如果 key 不存在,才会设置它的值,否则什么也不做
获取锁: 第一次使用setnx(key,v1),此时对应的key不存在,返回true,获取到锁;之后使用setnx(key,v2),因为key已经存在,会 返回false,获取锁失败
释放锁: del(key)
问题: A宕机,key就永远无法释放,其他线程无法获取到锁
2.0版本: 设置一个过期时间
问题: A线程业务还没执行完key就过期了,执行完之后释放的是B线程的锁。锁过期和释放其他服务锁
3.0版本: 在锁将要过期的时候,如果服务还没有处理完业务,那么将这个锁再续一段时间;加锁设置value时加上一个标识(比如uuid),删除时验证标识,确保只删除自己线程的锁。