Redis面试题整理
1. 什么是Redis?
Redis是一个使用C语言编写的,开源的高性能非关系型的键值对的数据库。
它可以存储键和五种不同类型的值的映射。
- 键的类型只能是字符串
- 值支持字符串、列表、集合、散列表、有序集合五种数据类型
与传统数据库不同的是Redis的数据是存在内存中的,所以读写速度非常快,因此Redis被广泛应用于缓存方向,每秒可以处理超过十万次读写操作。另外,Redis也经常用来作分布式锁。除此之外,Redis还支持事务、持久化、LUA脚本、LRU驱动事件、多种集群方案。
2. Redis的优点?
- 读写性能优异,因为数据都存储在内存中。
- 支持数据持久化,支持AOF和RDB两种持久化方式。
- 支持事务,Redis的所有操作都是原子性的,同时Redis还支持对几个操作合并后的原子性执行。
- 数据结构丰富,除了支持字符串类型的value外还支持列表、集合、散列表、有序集合五种数据类型
- 支持主从复制,主机会自动将数据同步到从机,可以进行读写分离。
3. 说⼀下 Redis 和 Memcached 的区别和共同点 ?
现在公司⼀般都是⽤ Redis 来实现缓存,⽽且 Redis ⾃身也越来越强⼤了!不过,了解 Redis 和 Memcached 的区别和共同点,有助于我们在做相应的技术选型的时候,能够做到有理有据!
共同点 :
都是基于内存的数据库,⼀般都⽤来当做缓存使⽤。
都有过期策略。
两者的性能都⾮常⾼。
区别 :
- Redis ⽀持更丰富的数据类型(⽀持更复杂的应⽤场景)。Redis 不仅仅⽀持简单的 k/v 类
型的数据,同时还提供 list,set,zset,hash 等数据结构的存储。Memcached 只⽀持最简
单的 k/v 数据类型。
Redis ⽀持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进⾏使⽤,⽽ Memecache 把数据全部存在内存之中。
Redis 有灾难恢复机制。 因为可以把缓存中的数据持久化到磁盘上。
Redis 在服务器内存使⽤完之后,可以将不⽤的数据放到磁盘上。但是,Memcached在服务器内存使⽤完之后,就会直接报异常。
Memcached没有原⽣的集群模式,需要依靠客户端来实现往集群中分⽚写⼊数据;但是Redis⽬前是原⽣⽀持cluster模式的。
Memcached 是多线程,⾮阻塞 IO 复⽤的⽹络模型;Redis使⽤单线程的多路 IO 复⽤模 型。 (Redis 6.0 引⼊了多线程 IO )
Redis **⽀持发布订阅模型、Lua脚本、事务等功能,⽽ **Memcached不⽀持。并且,Redis⽀持更多的编程语⾔。
Memcached过期数据的删除策略只⽤了惰性删除,⽽Redis同时使⽤了惰性删除与定期删除。
4.缓存数据的处理流程是怎样的?
- 如果用户请求的数据在缓存中就直接返回。
- 缓存中不存在的话就看数据库中是否存在。
- 数据库中存在的话就更新缓存中的数据。
- 数据库中如果也不存在就返回空数据。
如图所示:
5.为什么要用Redis来做缓存?
从高性能和高并发两点来谈
高性能:
- 假如⽤户第⼀次访问数据库中的某些数据的话,这个过程是比较慢,毕竟是从硬盘中读取的。
- 但是,如果说⽤户访问的数据属于⾼频数据并且不会经常改变的话,那么我们就可以地将这些数据存在缓存中。
- 好处: 那就是保证⽤户下⼀次再访问这些数据的时候就可以直接从缓存中获取了。
操作缓存就是直接操作内存,所以速度相当快。
- 不过,要保持数据库和缓存中的数据的⼀致性。 如果数据库中的对应数据改变的之后,同步改变
缓存中相应的数据即可
高并发:
⼀般像 MySQL 这类的数据库的 QPS ⼤概都在 1w 左右(4 核 8g),但是使⽤ Redis 缓存之后
很容易达到 10w+,甚⾄最⾼能达到 30w+(就单机 redis 的情况,redis 集群的话会更⾼)。
QPS(Query Per Second):服务器每秒可以执⾏的查询次数。
所以,直接操作缓存能够承受的数据库请求数量是远远⼤于直接访问数据库的,所以我们可以考虑把数据库中的部分数据转移到缓存中去,这样⽤户的⼀部分请求会直接到缓存这⾥⽽不⽤经过数据库。进⽽,我们也就提⾼的系统整体的并发。
如图所示:
6.Redis的五种数据类型
- 普通字符串
- 哈希:适合存储对象
- 列表:按照插入元素的顺序,可以有重复元素
- 集合:无序,元素不可重复
- 有序集合:集合中每个元素都关联一个分数(score),根据分数进行升序排序,元素不可重复
7.Redis持久化机制
Redis的持久化机制有两种:快照(RDB)和追加文件(AOF)
RDB:
- 是通过创建快照的方式来获得当前Redis的数据在某个时间点上的副本,并将其保存在磁盘上。
AOF(主流):
- 是在每执行一条会更改Redis中数据的命令,就将该命令写入到磁盘中的AOF文件。
- 三种写回策略:
- always,同步回写,每当有数据发生修改就立即将日志写入磁盘,严重影响了Redis的性能。
- everysec,每个命令执行完,都只是先将日志写到AOF内存缓冲区,然后每隔一秒同步到磁盘。
- no:先将日志写入到AOF缓冲区,由操作系统决定何时写入到磁盘中。
Redis 支持同时开启开启两种持久化方式,可以综合使用 AOF 和 RDB 两种持久化机制,用AOF 来保证数据不丢失,作为数据恢复的第一选择; 用 RDB 来做不同程度的冷备,在 AOF 文件都丢失或损坏不可用的时候,还可以使用 RDB 来进行快速的数据恢复。
参考自:JavaGuide面试突击版