大家好,我是程序员面试刷题平台的鸭鸭!
最近裁员的新闻已经不少见了,但鸭鸭没想到,公司裁员的花样真是越来越多了。
最近流言中裁员比例超过 50% 的捷豹路虎,听说就专门为裁员开辟了一个快速离职专区:前一天发出会议邀约,次日沟通后,不管沟通结果,都会迅速收回所有办公权限,邮箱、门禁统统失效。
也就是说,不管签约与否,员工踏出会议室的时候,就在某种程度上自动离职了。
如果确认离职签约,当天也会办完所有交接手续,直接走人。可以说效率拉满。
这次捷豹路虎主要是联合市场营销与售后服务机构(IMSS)裁员,市场部高级经理以上的职位几乎都被裁撤,而留下的高级经理则接受了降级处理。离职人员发的是 “N+3” 大礼包。
当然啦,捷豹路虎官方回应是组织结构调整,并非大规模裁员。
大家怎么看路虎这次裁员操作呢?欢迎来评论区一起讨论💨
……
面试鸭已有 9000+高频面试题,大厂面试官精心原创题解,除了全套 Java 刷题路线,最近还新上线了前端、C++、GO 刷题路线,助力大家更好刷题,通关面试。
收到 offer 的第一步,从今天这道题开始吧!
Spring 中的 @Cacheable 和 @CacheEvict 注解的作用是什么?
回答重点
@Cacheable
和 @CacheEvict
是 Spring中用于缓存操作的两个重要注解,主要用于提高系统性能,通过减少对数据库等外部资源的频繁访问。
@Cacheable
:用于将方法的返回结果缓存起来。下次再调用相同参数的方法时,直接从缓存中获取结果,而不是重新执行该方法。@CacheEvict
:用于从缓存中移除一项或多项数据,通常在更新或删除操作时使用,确保缓存中的数据保持一致性。
扩展知识
@Cacheable
的使用与配置
@Cacheable
基本用法
@Cacheable
注解可以标记在方法上,表示方法的返回值会存储在缓存中,之后调用相同参数的方法时会直接返回缓存中的数据,而不会再次执行方法体的逻辑。
示例:
@Cacheable("users")
public User getUserById(Long id) {System.out.println("Fetching user from database...");return userRepository.findById(id);
}
在这个例子中,getUserById()
方法第一次调用时会查询数据库并将结果存入缓存中,后续使用相同 id
调用该方法时,数据将直接从缓存中返回,而不会再执行数据库查询。
缓存键与条件
自定义缓存键:默认情况下,Spring 会使用方法参数作为缓存的键。可以通过 key
属性自定义缓存键。
示例:
@Cacheable(value = "users", key = "#id")
public User getUserById(Long id) {return userRepository.findById(id);
}
在这个例子中,key = "#id"
表示使用 id
作为缓存键。
缓存条件:可以通过 condition
属性设置条件,只有满足条件时才会缓存结果。
示例:
@Cacheable(value = "users", condition = "#id > 10")
public User getUserById(Long id) {return userRepository.findById(id);
}
在这个例子中,只有当 id
大于 10 时,结果才会被缓存。
缓存的过期时间
Spring 自带的 @Cacheable
不支持直接设置缓存过期时间。缓存的存活时间取决于底层缓存机制(如 Redis、EhCache 等)。可以通过底层缓存提供的配置文件或 API 来设置缓存的过期策略。
Redis 配置示例:
spring.cache.redis.time-to-live=600000 // 设置 Redis 缓存 10 分钟后过期
@CacheEvict
的使用与配置
@CacheEvict
基本用法
@CacheEvict
用于在数据更新或删除操作时,从缓存中移除不再有效的数据,防止缓存中的数据与实际数据源不一致。
示例:
@CacheEvict(value = "users", key = "#id")
public void deleteUser(Long id) {userRepository.deleteById(id);
}
在这个例子中,当删除用户时,缓存中与该用户 id
对应的数据会被清除,确保缓存和数据库保持一致。
清除整个缓存
可以通过 allEntries = true
属性清除整个缓存。
示例:
@CacheEvict(value = "users", allEntries = true)
public void clearAllUsersCache() {// 业务逻辑
}
在这个例子中,users
缓存空间中的所有数据将被清除。
在操作完成后清除缓存
默认情况下,@CacheEvict
会在方法执行之前清除缓存。可以通过 beforeInvocation = false
来确保缓存清除操作在方法执行之后进行。
示例:
@CacheEvict(value = "users", key = "#id", beforeInvocation = false)
public void updateUser(Long id, User user) {userRepository.save(user);
}
在这个例子中,缓存清除操作会在 updateUser()
方法执行完成后进行。
@CachePut
注解
除了 @Cacheable
和 @CacheEvict
,Spring 还提供了 @CachePut
注解。与 @Cacheable
不同,@CachePut
每次调用方法都会执行,并将结果更新到缓存中,确保缓存中的数据与最新的数据一致。
示例:
@CachePut(value = "users", key = "#user.id")
public User updateUser(User user) {return userRepository.save(user);
}
在这个例子中,updateUser()
方法不仅会执行更新操作,还会将结果更新到缓存中,确保缓存中的数据是最新的。
缓存命名空间
value
属性用于指定缓存的命名空间(即缓存名称)。同一个命名空间中的缓存数据可以共用。
示例:
@Cacheable(value = "users")
public User getUserById(Long id) {// 缓存命名空间为 "users"
}
不同的缓存命名空间可以用于区分缓存数据,避免数据冲突。
最后
再来推荐下我们的面试刷题网站和小程序:面试鸭!
欢迎大家来找鸭鸭刷题👏