redis常见的面试题
redis的五种数据类型:
string
list
hash
set
sort set
redis的优势:
速度快
支持丰富的数据类型
支持事务 multi / exec(提交) / discard(回滚)
丰富的特性 可用于缓存 消息队列 按key设置过期时间 过期自动删除
redis的单点吞吐量:
QPS: 应用系统每秒最大能接受用户访问量 8W/s
TPS: 每秒最大能处理的请求数 10W/s
redis相比于memcache的优势:
1,memcached所有的值 均是简单的字符串 redis作为其替代者 支持更丰富的数据类型
2,redis比memcache更快
3,redis支持数据持久化
4,redis支持事务
5,redis支持数据的备份,支持master-slave模式 slaveof masterif masterport
redis的数据淘汰机制:
1,lru 已经设置了过期时间的数据 最近最少使用
2,ttr 已经设置了过期时间的数据 过期数据淘汰
3,random 已经设置了过期时间的数据 随机淘汰
4,allkeys - lru 从所有数据集中删除最近最少使用的数据
5,allkeys - random 从所有数据集中 随机删除数据
6,禁止淘汰机制
redis的持久化方式:
1,rdb:指在指定的时间间隔内 能对数据进行快照存储
save 60 10000 1s内修改1W次
save 300 1000 5分钟内修改1K次
save 900 1 15分钟内修改1次
2,AOF:记录每次对服务器的写操作 当服务器重启的时候 会将这些命令重新执行一次 重启的速度比rdb慢 但是数据的安全性比较高
如何选择redis的数据持久化的方式:
rdb:是默认的数据持久化方式 但是有可能造成数据的丢失 数据安全性不是很高 过程:将当前父进程的数据复制到子进程的内存中,然后由子进程将数据写入到临时文件 需要注意的是,每次快照的持久化都会将主进程中的数据全部复制一遍
AOF:以日志的形式,记录每一次的写操作 redis在重启的时候,会根据日志从头到尾将日志的内容重新执行一遍 以完成数据的恢复
触发方式:1,有写操作就写 2,每秒定时写(有可能会丢失数据)
因为AOF是采用追加的方式 记录日志的,所以相对于当前redis中的数据 会有大量冗余的记录 因此在新增的重写机制下 当日志文件达到一定程度的时候(64M) 就会fork一个新的进程来遍历redis中的数据 记录每一条对应的set语句 并将记录写到一个临时文件中 遍历完成后 会替换当前的日志文件
默认触发条件是:当aof的文件是上次重写后大小的一倍 且文件大于64M
Tip: 当两种方式同时开启的时候,redis优先选择AOF的方式恢复数据
redis集群之间是如何复制的:
语法:slaveof masterIp masterPort
redis如何做内存优化:
尽可能使用散列表(即hash类型) 如:当你的web系统中有一个用户对象 不要为这个用户的名称,姓氏,邮箱,密码等信息单独设置key,而是将这个用户的所有信息作为一个对象,然后存储成hash类型即可
redis回收进程:
一个客户端运行了新的命令 如添加了新的数据,redis会检查内存的使用情况,如果大于maxmemory的限制,则根据设定好的策略进行回收
redis的分布式锁:
先用setnx来争抢锁,抢到之后,在用expire给锁加一个过期时间,防止锁忘记被释放,set本身也有一个很复杂的命令来讲setnx和expire揉合到一起来使用的 这样可以防止在过期之前 进程被crash 然后锁未被释放的问题
如何在1亿个key里面找到指定前缀的key:
redis是单线程的 所以在线上是无法使用keys命令的 因为这会阻碍线程为其他需求提供服务,建议使用scan指令 scan指令可以无阻塞的提取值指定模式的key 但是会有一定的重复率 需要对结果做一次去重 缺点是:相对应keys命令会比较耗时
redis实现异步队列:
一般是使用list结构来存储队列 rpush / lpush:生产消息 lpop / rpop: 消费消息 没新消息的时候 搭配sleep函数
bplop:在没有消息的时候 会阻塞住 直到新的消息到来
如何实现延时消息队列:
使用sort set格式 来存储数据 把时间戳作为score
如果有大量的key需要设置在同一时间过期 一般需要注意什么:
有可能造成缓存雪崩 redis会出现短暂的卡顿 一般都是在过期时间后面加上一个随机值 来避免这种情况

浙公网安备 33010602011771号