Java架构师之面试题

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: Memcached

21、memcached 是原子的吗?

所有的被发送到 memcached 的单个命令是完全原子的。如果您针对同一份数据 同时发送了一个 set 命令和一个 get 命令,它们不会影响对方。它们将被串行化、 先后执行。即使在多线程模式,所有的命令都是原子的,除非程序有 bug) 。

命令序列不是原子的。如果您通过 get 命令获取了一个 item,修改了它,然后想 把它 set 回 memcached,我们不保证这个 item 没有被其他进程(process,未 必是操作系统中的进程)操作过。在并发的情况下,您也可能覆写了一个被其他 进程 set 的 item。

memcached 1.2.5 以及更高版本,提供了 gets 和 cas 命令,它们可以解决上面 的问题。如果您使用 gets 命令查询某个 key 的 item,memcached 会给您返回 该 item 当前值的唯一标识。如果您覆写了这个 item 并想把它写回到 memcached 中,您可以通过 cas 命令把那个唯一标识一起发送给 memcached。如果该 item 存放在 memcached 中的唯一标识与您提供的一致,您的写操作将会成功。如果 另一个进程在这期间也修改了这个 item,那么该 item 存放在 memcached 中的 唯一标识将会改变,您的写操作就会失败

22、如何实现集群中的 session 共享存储?

Session 是运行在一台服务器上的,所有的访问都会到达我们的唯一服务器上,这 样我们可以根据客户端传来的 sessionID,来获取 session,或在对应 Session 不 存在的情况下(session 生命周期到了/用户第一次登录),创建一个新的 Session; 但是,如果我们在集群环境下,假设我们有两台服务器 A,B,用户的请求会由 Nginx 服务器进行转发(别的方案也是同理),用户登录时,Nginx 将请求转发 至服务器 A 上,A 创建了新的 session,并将 SessionID 返回给客户端,用户在浏 览其他页面时,客户端验证登录状态,Nginx 将请求转发至服务器 B,由于 B 上 并没有对应客户端发来 sessionId 的 session,所以会重新创建一个新的 session, 并且再将这个新的 sessionID 返回给客户端,这样,我们可以想象一下,用户每 一次操作都有 1/2 的概率进行再次的登录,这样不仅对用户体验特别差,还会让 服务器上的 session 激增,加大服务器的运行压力

为了解决集群环境下的 seesion 共享问题,共有 4 种解决方案:

1.粘性 session 粘性 session 是指 Ngnix 每次都将同一用户的所有请求转发至同一台服务器上, 即将用户与服务器绑定。

2.服务器 session 复制 即每次 session 发生变化时,创建或者修改,就广播给所有集群中的服务器,使 所有的服务器上的 session 相同。

3.session 共享 缓存 session,使用 redis, memcached。

4.session 持久化 将 session 存储至数据库中,像操作数据一样才做 session。

23、memcached 与 redis 的区别?

1、Redis 不仅仅支持简单的 k/v 类型的数据,同时还提供 list,set,zset,hash 等数据结构的存储。而 memcache 只支持简单数据类型,需要客户端自己处理复 杂对象

2、Redis 支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可 以再次加载进行使用(PS:持久化在 rdb、aof)。

3、由于 Memcache 没有持久化机制,因此宕机所有缓存数据失效。Redis 配置 为持久化,宕机重启后,将自动加载宕机时刻的数据到缓存系统中。具有更好的 灾备机制。

4、Memcache 可以使用 Magent 在客户端进行一致性 hash 做分布式。Redis 支 持在服务器端做分布式(PS:Twemproxy/Codis/Redis-cluster 多种分布式实现方 式)

5、Memcached 的简单限制就是键(key)和 Value 的限制。最大键长为 250 个 字符。可以接受的储存数据不能超过 1MB(可修改配置文件变大),因为这是典 型 slab 的最大值,不适合虚拟机使用。而 Redis 的 Key 长度支持到 512k。

6、Redis 使用的是单线程模型,保证了数据按顺序提交。Memcache 需要使用 cas 保证数据一致性。CAS(Check and Set)是一个确保并发一致性的机制,属 于“乐观锁”范畴;原理很简单:拿版本号,操作,对比版本号,如果一致就操 作,不一致就放弃任何操作 cpu 利用。由于 Redis 只使用单核,而 Memcached 可以使用多核,所以平均每 一个核上 Redis 在存储小数据时比 Memcached 性能更 高。而在 100k 以上的数 据中,Memcached 性能要高于 Redis 。

7、memcache 内存管理:使用 Slab Allocation。原理相当简单,预先分配一系 列大小固定的组,然后根据数据大小选择最合适的块存储。避免了内存碎片。(缺 点:不能变长,浪费了一定空间)memcached 默认情况下下一个 slab 的最大值 为前一个的 1.25 倍。

8、redis 内存管理: Redis 通过定义一个数组来记录所有的内存分配情况, Redis 采用的是包装的 malloc/free,相较于 Memcached 的内存 管理方法来说,要简 单很多。由于 malloc 首先以链表的方式搜索已管理的内存中可用的空间分配,导 致内存碎片比较多

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
1月前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
71 2
|
21天前
|
Java 程序员
Java社招面试题:& 和 && 的区别,HR的套路险些让我翻车!
小米,29岁程序员,分享了一次面试经历,详细解析了Java中&和&&的区别及应用场景,展示了扎实的基础知识和良好的应变能力,最终成功获得Offer。
53 14
|
1月前
|
存储 缓存 算法
面试官:单核 CPU 支持 Java 多线程吗?为什么?被问懵了!
本文介绍了多线程环境下的几个关键概念,包括时间片、超线程、上下文切换及其影响因素,以及线程调度的两种方式——抢占式调度和协同式调度。文章还讨论了减少上下文切换次数以提高多线程程序效率的方法,如无锁并发编程、使用CAS算法等,并提出了合理的线程数量配置策略,以平衡CPU利用率和线程切换开销。
面试官:单核 CPU 支持 Java 多线程吗?为什么?被问懵了!
|
1月前
|
存储 算法 Java
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
本文详解自旋锁的概念、优缺点、使用场景及Java实现。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
|
26天前
|
Java 编译器 程序员
Java面试高频题:用最优解法算出2乘以8!
本文探讨了面试中一个看似简单的数学问题——如何高效计算2×8。从直接使用乘法、位运算优化、编译器优化、加法实现到大整数场景下的处理,全面解析了不同方法的原理和适用场景,帮助读者深入理解计算效率优化的重要性。
30 6
|
1月前
|
存储 缓存 Java
大厂面试必看!Java基本数据类型和包装类的那些坑
本文介绍了Java中的基本数据类型和包装类,包括整数类型、浮点数类型、字符类型和布尔类型。详细讲解了每种类型的特性和应用场景,并探讨了包装类的引入原因、装箱与拆箱机制以及缓存机制。最后总结了面试中常见的相关考点,帮助读者更好地理解和应对面试中的问题。
58 4
|
1月前
|
存储 Java 程序员
Java基础的灵魂——Object类方法详解(社招面试不踩坑)
本文介绍了Java中`Object`类的几个重要方法,包括`toString`、`equals`、`hashCode`、`finalize`、`clone`、`getClass`、`notify`和`wait`。这些方法是面试中的常考点,掌握它们有助于理解Java对象的行为和实现多线程编程。作者通过具体示例和应用场景,详细解析了每个方法的作用和重写技巧,帮助读者更好地应对面试和技术开发。
114 4
|
4月前
|
存储 Java
【IO面试题 四】、介绍一下Java的序列化与反序列化
Java的序列化与反序列化允许对象通过实现Serializable接口转换成字节序列并存储或传输,之后可以通过ObjectInputStream和ObjectOutputStream的方法将这些字节序列恢复成对象。
|
2月前
|
算法 Java 数据中心
探讨面试常见问题雪花算法、时钟回拨问题,java中优雅的实现方式
【10月更文挑战第2天】在大数据量系统中,分布式ID生成是一个关键问题。为了保证在分布式环境下生成的ID唯一、有序且高效,业界提出了多种解决方案,其中雪花算法(Snowflake Algorithm)是一种广泛应用的分布式ID生成算法。本文将详细介绍雪花算法的原理、实现及其处理时钟回拨问题的方法,并提供Java代码示例。
92 2
|
2月前
|
JSON 安全 前端开发
第二次面试总结 - 宏汉科技 - Java后端开发
本文是作者对宏汉科技Java后端开发岗位的第二次面试总结,面试结果不理想,主要原因是Java基础知识掌握不牢固,文章详细列出了面试中被问到的技术问题及答案,包括字符串相关函数、抽象类与接口的区别、Java创建线程池的方式、回调函数、函数式接口、反射以及Java中的集合等。
37 0
下一篇
DataWorks