redis为什么运行速度快:
redis五中数据类型
简述Redis的数据淘汰机制
redis中持久化方式
缓存穿透、缓存击穿、缓存雪崩区别和解决方案
1、redis是运行在内存当中
2、redis数据结构简单
3、采用了多路复用IO阻塞机制
4、单线程,不用处理上下文的切换。
String 整数,浮点数或者字符串Set 集合Zset 有序集合Hash 散列表List 列表
volatile-lru :从已设置过期时间的数据集中挑选最近最少使用的数据淘汰
volatile-ttl : 从已设置过期时间的数据集中挑选将要过期的数据淘汰
volatile-random :从已设置过期时间的数据集中任意选择数据淘汰
allkeys-lru:从所有数据集中挑选最近最少使用的数据淘汰
allkeys-random:从所有数据集中任意选择数据进行淘汰
noeviction:禁止驱逐数据
4.0后增加了
volatile-lfu:从已设置过期时间的数据集(server.db[i].expires)中挑选最不经常使用的数据淘汰allkeys-lfu:当内存不足以容纳新写入数据时,在键空间中,移除最不经常使用的keyRDB:是将Reids在内存中的数据库记录定时dump到磁盘上,实际操作过程是fork一个子进程,先将数据集写入临时文件,写入成功后,再替换之前的文件,用二进制压缩存储。
AOF(默认的同步是每秒中同步一次。):以日志的形式记录服务器所处理的每一个写、删除操作,查询操作不会记录,以文本的方式记录,可以打开文件看到详细的操作记录。
RDB的优势:
1、比较容易恢复
2、更容易迁移
3、由于是子进程操作,有利用性能最大化
4、在大数量时,RDB启动效率比AOF高。
缺点:在持久化时宕机,此时部分数据丢失。
AOF优势:
1、该机制可以带来更高的数据安全性,即数据持久性
2、写入采用的append模式,redis-check-aof保证数据的一致性。
3、
AOF的劣势:
1).对于相同数量的数据集而言,AOF文件通常要大于RDB文件,在恢复大数据时RDB更快。
2). 根据同步策略的不同,AOF在运行效率上往往会慢于RDB。总之,每秒同步策略的效率是比较高的,同步禁用策略的效率和RDB一样高效。
RDB的持久化配置:Redis会将数据集的快照dump到dump.rdb文件中
save 900 1 #在900秒(15分钟)之后,如果至少有1个key发生变化,则dump内存快照。
save 300 10 #在300秒(5分钟)之后,如果至少有10个key发生变化,则dump内存快照。
save 60 10000 #在60秒(1分钟)之后,如果至少有10000个key发生变化,则dump内存快照。
在Redis的配置文件中存在三种同步方式,它们分别是:
appendfsync always #每次有数据修改发生时都会写入AOF文件。
appendfsync everysec #每秒钟同步一次,该策略为AOF的缺省策略。
appendfsync no #从不同步。高效但是数据不会被持久化
缓存穿透: 缓存穿透是指缓存和数据库中都没有的数据,而用户不断发起请求,如发起为id为“-1”的数据或id为特别大不存在的数据。这时的用户很可能是攻击者,攻击会导致数据库压力过大。
解决方案:
1、增加参数校验
2、从缓存取不到的数据,在数据库中也没有取到,这时也可以将key-value对写为key-null,缓存有效时间可以设置短点,如30秒(设置太长会导致正常情况也没法使用)。这样可以防止攻击用户反复用同一个id暴力攻击
缓存击穿:缓存击穿是指缓存中没有但数据库中有的数据(一般是缓存时间到期),这时由于并发用户特别多,同时读缓存没读到数据,又同时去数据库去取数据,引起数据库压力瞬间增大,造成过大压力
解决方案:设置热点数据永远不过期。
缓存雪崩: 缓存雪崩是指缓存中数据大批量到过期时间,而查询数据量巨大,引起数据库压力过大甚至down机。和缓存击穿不同的是, 缓存击穿指并发查同一条数据,缓存雪崩是不同数据都过期了,很多数据都查不到从而查数据库。
解决方案:
缓存数据的过期时间设置随机,防止同一时间大量数据过期现象发生。如果缓存数据库是分布式部署,将热点数据均匀分布在不同搞得缓存数据库中。设置热点数据永远不过期。