1、Redis是什么?
Redis是一个开放源代码(BSD许可)的内存中数据结构存储,可用作数据库,缓存和消息代理,是一个基于键值对的NoSOI数据库。
2、Redis 的特性
◆ 速度快
◆ 基于键值对的数据结构服务器
◆ 丰富的功能、丰富的数据结构
◆ 简单稳定
◆ 客户端语言多
◆ 持久化
◆ 主从复制
◆ 高可用&分布式
3、Redis应用场景包括
◆ 缓存
◆ 排行榜
◆ 计数器
◆ 分布式会话
◆ 分布式锁
◆ 社交网络
◆ 最新列表
◆ 消息系统
4、Redis的有几种数据类型?
基础:字符串(String)、哈希(hash)、列表(list)、集合(set)、有序集合(zset)。
还有HyperLogLog、流、地理坐标等。
5、Redis有哪些高级功能?
消息队列、自动过期删除、事务、数据持久化、分布式锁、附近的人、慢査询分析、Sentinel和集群等多项功能。
6、启动 redis 的几种方式
(1) 默认配置:
/redis-server
(2) 运行启动: redis-server 加上要修改配置名和值(可以是多对),没有配置的将使用默认配置。
例如: redis-server-port 7359
(3) 指定配置文件启动:
/redis-server /opt/redis/redis.conf
7、Redis配置需要自己写?如何配置?
redis目录下有一个redis.conf的模板配置。所以只需要复制模板配置然后修改即可。
般来说大部分生产环境都会用指定配置文件的方式启动redis。
8、如何停止redis服务?
Kil -9 pid (粗暴,请不要使用,数据不仅不会持久化,还会造成缓存区等资源不能被优雅关闭)可以用redis 的shutdown 命令,可以选择是否在关闭前持久化数据。
redis-cli shutdown nosave
或者
redis-cli shutdown save
9、redis为什么快?
◆ redis使用了单线程架构和I/O多路复用模型模型。
◆ 纯内存访问。
◆ 由于是单线程避免了线程上下文切换带来的资源消耗。
10、redis 删除数据和查看当前键是否存在命令依次为:
◆ del key
◆ exists key
11、redis默认分多少16个数据库,字符串最大不能超过512M
12、redis持久化的几种方式
(1) RDB持久化
RDB(Redis DataBase)持久化是把当前进程数据生成快照保存到硬盘的过程。是以二进制的方式写入磁盘。
(2) AOF持久化
AOF(append only fle)为了解决rdb不能实时持久化的问题,aof来搞定。以独立的日志方式记录把每次命令记录到 aof 文件中。
(3) 混合持久化
一般来说我们的线上都会采取混合持久化。redis4.0 以后添加了新的混合持久化方式。
◆ 在快速加载的同时,避免了丢失过更多的数据。
◆ 由于混合了两种格式,所以可读性差。
◆ 兼容性,需要4.0以后才支持。
13、RDB的持久化的触发方式
(1) 手动触发:
save: 阻塞当前Redis服务器,直到RDB过程完成为止,如果数据比较大的话,会造成长时间的阻塞线上不建议。
bgsave:redis进程执行 fork操作创作子进程,持久化由子进程负责,完成后自动结束,阻塞只发生在fork 阶段,一半时间很短。
(2) 自动触发:
save xsecends n:
表示在x秒内,至少有n个键发生变化,就会触发RDB持久化。也就是说满足了条件就会触发持久化。flushall :
(3) 主从同步触发
14、RDB 持久化的优点和缺点
(1) 优点
◆ RDB 是一个紧凑的二进制文件,代表Redis在某个时间点上的数据快照。
◆ 适合于备份,全量复制的场景,对于灾难恢复非常有用。
◆ Redis加载RDB恢复数据的速度远快于AOF方式。
(2) 缺点
◆ RDB 没法做到实时的持久化。中途意外终止,会丢失一段时间内的数据。
◆ RDB 需要fork()创建子进程,属于重量级操作,可能导致Redis卡顿若干秒。
15、如何禁用持久化
一般来说生产环境不会用到,了解一下也有好处的。
config set save ""
15、设置 AOF 持久化
(1) 查询 AOF 是否开启
config get appendonly
(2) 开启 AOF
◆ 命令行方式:实时生效,但重启后失效。
config set appendonly
◆ 配置文件:需要重启生效,重启后依然生效。
appendonly yes
16、AOF 工作流程
(1) 所有写入命令追加到 aof buf 缓冲区。
(2) AOF缓冲区根据对应的策略向硬盘做同步操作。
(3) 随着AOF文件越来越大,需要定期对AOF文件进行重写,达到压缩的目的。
(4) 当 redis 服务器重启时,可以加载 AOF 文件进行数据恢复。
17、为什么 AOF 要先把命令追加到缓存区(aof buf)中
Redis使用单线程响应命令,如果每次写入文件命令都直接追加到硬盘,性能就会取决于硬盘的负载。
如果使用缓冲区,redis 提供多种缓冲区策略,在性能和安全性方面做出平衡。
18、AOF 持久化的触发方式
(1) 自动触发:满足设置的策略和满足重写触发。
策略,在配置文件中配置
◆ always:每条操作都写入到磁盘,最多丢失一条数据
◆ everysec:每秒写入一次磁盘,最多丢失一秒数据
◆ no:不设置写入磁盘规则,根据当前操作系统决定何时写入磁盘(Linux默认30秒)
Redis 的配置文件(redis.conf)中设置
# 开启每秒写入一次的持久化策略
appendfsync everysec
(2) 手动触发:执行命令
redis-cli BGREWRITEAOF
18、AOF 持久化的优缺点
(1) 优点
◆ AOF提供了3种保存策略:每秒保存、跟系统策略、每次操作保存。实时性比较高,一般来说会选择每秒保存,因此意外发生时顶多失去一秒的数据。
◆ 文件追加写形式,所以文件很少有损坏问题,如最后意外发生少写数据,可通过 redis-check-aof 工具修复。
◆ AOF 由于是文本形式,直接采用协议格式,避免二次处理开销,另外对于修改也比较灵活。
(2) 缺点
◆ AOF文件要比RDB文件大。
◆ AOF冷备没 RDB 迅速。
◆ 由于执行频率比较高,所以负载高时,性能没有RDB好。
19、Redis事务开始到结束的几个阶段
◆ 开启事务
◆ 命令入队
◆ 执行事务/放弃事务
20、Redis过期键删除策略?
◆ 定时删除:在设置的过期时间同时,创建一个定时器在键的过期时间来临时,立即执行队键的操作删陈。
◆ 惰性删除:放任过期键不管,但每次从键空间中获取键时,都检查取得的键是否过期,如果过期就删除,如果没有就返回该键。
◆ 定期删除:每隔一段时间执行一次删除过期键操作,并通过延迟删除操作执行的时长和频率来减少删除操作对 cpu 时间的影响。
21、如何获取当前最大内存?如何动态设置?
◆ 获取最大内存:
config get maxmemory
◆设置最大内存:
config set maxmemory 1GB
22、Redis内存溢出控制策略
当Redis所用内存达到maxmemory上限时,会出发相应的溢出策略。
(1) noeviction(默认策略):拒绝所有写入操作并返回客户端错误信息(error) OOM command not allowedwhen used memory,只响应读操作。
(2) volatile-lru:根据LRU算法删除设置了超时属性(expire)的键,直到腾出足够空间为止。如果没有可删除的键对象,回退到noeviction策略。
(3) allkeys-lru:根据LRU算法删除键,不管数据有没有设置超时属性, 直到腾出足够空间为止。
(4) allkeys-random:随机删除所有键,直到腾出足够空间为止。
(5) volatile-random:随机删除过期键,直到腾出足够空间为止。
(6) volatile-tth 根据键值对象的 ttl 属性,删除最近将要过期数据。如果没有,回退到 noeviction 策略。
23、什么是缓存穿透?处理问题?
缓存穿透:缓存层不命中,存储层不命中。
处理方式1:缓存空对象,不过此时会占用更多内存空间,所以根据大家业务特性去设置超时时间来控制内存占用的问题。
处理方式2:布隆过滤器(是1970年由布隆提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。当判断一定存在时,可能会误判,当判断不存在时,就一定不存在。)
24、什么是缓存预热?
就是系统上线后,提前将相关数据加载到缓存系统,避免用户先查库,然后在缓存。
25、什么是缓存雪崩?如何处理?
缓存雪崩:由于缓存层承载着大量请求,有效的保护了存储层,但如果存储层由于某些原因不能提供服务,存储层调用暴增,造成存储层岩机。
处理:
◆ 保证缓存层服务高可用性。
◆ 对缓存系统做实时监控,报警等。
◆ 依赖隔离组件为后端限流并降级。
◆ 做好持久化,以便数据的快速恢复。