说说 Redisson 分布式锁的原理?回答重点Redisson 是基于 Redis 实现的分布式锁,实际上是使用 Redis 的原子操作来确保多线程、多进程或多节点系统中,只有一个线程能获得锁,避免并发操作导致的数据不一致问题。
1)锁的获取:
Redisson 使用 Lua 脚本,利用 exists + hexists + hincrby 命令来保证只有一个线程能成功设置键(表示获得锁...
为什么 Redis 设计为单线程?6.0 版本为何引入多线程?回答重点单线程设计原因:
Redis 的操作是基于内存的,其大多数操作的性能瓶颈主要不是 CPU 导致的
使用单线程模型,代码简便的同时也减少了线程上下文切换带来的性能开销
Redis 在单线程的情况下,使用 I/O 多路复用模型就可以提高 Redis 的 I/O 利用率了
6.0 版本引入多线程的原因:
...
Redis 为什么这么快?回答重点主要有 3 个方面的原因,分别是存储方式、优秀的线程模型以及 IO 模型、高效的数据结构。
Redis 将数据存储在内存中,提供快速的读写速度,相比于传统的磁盘数据库,内存访问速度快得多。
Redis 使用单线程事件驱动模型结合 I/O 多路复用,避免了多线程上下文切换和竞争条件,提高了并发处理效率。
Redis 提供多种高效的数据结构(如字符串...
Redis 中常见的数据类型有哪些?回答重点Redis 常见的数据结构主要有五种,这五种类型分别为:String(字符串)、List(列表)、Hash、Set(集合)、Zset(有序集合,也叫sorted set)。
String字符串是Redis中最基本的数据类型,可以存储任何类型的数据,包括文本、数字和二进制数据。它的最大长度为512MB。
使用场景:
缓存:存储临时数据,如用户会话、...
Redis 通常应用于哪些场景?回答重点1)缓存:
Redis 最常用的场景是作为缓存层,以减少数据库的负载,提高数据读取速度。例如,常用的用户会话数据和页面渲染结果可以存储在 Redis 中。
2)实时系统:
Redis 支持快速的数据写入和读取,非常适合用于实时分析,如网站点击统计、实时排行榜等。
3)消息队列:
利用 Redis 的 List 和 Pub/Sub 功...
Redis 中跳表的实现原理是什么?回答重点跳表主要是通过多层链表来实现,底层链表保存所有元素,而每一层链表都是下一层的子集。
插入时,首先从最高层开始查找插入位置,然后随机决定新节点的层数,最后在相应的层中插入节点并更新指针。
删除时,同样从最高层开始查找要删除的节点,并在各层中更新指针,以保持跳表的结构。
查找时,从最高层开始,逐层向下,直到找到目标元素或确定元素不存在。查找效率高,时...
Redis 的 hash 是什么?回答重点Redis 的 hash 是一种键值对集合,可以将多个字段和值存储在同一个键中,便于管理一些关联数据。特点如下:
适合存储小数据,使用哈希表实现,能够在内存中高效存储和操作。
支持快速的字段操作(如增、删、改、查),非常适合存储对象的属性。
扩展知识hash 常用命令HSET:设置 hash 中指定字段的值。
1HSET user:1001 na...
Redis 和 Memcached 有哪些区别?回答重点从数据结构上:
Redis:支持多种数据结构,如字符串、列表、集合、有序集合和哈希表,适合存储复杂数据类型。
Memcached:仅支持简单的键值对存储,数据结构较为单一。
从持久化上:
Redis:支持持久化功能,可以将数据保存在磁盘上,通过 RDB 和 AOF 两种方式实现数据的持久化。
Memcached:不支持数据持久化,...
Redis 数据过期后的删除策略是什么?回答重点Redis 数据过期主要有两种删除策略,分别为定期删除、惰性删除两种:
定期删除:Redis 每隔一定时间(默认是 100 毫秒)会随机检查一定数量的键,如果发现过期键,则将其删除。这种方式能够在后台持续清理过期数据,防止内存膨胀。
惰性删除:在每次访问键时,Redis 检查该键是否已过期,如果已过期,则将其删除。这种策略保证了在使用过程中只...
Redis 支持事务吗?如何实现?回答重点Redis 支持事务,但它的事务与 MySQL 中的事务有所不同。MySQL 中的事务主要支持 ACID 的特性,而 Redis 中的事务主要保证的是多个命令执行的原子性,即所有的命令在一个原子操作中执行,不会被打断。
还有一个很重要的点,就是 MySQL 中的事务是支持回滚的,而 Redis 中的事务是不支持回滚的。
扩展知识Redis 的事务Re...
Redis 中有哪些内存淘汰策略?回答重点Redis 的内存淘汰策略一共有 8 种。 8 种里面可以细分为两大类,即开启数据淘汰和不开启数据淘汰两大类,然后开启数据的那一类又可以进行细分,分为基于过期时间的淘汰策略以及全部数据的淘汰策略。
不淘汰数据(默认):
noeviction:当运行内存超过最大设置内存的时候,不会淘汰数据,而是直接返回报错禁止写入
设置了过期时间的数据淘汰:
v...
Redis 的 Pipeline 功能是什么?回答重点Redis 的 Pipeline 功能允许客户端在一次网络请求中批量发送多个命令,以减少网络延迟并提高性能。通过将多个命令打包发送,客户端可以在不等待每个命令响应的情况下继续发送其他命令,从而显著提高吞吐量。
好处:
节省了网络传输时间
减少了 Redis 服务端上下文切换带来的开销
扩展知识与事务的区别
Pipeline 并不保证命...
Redis 中的 Big Key 问题是什么?如何解决?回答重点Redis 中的 “big Key” 是指一个内存空间占用比较大的键(Key),它有什么危害呢?
内存分布不均。在集群模式下,不同 slot 分配到不同实例中,如果大 key 都映射到一个实例,则分布不均,查询效率也会受到影响。
由于 Redis 单线程执行命令,操作大 Key 时耗时较长,从而导致 Redis 出现其它命令阻...
Redis 的 Lua 脚本功能是什么?如何使用?回答重点Redis 的 Lua 脚本功能允许用户在 Redis 服务器端执行自定义的 Lua 脚本,以实现原子操作和复杂逻辑。其核心点包括:
原子性:Lua 脚本的所有命令在执行过程中是原子的,避免了并发修改带来的问题。
减少网络往返次数:通过在服务器端执行脚本,减少了客户端和服务器之间的网络往返次数,提高了性能。
复杂操作:可以在 Lua...
如何解决 Redis 中的热点 key 问题?回答重点Redis 中的热点 Key 问题是指某些 Key 被频繁访问,导致 Redis 的压力过大,进而影响整体性能甚至导致集群节点故障。
解决热点 Key 问题的主要方法包括:
热点 key 拆分:将热点数据分散到多个 Key 中,例如通过引入随机前缀,使不同用户请求分散到多个 Key,多个 key 分布在多实例中,避免集中访问单一 Key...
Redis 在生成 RDB 文件时如何处理请求?回答重点在 Redis 生成 RDB 文件时是异步的(使用 bgsave 命令),采用了 fork 子进程的方式来进行快照操作。生成 RDB 文件的过程由子进程执行,主进程继续处理客户端请求,所以可以保证 Redis 在生成快照的过程中依然对外提供服务,不会影响正常请求。
扩展知识生成 RDB 文件的时候,数据可以修改吗?当然可以。主进程会正常...
Redis 的持久化机制有哪些?回答重点Redis 提供两种主要的持久化机制:
RDB(Redis Database)快照:
RDB 是通过生成某一时刻的数据快照来实现持久化的,可以在特定时间间隔内保存数据的快照。
适合灾难恢复和备份,能生成紧凑的二进制文件,但可能会在崩溃时丢失最后一次快照之后的数据。
AOF(Append Only File)日志:
AOF 通过将每个写操作追加到日...
Redis 的哨兵机制是什么?回答重点Redis 的哨兵机制(Sentinel) 是一种高可用性解决方案,用于监控 Redis 主从集群,自动完成主从切换,以实现故障自动恢复和通知。
主要功能包括:
监控:哨兵不断监控 Redis 主节点和从节点的运行状态,定期发送 PING 请求检查节点是否正常。
自动故障转移:当主节点发生故障时,哨兵会选举一个从节点提升为新的主节点,并通知客户端更新主...
什么是配置中心?有哪些常见的配置中心?回答重点配置中心是一个用于配置集中化管理且支持动态更新、分发配置文件的工具(服务)。
它实现了配置的统一管理和动态刷新。当配置信息发生变化时,配置中心可以自动通知服务实例进行配置更新,这样就可以实例无需重启即可应用最新的配置,从一定程度上减少了系统访问的空窗期,非常灵活方便。
常见的配置中心:
Spring Cloud Config:Spring 提...
为什么需要服务注册发现?回答重点在分布式系统中,服务的数量通常会有很多,而且规模还不是一般地大,与此同时,服务的部署和变化也会很频繁。因此,如果要依赖人工去维护这些服务的关系,实现服务的管理以及调用就会变得非常困难。
服务注册与发现的作用就是为了解决这个问题,它通过注册中心来维护服务生产者以及服务消费者之间的关系。当服务启动之后,其就会向注册中心注册自己的信息,比如服务名称、服务端口、服务的...
你知道 Nacos 配置中心的实现原理吗?回答重点Nacos 配置中心的实现原理可以分为以下几个核心部分:
1)配置的存储:
企业内 Nacos 一般会使用数据库(如 MySQL)来存储配置数据。配置数据是以键值对的形式存储的,每个配置项对应一个数据 ID(Data ID),并且支持通过 Namespace(命名空间)、Group(组)来进行配置的隔离与分类。
配置存储层在 Nacos 集...
Spring Cloud 的优缺点有哪些?回答重点Spring Cloud 的优点是:集成度高、生态丰富、可扩展性强、功能全面。
Spring Cloud 的缺点是:学习曲线陡峭、有一定的性能开销、组件迭代快版本多、管理复杂。
扩展知识优点细化
集成度高:Spring Cloud 集成了多个成熟的微服务组件(如 Eureka、Zuul、Ribbon、Hystrix、Sleuth 等),与 S...
为什么需要在微服务中使用链路追踪?Spring Cloud 可以选择哪些微服务链路追踪方案?回答重点在微服务系统中,少则五六个服务,多则上百个服务,如果某个环节出现问题了,一次调用可能涉及到很多服务,如果服务之间的日志没有关联,那么排查起来非常困难,这个时候就需要链路追踪。
链路追踪可以可视化地追踪请求从一个微服务到另一个微服务的调用情况,从而帮助问题的排查。另外一个方面就是链路追踪还可以帮...
你是怎么理解微服务的?回答重点微服务(Micreoservies)是一种软件架构风格,它的主要目的就是将一个复杂应用程序拆分成多个职责单一的服务。
微服务的核心思想是“单一职责原则”,即每个服务专注于完成一个特定的任务,确保服务的高内聚性和低耦合性。
这会使得开发、部署、维护更加灵活和高效。针对不同服务可以进行不同技术或者语言选型,比如机器学习可以用 Python、一些嵌入式可以用 c++、...
Spring Cloud 由什么组成?回答重点Spring Cloud 主要由四部分组成:
一、服务注册与发现
1)Eureka 服务注册中心:Eureka 作为服务注册中心,允许服务实例动态加入或离开集群。其他服务可以通过Eureka服务器查询可用的服务实例,并进行负载均衡和故障转移。
2)Consul 服务发现与配置:提供服务发现和配置管理。
二、负载均衡
1)Ribbon 负载均衡器:...
单体应用、SOA、微服务架构有什么区别?回答重点单体应用、SOA 和微服务架构都是不同的架构风格,适用于不同的情况:
单体应用,其对外是一个整体,所有的功能都打包在同一个应用上。这种架构风格方便测试和容易部署,不过有一个点,当发生故障的时候可能会导致服务整体不可用,容易发生单点故障,所以灵活性和可维护性并不是很高。
SOA 是一种面向服务的架构风格,将系统划分为多个独立的服务。这些服务可以...
Spring Cloud Config 是什么?回答重点Spring Cloud Config 为分布式系统外部化配置提供了服务端以及客户端的支持,简单来说就是一个配置中心,其主要包括以下两个部分的内容:Config Server(Config 服务端)和 Config Client(Config 客户端)。
Config Server 是一个可横向扩展,并且集中式配置的服务器,主要用于集...
说一下你对于 DDD 的了解?回答重点DDD 全名叫做 Domain-driven design,即领域驱动设计,它是一种软件开发方法,其主要目的就是让开发人员和领域专家可以更好地协作,从而开发出满足业务需求的系统。
DDD 的关键概念包括领域模型和限界上下文。
领域模型描述了业务领域的规则和逻辑,让开发人员能够更好地理解业务需求。
限界上下文则定义了一个特定的业务领域内的模型和代码,使得...
Spring Boot 和 Spring Cloud 之间的区别?回答重点Spring Boot 是一个用于简化 Spring 应用程序开发的框架。它的主要目标是减少 Spring 应用程序的配置和开发复杂性。
而 Spring Cloud 是基于 Spring Boot 的,因此在使用 Spring Cloud 构建微服务时,必须先使用 Spring Boot 来开发基础的应用。Sprin...
什么情况下需要使用分布式事务,有哪些方案?回答重点一般在跨多个数据库、或者不同服务的情况下需要用到分布式事务,比如订单服务和库存服务,下订单和扣库存属于不同服务的方法,因此本地事务无法保证一致性,需要引入分布式服务。
分布式事务是由多个本地事务组成的,分布式事务跨越了多设备,之间又经历的复杂的网络,可想而知想要实现严格的事务道路阻且长。
常见的分布式事务方案:
2PC:基于两阶段提交(2P...