首页 文章 精选 留言 我的

精选列表

搜索[Java],共10000篇文章
优秀的个人博客,低调大师

四面快手归来,分享Java真题及面经:策略模式+红黑树+Java锁+Redis+Kafka等分布式

看真题,了解差距,明确学习方向与目标。 看面经,提前准备,事半功倍。 一面(一个小时十分钟) 1.自我介绍 2.说说B+树和B树的区别,优缺点等? 3聊聊Spring,主要IOC等等 4多线程JUC包下的一些常见的类,比如CountDownLatch、Semaphore等 5.锁的概念,锁相关的关键字,volatile,synchronized。还比较了ReentrantLock与synchronized。 6.你了解哪些收集器?CMS和G1。详细谈谈G1的优点?什么时候进行Full GC呢? 7.Spring中涉及的一些设计模式 8.算法题:无序数列中求第k大的数(维护最小堆,然后依次遍历,与堆顶比较) 9.MySQL创建索引的原则,好处 怎么实现一个线程安全的计数器? 二面(四十多分钟) 设计模式:讲了单例,工厂方法,抽象工厂,策略模式,观察者模式,代理模式,还顺便讲了下spring动态代理的实现原理 线程池有哪些参数?分别有什么用?如果任务数超过的核心线程数,会发生什么?阻塞队列大小是多少? HashMap的底层数据结构 红黑树的具体结构及实现,红黑树与查找树的区别体现 接着聊ConcurrentHashMap,底层实现 HashMap哈希函数的认识,JDK1.8采用的hash函数 数据库索引,索引底层的实现,B+树的结构以及与普通查找树的优点 TCP三次握手四次挥手,四次挥手过程中服务端的哪几种状态,哪几种包 已经有一个查询好友的接口,设计一个微信朋友圈,可以实现发表朋友圈,添加评论,查看评论等功能。主要是设计数据结构 三面(50分钟:主要分布式这块) 你对快手的了解,和抖音的区别,聊项目项目中用到dubbo?那你说说什么是rpc框架?和http调用的区别是什么?Redis有哪些数据结构?持久化方案和区别?Redis哨兵、集群的设计原理和区别?Redis缓存和数据库会存在一致性问题吗?怎么解决Kafka怎么保证数据可靠性?讲了生产者端发送消息到broker持久化,分区和副本机制,消费者消费消息的at-least-once和at-most-once?怎么实现Exactly-Once? HR面: 常规的面试流程了,主要就是自己优缺点,以及未来的职业发展,以及薪资这块。 以上就是快手技术三面和HR面试题目,除此之外,以下阿里面试题目(送答案):1、阿里集团中间件4面:J.U.C并发框架+RocketMQ +MyCat+锁机制+架构2、阿里内推技术3面更多BAT技术架构+面试真经等干货,关注【mikechen优知】,回复【阿里】,立即拿走。 **通过了解大厂的技术面试题目与面试经验,查漏补缺,平时在工作中多学习、多实践,有目标去扩充自己的技术栈,深度掌握1-2门技术基础上去延伸广度,距离目标就不会太远了。关于快手面试题目,大家有什么想要探讨的内容,欢迎留言~**

优秀的个人博客,低调大师

Redis分布式锁,java程序员必备技能!

**戴嘎猴啊**,我是程序员卡卡罗特~ ![](https://developer.qcloudimg.com/http-save/yehe-4860696/bb3b0c2a5007489a3c1d7a316bbdeedb.png) 在分布式系统架构中,随着业务规模的扩大,我们不可避免地会遇到**多节点并发操作共享资源**的问题。 **在企业真实项目中,Redis分布式锁一般是怎么用的呢?** ## ✿1、为什么需要Redis分布式锁? 在**单体应用**中,我们可以用`synchronized`或`ReentrantLock`等本地锁解决并发问题。 但当系统拆分为微服务,部署在**多台服务器**后,本地锁就失去了作用——因为不同服务器上的进程无法感知彼此的锁状态。 Redis分布式锁正是为解决这类跨**服务器节点**并发问题而生: **•** 保证同一时间,只有一个服务器节点的一个进程能执行**一段代码** **•** 防止因并发操作导致的数据不一致(如重复数据、数据错乱) ## ✿2、举个栗子 > *用Redis分布式锁解决用户重复注册问题* 用户注册场景中,如果同一用户(比如同一手机号)在极短时间内提交多次注册请求,可能导致重复创建用户记录。 实际上,前端会做**防抖校验**,也是防止用户重复点击的,但是后端是必须要做的!因为万一前端没做呢?或者有人在你的网站通过代码调用注册接口呢🤔,emmm... ![](https://developer.qcloudimg.com/http-save/yehe-4860696/8e56e312d4c45a63b9562ed089b792c8.png) 我们可以用Redis分布式锁来避免这种情况。 ### 1. 分布式锁核心实现 > *这个类可以作为公共类使用* ``` @Component public class RedisDistributedLock { @Autowired private StringRedisTemplate redisTemplate; // 锁的过期时间(30秒),防止死锁 private static final long LOCK_EXPIRE_MILLIS = 30000; // 尝试获取锁的超时时间(5秒) private static final long ACQUIRE_TIMEOUT_MILLIS = 5000; /** * 尝试获取分布式锁 * @param lockKey 业务唯一标识(如手机号) * @return 锁的value(用于释放锁时的身份验证) */ public boolean lock(String lockKey) { // SET NX PX:不存在则设置,同时设置过期时间 return redisTemplate.opsForValue().setIfAbsent(lockKey, "1", Duration.ofMillis(LOCK_EXPIRE_MILLIS)); } /** * 释放分布式锁 * @param lockKey 业务唯一标识 */ public void unlock(String lockKey) { if (lockValue == null) { return; } redisTemplate.delete(lockKey); } } ``` ### 2. 在用户注册业务中使用 ``` @Service public class UserRegistrationService { @Autowired private RedisDistributedLock distributedLock; @Autowired private UserRepository userRepository; /** * 用户注册方法 * @param phone 手机号(作为唯一标识) * @param userInfo 用户信息 * @return 注册结果 */ public Result registerUser(String phone, UserInfo userInfo) { boolean locked = false; String lockKey = "USER_REGISTER_LOCK_" + phone; try { // 1、加锁失败,提前退出 if (!distributedLock.lock(lockKey)) { return Result.fail("操作过于频繁,请稍后再试"); } // 2. 检查用户是否已注册(临界区操作) User existingUser = userRepository.findByPhone(phone); if (existingUser != null) { return Result.fail("该手机号已注册"); } // 3. 执行注册逻辑 User newUser = new User(); newUser.setPhone(phone); newUser.setUsername(userInfo.getUsername()); // ... 设置其他用户信息 userRepository.save(newUser); return Result.success("注册成功", newUser.getId()); } finally { if (locked) { distributedLock.unlock(lockKey); } } } } ``` ### 重点 ``` return redisTemplate.opsForValue().setIfAbsent(lockKey, "1", Duration.ofMillis(LOCK_EXPIRE_MILLIS)); ``` 核心是这段代码:当redis存在`lockKey`的时候,返回的是false。不存在的时候,返回的是true。 底层是依赖redis的`set nx`明了,来保证加锁的原子性。 ## ✿总结 Redis分布式锁是解决分布式系统并发问题的重要工具,它通过Redis的单线程特性和原子命令,为跨节点的临界区操作提供了可靠的互斥保障。 在用户注册、商品秒杀、订单创建等核心场景中,合理使用分布式锁能有效避免数据不一致问题,保障系统的稳定性和数据准确性。 需要注意的是,Redis分布式锁在某些情况存在坑🤔,在实际使用中还需考虑Redis集群环境下的锁可靠性、锁过期时间设置等细节**,这些我们会在后续文章中深入探讨**。 ![](https://developer.qcloudimg.com/http-save/yehe-4860696/4799f845bf763daeb05349f62ec4c2a9.png) ---

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

用户登录
用户注册