Redis-面试题

Redis的目录

1 、什么是Redis?它的主要特点是什么?

​ 用C语言开发的高性能键值对数据库。提供多种键值数据类型适应不同的场景。

2、Redis的数据结构有哪些?请简要描述每个数据结构的特点和用途。

​ 1、字符串String:

​ 常用于缓存,计数器,分布式锁,适用于消息队列等场景。

​ 2、哈希Hash:

​ 键值对的集合,字段和值一一对应,适用于存储用户信息,配置等具有结构化数据的场景。

​ 3、列表List:

​ 有序集合,可以从两端进行插入和删除操作。支持重复元素。适用于消息列表,消息队列等场景。

​ 4、集合Set:

​ 唯一的字符串元素的无序集合,支持添加、删除、判断元素是否存在操作。常用于去重、共同好友等场景。

​ 5、有序集合Sorted Set:

​ 每个元素都关联一个分数(score),并按照分数进行排序。适用于排行榜。

3、Redis的优势是什么?它与其他数据库有何区别?

优势: 

		高性能,数据结构丰富,持久化支持,
		高可用性:支持主从复制和Sentine哨兵机制。
		分布式支持,事务支持,发布/订阅模式。

与其他数据库相比的区别:

​ 1、Redis数据存在内存,其他数据库通常存在磁盘上。

​ 2、数据结构支持:Redis支持多种,传统数据库通常使用表格。

​ 3、持久化支持

​ 4、只从复制和分布式支持。

​ 5、内存消耗:相比其他数据库对系统资源消耗更大。

4、Redis的缓存淘汰策略有哪些?请解释每个策略的工作原理。

1、LRU(Least Recently Used):最近最少使用

根据键的最近使用时间进行淘汰,优先删除最久未被使用的键。

原理:当内存不足时,Redis会检查键的最近使用时间,删除最近最少使用的,释放内存空间。

2、LFU(Least Frequently Used):最不经常使用

根据使用频率进行淘汰,优先删除使用频率最低的键。

3、FIFO(First In, First Out):先进先出

按照键的插入顺序进行淘汰,优先删除插入最早的键。

4、Random(随机)

随机选择一个键进行删除。

5、AllKeys-LRU:全局最近最少使用(GLRU)

	按照所有键的最近使用时间进行淘汰。

	关于LRU和GLRU有什么不同:LRU算法只考虑缓存项的访问顺序,而GLRU除了考虑访问顺序外还考虑缓存项的访问频率。

5、Redis如何处理并发访问和避免竞态条件?

​ 1、原子性操作:INCR、HSET、SADD,这几个命令可以在单个命令中完成,确保操作的原子性,避免竞态条件的发生。
INCR(key):将键的值递增1。如果键不存在,先将其设置为0,然后再执行递增操作。
DECR(key):将键的值减1 ,如果建不存在,先将其设置为0,然后再执行递减操作。
HSET KEY field “hello”: 设置字段filed的值为hello。如果键不存在,会创建一个新的hash,如果值存在,会更新。
SETNX(key,value): 键不存在时,为键设置值value。只有不存在时才设置,存在时,该指令不执行任何操作。

​ 2、单线程模式。

​ 3、事务模式。

​ 4、锁机制:redis提供分布式锁的支持,可以使用setnx命令实现简单的互斥锁。

​ 5、数据分片:将数据分散存储在多个节点,降低单个节点的并发访问压力。

6、Redis支持分布式吗?如果是,可以简要描述一下Redis的分布式架构和数据分片策略。

		分布式架构和数据分片可以用 Redis Cluster实现。
		Redis Cluster 主要特点:
					1、分布式:将数据分片存在多个节点。分别管理自己的部分数据。
					2、高可用;Redis Cluster支持主从复制,每个主节点都有1个或者多个从节点。
					3、自动分片和重新平衡:节点加入或离开集群,会自动重新分配和平衡。
					4、故障转移:主节点失效,会将一个从节点升级为主节点,实现故障转移。
		数据分片策略:
				数据分片使用哈希槽实现。尽可能均匀的将哈希槽分布在节点上,节点加入或离开集群,Redis Cluster会自动重新分配和平衡。

7、如何使用Java连接和操作Redis?是否有相关的Java客户端库可以使用?

Jedis和Lettuce

8、Redis的发布/订阅功能是什么?请描述一下其工作原理。

		发布/订阅模式,是一种消息传递模式,允许多个客户端通过订阅频道来接收消息,通过发布消息到频道,实现发送消息。
		发布/订阅模式中,消息是广播发送的,所有订阅了这个频道的订阅者都会收到相同的消息。每个订阅者都是独立的,之间没有通信。
		
	工作原理:发布之使用"PUBLISH"命令,将消息发送到指定频道。
			  订阅者使用"SUBSCRIBE" 命令,订阅一个或多个频道,用来接收消息。

9、Redis在高可用性方面有什么解决方案?请介绍一下Sentinel和Cluster模式。

	Sentinel:哨兵模式:
				使用一组Sentinel进程监视Redis主服务器和从服务器的状态,主服务器出现故障时会自动进行故障转移。
				适用于小规模的部署,配置部署简单。
	Cluster: 集群模式:
				将多个Redis节点组成一个集群,每个节点负责存储部分数据。
				适用于大规模的分布式环境,需要对数据进行分片,要求客户端通过集群代理进行访问。

10、Redis的事务支持是如何实现的?它的原子性保证是怎样的?

​ 事务的实现步骤:

​ 1、客户端发送multi命令开始事务。

​ 2、客户端依次发送要在事务中执行的命令,添加到队列中

​ 3、客户端发送exec命令,执行事务中的指令。

​ 4、按照命令被添加的顺序执行。

​ 4、将执行结果返回给客户端。

事务执行期间,如果发生错误,Redis不会中断事务,而是继续执行后续指令。且不会处理来自其他客户端的命令请求,这样就可以确保事务中命令按顺序执行,实现了原子性。

11、Redis在内存管理方面有哪些策略?如何配置Redis的内存限制和淘汰策略?

内存策略有以下几种:

	1、内存不足以写入数据时,写入操作报错。
	2、从所有键中,选择最近最少使用的键给淘汰掉。
	3、随机选择键进行淘汰。
	4、从设置了过期时间的键中,随机选择淘汰。
	5、从设置了过期时间的键中,选择最近最少使用的键淘汰。
	6、从设置了过期时间的键中,选择离过期时间最近的键淘汰。 

如何配置:

​ maxmemory 设置Redis实例中使用的最大内存容量。

​ maxmemory-policy:用于设置Redis的淘汰策略。

12、如何处理Redis的性能问题?有哪些方法可以提高Redis的性能?

​ 采用一下集中方法可以提高Redis性能:

​ 1、使用合适的数据结构。

​ 2、设置合理的内存策略。随机淘汰,距离过期时间最的键淘汰,最近最少使用的淘汰,等等。

​ 3、选择适当的持久化机制,RDB还是AOF。

​ 4、减少于Redis交互次数。可以使用事务或者批量操作减少网络开销。

​ 5、使用合理的过期策略。

​ 6、优化客户端访问,使用连接池或者异步I/O。

13、Redis的主从复制是什么?它的工作原理是怎样的?

​ 主从复制时将其中一个Redis实例中的数据复制到其他Redis实例中,主节点 -> 从节点。

工作原理:
		1、配置主节点。
		2、连接从节点。
		3、全量复制。将主节点的数据发送给从节点。
		4、增量复制。主节点将新的写入操作记录发送给从节点。
		5、异步复制。主节点不需要等待从节点确认,可以立即返回

14、Redis集群的主节点和从节点故障恢复是如何进行的?请解释一下。

​ 主节点发生故障:Redis集群会自动进行故障检测。会在从节点中自动选出一个当作新的主节点。

​ 从节点发生故障:主节点会将该节点标记为下线,常熟将起数据复制到其他从节点。

15、如何在Redis中处理大量的写入请求?有没有一些优化方法可以提高写入的吞吐量?

​ 1、使用批量操作。MSETMSETNXHSETHSETNX等,可以在一次请求中同时执行多个写入操作,从而提高吞吐量。

​ 2、使用管道。将多个写入命令发送到管道中,一次性获取相应结果。

​ 3、使用多线程。

​ 4、使用事务。

​ 5、集群和分片。

​ 6、使用Redis是持久化机制,减少磁盘写入操作。

16、Redis的数据安全性如何保证?有哪些方法可以进行数据备份和恢复?

​ 1、持久化机制:RDB和AOF

​ 2、主从复制。

​ 3、Redis集群,将数据分片存在多个节点。

​ 4、手动备份BGSAVE命令可以进行RDB快照的生成。把快照文件存储用作备份。

17、Redis应用场景

​ 1、缓存:将常用或者计算成本高的数据存在内存中,读取速度会很快。例如商务网站中的商品信息,会话数据等。

​ 2、分布式会话管理:将会话数据存储在Redis中,多个java应用实例可以共享会话状态。用户可以在集群中任意节点保持登录状态。

​ 3、队列和消息中间件。Redis支持发布/订阅模式和消息队列。可以作为消息中间件,处理异步任务、通知等。

​ 4、分布式锁:确保对某个资源的访问时互斥的,避免发生冲突。set if not exists命令实现分布式锁,确保只有一个线程或进程可以执行关键代码段。

​ 5、计数器和统计:统计网站的访问量,用户行为等。

​ 6、排行榜: 有序集合(Sorted Set)可以实现排行榜和排名功能。

​ 7、地理位置和地理编码。

18、Redis特性

​ 1、高性能:数据存储在内存中,使用单线程和异步IO提高性能。

​ 2、数据持久化:可以将内存中的数据保存到磁盘中,重启后也可以恢复。提供两种持久化方式:RDB和快照AOF。

​ 3、数据结构丰富。

​ 4、发布、订阅模式。

​ 5、Redis是单线程的。

​ 6、事务支持:Redis支持事务,可以将多个命令打包成一个事务执行。

​ 7、支持集群。添加节点或删除节点数据不会丢失。

19、Redis持久化

​ 1、RDB快照:

​ **定义:**将Redis数据在某个时间点上的状态完整地保存到磁盘上。

​ **用法:**可以手动执行,也可以配置定期自动执行。

​ 配置文件中有一行 ’ save 900 1 ',表示如果900秒内有1个键被修改,则执行RDB,

​ 手动执行可以使用save命令或者bgsave异步执行命令。

RDB优点:

​ 因为保存了数据的快照,所以数据恢复速度比较快。

​ 适用于大规模数据集恢复。

RDB缺点:

​ 可能会丢失最后一次持久化后的数据,因为是定期执行或手动执行。

​ 不适用于实时数据持久化。

2、AOF日志:

​ **定义:**以追加方式记录Redis服务器接收到的每个写操作的日志文件。

​ **用法:**AOF日志可以在Redis配置文件中启用。

​ 配置文件中有appendonly配置项,设置为yes则表示开启aof,默认为no。

AOF优点:

​ 数据更安全。

​ 适用于实时持久化:可以实时记录每个写操作。

AOF缺点:

​ 备份的文件比较大,占用更多的磁盘空间。

​ 恢复速度比较慢。

20、你在实际项目中如何使用Redis解决了哪些问题?

​ 1、缓存。

​ 2、分布式锁。

​ 3、计数器和统计信息。

​ 4、消息队列。

​ 5、会话管理。用户的登录装填,权限信息等。

21、看门狗机制是什么,什么场景使用?

	Redis的看门狗机制是一种用于监控和保护Redis主从节点的机制。
	它负责监测Redis主节点的状态,并在主节点出现故障时,自动将一个从节点升级为主节点,以保证系统的高可用性。

使用场景
1、高可用性要求较高的系统:当系统对服务的可用性要求很高时,使用Redis的看门狗机制可以快速地自动切换到可用的节点,减少系统的宕机时间。
2、系统维护和升级:在进行系统维护和升级时,可以通过看门狗机制,先将主节点切换到从节点,再进行维护和升级操作,以保证系统的连续性和可用性。

22、什么是分布式锁?

​ 分布式锁是一种用于在分布式系统中保证数据一致性和协调共享资源访问的机制。它通过在多个节点之间协调和同步对共享资源的访问,避免并发操作引起的数据不一致问题。保证数据的一致性和正确性。

23、为什么需要使用Redis分布式锁?

​ 在分布式环境中,多个节点同时对共享资源进行操作可能会引发并发冲突和数据不一致的问题。Redis分布式锁提供了一种可靠的方式来实现资源的互斥访问,保证在给定时间只有一个节点能够对资源进行操作。

24、Redis如何实现分布式锁?

​ 1、定义一个Redis的工具类。

public class RedisDistributedLock {
    private RedisTemplate<String, String> redisTemplate;
    private String lockKey;
    private String lockValue;
    private long lockTimeout;

   public RedisDistributedLock(RedisTemplate<String, String> redisTemplate, String lockKey, String lockValue, long lockTimeout) {
        this.redisTemplate = redisTemplate;
        this.lockKey = lockKey;
        this.lockValue = lockValue;
        this.lockTimeout = lockTimeout;
    }
    
   public boolean acquireLock() {
        Boolean success = redisTemplate.opsForValue().setIfAbsent(lockKey, lockValue, lockTimeout, TimeUnit.MILLISECONDS);
        return success != null && success;
    }
    
   public void releaseLock() {
        redisTemplate.delete(lockKey);
    }

}

业务代码中,调用工具类的acquireLock()方法,判断是否获取到锁,进行业务操作。

public class BusinessService {
    private RedisDistributedLock distributedLock;

    public BusinessService(RedisDistributedLock distributedLock) {
        this.distributedLock = distributedLock;
    }
    
    public void doBusinessOperation() {
        try {
            boolean acquired = distributedLock.acquireLock();
            if (acquired) {
                // 获取到锁,执行业务操作
                // ...
            } else {
                // 未获取到锁,处理竞争失败的情况
                // ...
            }
        } finally {
            distributedLock.releaseLock();
        }
    }
    }

25、如何处理分布式锁的超时问题?

​ 1、设置锁超时时间。

​ 2、expire命令重新设置锁的过期时间。

26、Redis分布式锁的缺点是什么?

​ 1、Redis分布式锁是通过在Redis里设置一个特定的键值对实现的,如果不同的节点使用相同的键名来获取锁,可能会导致锁的竞争问题或互相覆盖,造成数据不一致。

​ 2、有死锁风险。

​ 3、性能开销。

​ 4、无法跨多个业务操作事务。

27、如何处理分布式锁的异常情况?

​ 1、异常处理,抛出异常。

​ 2、设置锁的超时时间,超时后自动释放。

​ 3、优雅降级。

28、Redis分布式锁与数据库锁的比较有哪些区别?

​ 1、实现机制:Redis分布式锁是通过在Redis中设置一个特定的键值对来实现的,利用Redis的原子操作和过期时间机制来保证锁的唯一性和自动释放。数据库锁通常是基于数据库的锁机制实现的,如行级锁、表级锁或悲观锁。

​ 2、性能:Redis是一个基于内存的数据库,读写速度较快,数据库锁通常需要进行磁盘IO操作,性能相对较低。

​ 3、数据一致性:Redis不会引起数据不一致的问题。数据库有。

​ 4、分布式特征:Redis可以在不同节点之间实现锁的协作和竞争。数据库常为单个数据库实例。

29、Pipeline是什么,有什么好处,为什么要使用pipeline

Pipeline是一种用于批量执行多个命令的机制。它允许客户端将多个命令一次性发送给Redis服务器,
而无需等待每个命令的响应,从而实现了批量的、异步的命令执行。

PipeLine的好处:

  1. 减少网络开销:可以减少服务器等待的时间。
  2. 提高命令执行效率:无需等待每个命令的响应。
  3. 原子性操作:在同一个Pipeline中的命令会按顺序执行
  4. 事务支持:将多个命令打包为一个事务,并使用Pipeline发送给Redis服务器,可以保证这些命令要么全部执行,要么全部不执行,

30、Redis事务相关的命令有哪几个

	1、MULTI:标记事务块的开始,表示开始一个事务。
	2、EXEC:执行事务队列中的所有命令,并将结果返回。
	3、DISCARD:取消事务,清空事务队列中的所有命令。
	4、WATCH:监视一个或多个键,当任意被监视的键发生变化时,事务将被中断。
	5、UNWATCH:取消对所有键的监视。

缓存相关

缓存雪崩

Redis缓存雪崩是指再某个时间点,缓存中的大量数据同时失效或者过期,导致大量请求直接访问后端数据库,给数据库造成压力,导致数据库崩溃的现象。甚至可能导致性能急剧下降,用户无法正常访问或使用系统。

Java中处理缓存雪崩问题是常见的策略和手段有什么:

	1、缓存失效时间设置:确保缓存过期时间分散开,避免大量缓存同时失效。可以采用随机化方式设置过期时间。
	2、热点数据预加载:热点数据,在失效前主动加载。
	3、多级缓存:数据同时存在多个缓存层中。

什么是Redis热数据,冷数据?

热数据是指在应用中频繁访问和使用的数据。这些数据在内存中保持活跃的状态,可以快速访问、相应。
冷数据是很少被访问或使用的数据,访问频率较低,通常不会缓存到Redis中,而是直接从数据库中读取。

缓存穿透

缓存穿透是指在使用缓存系统时,恶意或者非法的请求导致缓存无法命中,每次请求都直接访问后端数据库,绕过缓存,造成性能损失。

如何防止缓存穿透:

1、布隆过滤器:在缓存层面上进行预判,判断请求的数据是否存在后台数据库,如果布隆过滤器认为数据不存在,可以避免访问后端数据库,减轻负载。
2、空值缓存:如果一个键的值是空的,可以将结果缓存为空值。对于同一个不存在的请求,可以直接从缓存中获取空值。
3、数据预加载:主要针对热数据,或常用数据,在系统启动时先加载到缓存中。
4、异常请求限制:过滤恶意请求,减小后端存储的压力。

什么是缓存预热?

系统启动或者高峰期之前,将热门或常用数据提前加载到缓存中,提高系统性能和响应时间。

为什么要缓存预热?

避免系统启动时冷启动问题,可以减少用户请求时的响应延迟,提高性能。

如何进行缓存预热?

1、系统启动时,通过后台任务或脚本加载热门数据到缓存中。
2、根据用户行为或统计数据,预测可能的热门数据,提前加载到缓存中。

缓存更新:

使用Redis作为缓存时,当底层数据发生改变时,如何更新缓存保证数据的一致性。

常见缓存更新策略:

1、主动更新:写操作完成时,调用Redis的API,将最新的数据存到Reids里。
2、被动更新:数据发生改变时,设置缓存的过期时间,使缓存自动失效。

缓存降级:

在高并发或者异常情况下,保证系统可用性,通过熔断机制暂时关闭对Redis缓存的访问,直接访问
底层数据源。

常见缓存降级策略:

1、熔断降级。
2、限流降级。
3、完全降级。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值