redis
1.redis是什么
redis是一个由c语言开发的、高性能的、非关系型的键值对数据库,可用于缓存、计数器、消息中间件、分布式锁
2.为什么使用redis(优点)
- redis支持多种数据类型,list set hash zset string
- redis性能高,由于纯内存操作,读写速度都非常快,可以达到10w/s的频率
- 在高并发的情况下,如果所有请求都连接数据库,数据库可能出现连接异常,这时使用redis做缓存,可以减小数据库压力。
- 支持数据持久化,RDB和AOF
3.redis有什么缺点
- redis不具备自动容错和恢复的功能,如果主机从机都宕机,会导致前端部分读写请求失败,需要等待机器重启或者手动在前端更改主机ip地址
- 主机发生宕机,宕机前可能有部分数据未能同步到从机,切换ip后还会引起数据不一致问题,降低了系统可用性。
- redis很难支持在线扩容,在集群容量达到上限后在线扩容会变得很复杂,这就需要运维人员在系统上线的时候准备足够的空间,这对资源造成了很大浪费
- redis是单线程的,单台服务器无法充分利用多核服务器的CPU
4.redis为什么这么快
- 纯内存操作
- 单线程操作,避免了频繁的上下文切换
- 采用非阻塞I/O多路复用机制
5.redis过期策略
定时删除:每个key都需要创建一个定时器,过期了就会清理key,对内存很友好,但是会占用cpu资源去处理过期的key
惰性删除:用到key的时候再去看是否过期,过期就清除,可以节省cpu资源,但是对内存不友好,可能存在大量过期的key没清理
定期删除:redis每秒会进行10次过期扫描,过期扫描不会遍历过期字典中的所有key,而是采用了贪心算法:从过期字典中随机取20个key删除,如果过期的key比率超过1/4就重复前面操作,同时为了防止扫描过度循环导致线程卡死,算法还增加了扫描时间上线,默认是25ms
6.如何配置定期删除执行时间间隔
redis的定时任务默认是10次/s,即每隔100ms执行一次,可以在redis.conf中修改该值(hz)
redis.conf中hz的值默认为10,提高它的值会更快地处理同时到期的key,更精确地处理过期,但是也会占用更多cpu。hz范围是1~500,通常不建议超过100,只有当请求延时非常低的情况下,才可以设置为100
7.redis内存淘汰机制
redis默认使用惰性删除+定期删除,如果我们一直没有使用该key,惰性删除也没有抽取到这些值,这些key在内存中堆积的越来越多,导致redis内存块耗尽。那么就可以采用内存淘汰机制。
redis内存淘汰机制有8中:
默认:
1.noeviction:不进行淘汰数据,如果缓存被写满,再有请求进来,直接返回错误
在设置了过期的数据中淘汰:
2.volatile-random:当内容不足以容纳新写入数据时,在设置了过期的键值对中,随机移除某个键值对
3.volatile-ttl:当内容不足以容纳新写入数据时,在设置了过期的键值对中,移除即将过期的键值对
4.volatile-lru:当内容不足以容纳新写入数据时,在设置了过期的键值对中,移除最近最少使用的键值对
5.volatile-lfu:当内容不足以容纳新写入数据时,在设置了过期的键值对中,移除最不经常使用的键值对(历史访问评率)
在所有数据中淘汰:
6.allkeys-random:当内容不足以容纳新写入数据时,在所有键值对中,随机移除某个键值对
7.allkeys-lru:当内容不足以容纳新写入数据时,在所有键值对中,移除最近最少使用的键值对(这个是最常用的)
8.allkeys-lfu:当内容不足以容纳新写入数据时,在所有键值对中,移除最不经常使用的键值对。
※ 什么时候会执行内存淘汰策略,内存占用率过高的标准是什么?
redis.conf配置文件中的 maxmemory 属性限定了 Redis 最大内存使用量,当占用内存大于maxmemory的配置值时会执行内存淘汰策略。
※ 内存淘汰策略的配置
内存淘汰机制由redis.conf配置文件中的maxmemory-policy属性设置,没有配置时默认为no-eviction模式。
※ 淘汰策略的执行过程
> 客户端执行一条命令,导致Redis需要增加数据(比如set key value);
> Redis会检查内存使用情况,如果内存使用超过 maxmemory,就会按照配置的置换策略maxmemory-policy删除一些key;
> 再执行新的数据的set操作;
8.RDB持久化机制的优缺点
优点:
- 冷备份,RDB会生成多个数据文件,每个文件代表某个时刻的redis数据,这种多个数据文件的方式非常适合做冷备。可以将文件存储到云端、本地磁盘等。
- 读写性能高,RDB机制对redis对外提供读写服务时的影响很小,可以让redis保持高性能,因为redis主进程只需要fork一个子进程,让子进程执行IO操作来进行RDB的持久化即可
- 数据恢复快,相对于AOF来说,可以直接基于RDB数据文件来重启和恢复redis线程,更加快速
缺点:
- 丢失数据,如果redis故障时想要尽可能少的丢失数据,那RDB没有AOF好,一般来说,RDB每隔五分钟甚至更久生成一次快照,如果在这段时间内主机宕机,那么会丢失最近五分钟的数据。
- RDB影响性能,RDB每次在fork子进程执行快照文件生成的时候,如果数据文件特别大,可能会导致客户端提供的服务暂停数毫秒甚至数秒。
9.AOF持久化机制的优缺点
优点:
- 保护数据,AOF可以更好的保护数据不丢失,一般AOF隔1秒执行一次fsync操作,最多丢失1秒的数据。
- 写入性能高,AOF日志文件以append-only模式写入,所有没有任何磁盘寻址的开销
- 灾难性误删除紧急恢复,AOF日志文件通过非常可读的方式记录,这个特性非常适合做灾难性误删除的紧急恢复。如果不小心使用flushall命令删除了数据,只要后台rewrite还没发生,就可以拷贝AOF日志文件,将flushall命令删除,再将AOF日志文件放回去,就可以通过恢复机制,自动恢复所有数据。
缺点:
- 数据快照文件大,对于同一份数据数据来说,AOF日志文件通常比RDB快照文件大
- 写QPS低,AOF开启后,支持的写QPS会比RDB支持的写QPS低
- 数据恢复时比较慢,不方便冷备,AOF唯一比较大的缺点就是数据恢复时慢,还有需要手写脚本去做冷备,不方便
10.AOF和RDB该怎么选择
不要只使用RDB,会导致很多数据丢失
不要只是用AOF,恢复数据的时候比较慢,还有就是使用RDB简单粗暴生成快照更加健壮,避免AOF复杂的备份和恢复机制的bug
AOF和RDB结合使用,既保证数据不丢失,还可以使用RDB做不同程度的冷备,在AOF文件丢失或损坏的时候也可以使用RDB来进行快速的数据恢复
11.AOF rewrite
redis中的数据是有限的,很多数据可能自动过期,可能被用户清理,可能被redis的内存淘汰机制清理,但这些数据对应的写日志还保存在AOF日志文件中,日积月累,AOF日志文件会很大。所以AOF每隔一段时间会在后台做rewrite操作,根据当前redis内存中的数据构建AOF日志文件,覆盖原来的文件,这样可以确保AOF日志文件不会过大,保存和redis内存数据量一致
12.redis相比memcached有哪些优势
- memcached所有值都是简单的字符串,redis作为其替代者,支持的数据类型更多
- redis速度比memcached快很多
- redis支持数据持久化
13.redis适用场景
- 会话缓存:redis最常用的场景是会话缓存(session cached)
- 全页缓存
- 队列
- 排行榜/计数器
- 发布/订阅
14.redis5种数据类型的应用场景
- String:缓存、计数器、对象存储缓存、限速
- List:消息队列、文章列表
- Hash:用户信息缓存
- Set:标签
- Zset:排行榜、工资单