Redis 在当今的计算机行业,可以说是使用的最为广泛的内存数据库,几乎所有的后端技术面试都会涉及到 Redis 相关的知识,正所谓知己知彼,百战百胜。小白今天精心整理的超全的 Redis 面试题,希望可以帮助到在路上的你们~
Redis 是完全开源免费的,遵守 BSD 协议,是一个高性能的 key-value 数据库
是一个使用 C 语言开发的数据库,不过与传统数据库不同的是 Redis 的数据是存在内存中的,它是内存数据库,所以读写速度非常快,因此 Redis 被广泛应用于缓存方向
Redis 除了做缓存之外,也经常用来做分布式锁,甚至是消息队列
Redis 还支持事务 、持久化、Lua 脚本、多种集群方案等,可以使用众多复杂的业务场景
缓存使用的比较多的主要是 Memcached 和 Redis。不过现在使用 Memcached 做缓存的比较少
Memcached 是分布式缓存最开始兴起的时候比较常用的方案,后来随着 Redis 的发展,Redis 逐渐成为了人们的首选
分布式缓存主要解决的是单机缓存的容量受服务器限制并且无法保存通用信息的问题。因为本地缓存只在当前服务里有效,比如如果你部署了两个相同的服务,他们两者之间的缓存数据是无法共享的
都是基于内存的数据库,一般都用来当作缓存使用
都有过期策略
两者的性能都非常高
Redis 支持更丰富的数据类型,Memcached 只支持最简单的 k/v 数据类型,所有的值均是简单的字符串
Redis 支持数据的持久化,而 Memecache 把数据全部存在内存之中,重启之后数据丢失
Redis 有灾难恢复机制,因为可以把缓存中的数据持久化到磁盘上
Redis 在服务器内存使用完之后,可以将不用的数据放到磁盘上。但 Memcached 在服务器内存使用完之后,就会直接报异常
Memcached 没有原生的集群模式,需要依靠客户端来实现往集群中分片写入数据;但 Redis目前是原生支持 cluster 模式的
Memcached 是多线程,非阻塞 IO 复用的网络模型;Redis 使用单线程的多路 IO 复用模型
Redis 支持发布订阅模型、Lua 脚本、事务等功能,而 Memcached 不支持。并且,Redis 支持更多的编程语言
Memcached 过期数据的删除策略只用了惰性删除,而 Redis 同时使用了惰性删除与定期删除
Redis 支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及 zsetsorted set:有序集合)
实际中我们最为常用的还是 string 类型,不过还有几种高级数据类型我们也需要了解掌握:BloomFilter,RedisSearch,Redis-ML,还有更高级的数据类型,BloomFilter,RedisSearch,Redis-ML 如果使用过,那么在面试官眼里都是加分项!
缓存的简单处理流程如下:
如果用户请求的数据命中缓存,就直接返回
缓存中不存在的话,查看数据库中是否存在
如果数据库中存在,则更新缓存中的数据
如果数据库中不存在,则返回空数据
上图就是一个最为简易的缓存流程图,从图中我们也可以看出在使用缓存时的一系列注意事项,比如当缓存失效时,如何更好的保护数据库,如何保证数据库与缓存数据一致等
Redis 是单线程,利用队列技术将并发访问变为串行访问,消除了传统数据库串行控制的开销问题
512 M
将高频访问的数据放进缓存,保证高频操作可以快速响应,提高系统响应速度和用户体验
一般像 MySQL 这类数据库的 QPS 大概都在 1w 左右(4 核 8g) ,但是使用 Redis 缓存之后很容易达到 10w+,甚至最高能达到 30w+(redis 集群的话会更高)
QPS(Query Per Second):服务器每秒可以执行的查询次数
所以增加缓存可以大大提高系统的并发能力
缓存机制几乎在所有的大型网站都有使用,合理地使用缓存不仅可以加 快数据的访问速度,而且能够有效地降低后端数据源的压力。Redis提供了键值过期时间设置,并且也提供了灵活控制最大内存和内存溢出后的淘汰策略。可以这么说,一个合理的缓存设计能够很好的为一个网站的稳定保驾护航
排行榜系统几乎存在于所有的网站,例如按照热度排名的排行榜,按照 发布时间的排行榜,按照各种复杂维度计算出的排行榜,Redis提供了列表和有序集合数据结构,合理地使用这些数据结构可以很方便地构建各种排行榜系统
计数器在网站中的作用至关重要,例如视频网站有播放数、电商网站有 浏览数,为了保证数据的实时性,每一次播放和浏览都要做加1的操作,如果并发量很大对于传统关系型数据的性能是一种挑战。Redis天然支持计数功能而且计数的性能也非常好,可以说是计数器系统的重要选择
赞/踩、粉丝、共同好友/喜好、推送、下拉刷新等是社交网站的必备功能,由于社交网站访问量通常比较大,而且传统的关系型数据不太适合保存这种类型的数据,Redis 提供的数据结构可以相对比较容易地实现这些功能
消息队列系统可以说是一个大型网站的必备基础组件,因为其具有业务 解耦、非实时业务削峰等特性。Redis 提供了发布订阅功能和阻塞队列的功能,虽然和专业的消息队列比还不够足够强大,但是对于一般的消息队列功能基本可以满足
我们可以站在数据规模和数据冷热的角度来进行分析
站在数据规模的角度看,数据可以分为大规模数据和小规模数据,我们 知道 Redis 的数据是存放在内存中的,虽然现在内存已经足够便宜,但是如果数据量非常大,例如每天有几亿的用户行为数据,使用 Redis 来存储的话,基本上是个无底洞,经济成本相当的高
站在数据冷热的角度看,数据分为热数据和冷数据,热数据通