下面的面试题都来源于网上,当时记笔记的时候忘记记是哪些地址了,实在是不好意思,很感谢大家的分享
为什么要用redis(缓存)
1. 性能上:用户访问,如果直接从数据库中查数据,因为是从硬盘上读取,所以比较慢,如果将用户访问的数据放入缓存中,那么因为redis是属于内存数据库,直接操作内存,会快很多。
2. 并发上:缓存能够承受的请求数量远远大于传统数据库的,所以直接访问缓存中的数据可以有效的应对高并发的情形。
如何定期清除redis无用的缓存数据
1. 设置key的时候设为带过期时间的。
2. 第二种就是针对那种需要清除的key提前入库,然后通过定时任务清除。
单线程的redis为什么这么快
1. 纯内存操作。
2. 单线程操作,避免了频繁的山下文切换。
3. 采用了非阻塞I/O多路复用机制。
4. redis利用队列技术将并发访问变成串行访问,消除了传统数据库串行控制的开销。
redis为什么是单线程的
多线程处理会涉及到锁,而且多线程处理会涉及到线程切换而消耗CPU,因为CPU不是redis的瓶颈,redis的瓶颈最有可能是机器内存或者网络带宽。单线程无法发挥多核CPU性能,不过可以通过在单机开多个实例来解决。
对于大量的请求redis是怎样处理的
1. redis是一个单线程程序,也就是说同一时刻它只能处理一个客户端请求。
2. redis是通过IO多路复用来处理多个客户端请求的。
缓存的失效
应用程序先从缓存中取数据,没有取到,那么就去数据库中取,如果成功了,就将它再放入到缓存中。
缓存的命中
应用程序从缓存中取数据,取到后返回。
缓存的更新
先将数据存到库中,成功后,再让缓存失效。
什么是缓存穿透
正常的缓存系统都是先根据key去缓存中查找,查到了就返回,查不到就再去数据库中查,那么一些恶意的请求会故意查询大量的缓存中没有的key,这就会使得这些请求都去访问数据库,请求量越大,后端系统的压力就越大,最后就很有可能导致崩溃,这就叫做缓存穿透。
什么是缓存雪崩
当缓存服务器重启或大量缓存在一个时间段都同时失效,那么请求来的时候在缓存中查不到,会再去数据库中查,请求过多就可能会导致系统崩溃。
什么是缓存击穿
跟缓存雪崩类似,区别在于这里针对某一个key缓存,而雪崩是针对很多key
什么是缓存预热
缓存预热就是系统上线以后,提前将一些缓存数据加载到缓存系统,
redis的持久化方案RDB和AOF
RDB:快照形式,定期把内存中的当前时刻的数据保存到磁盘中,redis默认支持的持久化方案,速度快,但是服务器断电的时候有可能丢失部分数据。
AOF:就是将所有对redis操作的命令,crud的命令,保存到一个文件中,数据库恢复的时候,将所有的命令执行一遍就可以了,速度慢,不过数据比较完整,与RDB同时开启的时候,会使用AOF来恢复数据。建议两个同时使用。
redis和memcached的区别
1. redis支持更丰富的数据类型(String list set zset hash等)memecached只支持string(新版增加二进制类型)。
2. redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载使用,memecached不支持数据的持久化,是把数据都存在内存中。
3. redis单线程多路IO复用模型,memcached是多线程非阻塞IO复用的网络模型。
redis的优点
1. 读写快(因为数据是在内存中)
2. 数据类型丰富(string hash list set zset)
3. 支持事务,且操作都是原子性(原子性就是事务要么操作成功,要么失败回滚)
4. 可以用于缓存,消息队列,给key设置过期时间,到期自动删除
5. 支持数据持久化(AOF/RDB),防止数据丢失
6. 支持主从复制(master-slave)来实现数据备份,主机会自动将数据同步到从机。
redis的哨兵和复制
如果redis服务器突然挂掉了,那么如何保证备份的机器是原始服务器的完整备份呢,这个时候就需要哨兵和复制。哨兵可以管理多个redis服务器,它提供了监控,提醒以及自动的故障转移的功能,复制则是负责让一个redis服务器可以配备多个备份的服务器。redis也是利用这两个功能来保证redis的高可用性的。
redis支持的java客户端都有哪些,官方推荐哪个
Redisson,Jedis,lettuce等等,推荐redisson
redis有哪些适合的场景
1. session共享(单点登录)
2. 页面缓存
3. 队列
4. 排行榜/计数器
5. 发布/订阅
redis回收进程如何工作的,redis回收使用的什么算法
一个客户端运行了新的命令,添加了新的数据,redis检查内存使用的情况,如果大于maxmemory的限制,则根据设定好的策略进行回收。 LRU算法