1、Redis 回收进程如何工作的?
一个客户端运行了新的命令,添加了新的数据。
Redi 检查内存使用情况,如果大于 maxmemory 的限制, 则根据设定好的策略进行回收。
不断地穿越内存限制的边界,通过不断达到边界然后不断地回收回到边界以下。如果一个命令的结果导致大量内存被使用(例如很大的集合的交集保存到一个新的键),不用多久内存限制就会被这个内存使用量超越。
2、都有哪些办法可以降低 Redis 的内存使用情况呢?
如果你使用的是 32 位的 Redis 实例,可以好好利用 Hash,list,sorted set,set等集合类型数据,
通常情况下很多小的 Key-Value 可以用更紧凑的方式存放到一起
3、Redis 的内存用完了会发生什么?
如果达到设置的上限,Redis 的写命令会返回错误信息(但是读命令还可以正常返回。)
或者你可以将 Redis 当缓存来使用配置淘汰机制,当 Redis 达到内存上限时会冲刷掉旧的内容。
4、一个 Redis 实例最多能存放多少的 keys?List、Set、Sorted Set 他们最多能存放多少元素
理论上 Redis 可以处理多达 232 的 keys,并且在实际中进行了测试,每个实例至少存放了 2 亿 5 千万的 keys。R
edis 的存储极限是系统中的可用内存值。
5、MySQL 里有 2000w 数据,redis 中只存 20w 的数据,如何保证 redis 中的数据都是热点数据?
Redis 内存数据集大小上升到一定大小的时候,就会施行数据淘汰策略。相关知识:Redis 提供 6 种数据淘汰策略:
volatile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰
volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰
volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰
allkeys-lru:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰
allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰
no-enviction(驱逐):禁止驱逐数据
6、Redis 最适合的场景?
1)、会话缓存(Session Cache)
Redis 的情景是会话缓存(session cache)。用 Redis 缓存会话比其他存储(如 Memcached)的优势在于:Redis 提供持久化。
2)、全页缓存(FPC)
Magento提供一个插件来使用 Redis 作为全页缓存后端
3)、队列
Reids 在内存存储引擎领域的一大优点是提供 list 和 set 操作,这使得 Redis能作为一个很好的消息队列平台来使用。
4),排行榜/计数器
Redis 在内存中对数字进行递增或递减的操作实现的非常好。
5)、发布/订阅
发布/订阅的使用场景确实非常多。我已看见人们在社交网络连接中使用,还可作为基于发布/订阅的脚本触发器,甚至用 Redis 的发布/订阅功能来建立聊天系统!
7、假如 Redis 里面有 1 亿个 key,其中有 10w 个 key 是以某个固定的已知的前缀开头的,如何它们全部找出来?
使用 keys 指令可以扫出指定模式的 key 列表。
redis 关键的一个特性:redis 的单线程的。
keys 指令会导致线程阻塞一段时间,线上服务会停顿,直到指令执行完毕,服务才能恢复。
这个时候可以使用 scan 指令,scan 指令可以无阻塞的提取出指定模式的 key 列表,但是会有一定的重复概率,在客户端做一次去重就可以了,但是整体所花费的时间会比直接用 keys 指令长。
8、如果有大量的 key 需要设置同一时间过期,一般需要注意什么?
如果大量的 key 过期时间设置的过于集中,到过期的那个时间点,redis 可能会出现短暂的卡顿现象。
一般需要在时间上加一个随机值,使得过期时间分散一些。
9、使用过 Redis 做异步队列么,你是怎么用的?
一般使用 list 结构作为队列,rpush 生产消息,lpop 消费消息。当 lpop 没有消息的时候,要适当 sleep 一会再重试。
redis 如何实现延时队列?
使用 sortedset,拿时间戳作为score,消息内容作为 key 调用 zadd 来生产消息,消费者用 zrangebyscore 指令获取 N 秒之前的数据轮询进行处理
10、使用过 Redis 分布式锁么,它是什么回事
先拿 setnx 来争抢锁,抢到之后,再用 expire 给锁加一个过期时间防止锁忘记了释放。
--如果在 setnx 之后执行 expire之前进程意外 crash 或者要重启维护了,那会怎么样?
这个锁就永远得不到释放了 但set 指令有非常复杂的参数,这个应该是可以同时把 setnx 和expire 合成一条指令来用
11、Memcached 是什么,有什么作用?
Memcached 是一个开源的,高性能的内存绶存软件,从名称上看 Mem 就是内存的意思,而 Cache 就是缓存的意思。Memcached 的作用:通过在事先规划好的内存空间中临时绶存数据库中的各类数据,以达到减少业务对数据库的直接高并发访问,从而达到提升数据库的访问性能,加速网站集群动态应用服务的能力。
12、memcached 服务在企业集群架构中有哪些应用场景?
1)作为数据库的前端缓存应用
a.完整缓存(易),静态缓存:
预热,(先把数据存缓存中),用户访问时可以只读取 memcached 缓存,不读取数据库了
先放在内存里,然后再对外提供数据访问
b.热点缓存
需要前端 web 程序配合,缓存经常被访问的数据。先预热数据库里的基础数据,然后在动态更新,选读取缓存,如果缓存里没有对应的数据,程序再去读取数据库,然后程序把读取的新数据放入缓存存储。
13、Memcached 服务分布式集群如何实现?
所有 Memcached 的数据总和才是数据库的数据。每台 Memcached 都是部分数据。(一台 memcached 的数据,就是一部分 mysql 数据库的数据)
程序端实现:程序加载所有 mc 的 ip 列表,通过对 key 做 hash (一致性哈希算法)
负载均衡器:通过对 key 做 hash (一致性哈希算法)一致哈希算法的目的是不但保证每个对象只请求一个对应的服务器,而且当节点宕机,缓存服务器的更新重新分配比例降到最低。
14、Memcached 服务特点及工作原理是什么?
a、完全基于内存缓存的
b、节点之间相互独立
c、C/S 模式架构,C 语言编写,总共 2000 行代码。
d、异步I/O 模型,使用 libevent 作为事件通知机制。
e、被缓存的数据以 key/value 键值对形式存在的。
f、全部数据存放于内存中,无持久性存储的设计,重启服务器,内存里的数据会丢失。
g、当内存中缓存的数据容量达到启动时设定的内存值时,就自动使用 LRU 算法删除过期的缓存数据。
h、可以对存储的数据设置过期时间,这样过期后的数据自动被清除,服务本身不会监控过期,而是在访问的时候查看 key 的时间戳,判断是否过期。
j、memcache 会对设定的内存进行分块,再把块分组,然后再提供服务
15、简述 Memcached 内存管理机制原理
现在 Memcached 利用 Slab Allocation 机制来分配和管理内存。
Slab Allocation 机制原理是按照预先规定的大小,将分配给 memcached 的内存分割成特定长度的内存块(chunk),再把尺寸相同的内存块,分成组(chunks slab class),这些内存块不会释放,可以重复利用。
16、memcached 是怎么工作的?
Memcached 的神奇来自两阶段哈希(two-stage hash)。
Memcached 就像一个巨大的、存储了很多<key,value>对的哈希表。通过 key,可以存储或查询任意的数据。
当查询数据时,客户端首先参考节点列表计算出 key 的哈希值(阶段一哈希),进而选中一个节点;客户端将请求发送给选中的节点,然后 memcached 节点通过一个内部的哈希算法(阶段二哈希),查找真正的数据(item)
17、memcached 最大的优势是什么
Memcached 最大的好处就是它带来了极佳的水平可扩展性
基于 memcached 的基本原则,可以相当轻松地构建出不同类型的缓存架构
18、memcached 和 MySQL 的 querycache 相比,有什么优缺点?
把 memcached 引入应用中,还是需要不少工作量
MySQL 有个使用方便的query cache,可以自动地缓存 SQL 查询的结果,被缓存的 SQL 查询可以被反复地快速执行。
19、memcached 如何实现冗余机制?
不实现! Memcached 应该是应用的缓存 层 。它的设计本身就不带有任何冗余机制。
20、memcached 如何处理容错的?
不处理! 在 memcached 节点失效的情况下,集群没有必要做任何容错处理。
如果发生了节点失效,应对的措施完全取决于用户。
忽略它,
把失效的节点从节点列表中移除
启动热备节点,接管失效节点所占用的 IP,可以防止哈希紊乱
21、如何将 memcached 中 item 批量导入导出?
Memcached 是一个非阻塞的服务器。任何可能导致memcached 暂停或瞬时拒绝服务的操作都应该值得深思熟虑
22、如果缓存数据在导出导入之间过期了,您又怎么处理这些数据呢?
如果您有大量的从不变化的数据,并且希望缓存很快热起来,批量导入缓存数据是很有帮助的。虽然这个场景并不典型,但却经常发生.
23、memcached 是如何做身份验证的?
没有身份认证机制!memcached 是运行在应用下层的软件(身份验证应该是应用上层的职责)。
24、memcached 的多线程是什么?如何使用它们?
线程就是定律(threads rule)
25、memcached 能接受的 key 的最大长度是多少?
key 的最大长度是 250 个字符
我们推荐使用使用较短的 key,因为可以节省内存和带宽。
26、memcached 对 item 的过期时间有什么限制
过期时间最大可以达到 30 天。
27、memcached 最大能存储多大的单个 item?
1MB
28、memcached 能够更有效地使用内存吗?
Memcache 客户端仅根据哈希算法来决定将某个 key 存储在哪个节点上,而不考虑节点的内存大小。因此,您可以在不同的节点上使用大小不等的缓存。
29、什么是二进制协议
二进制协议尝试为端提供一个更有效的、可靠的协议,减少客户端/服务器端因处理协议而产生的 CPU 时间。
30、memcached 是原子的吗?
所有的被发送到 memcached 的单个命令是完全原子的
31、如何实现集群中的 session 共享存储
为了解决集群环境下的 seesion 共享问题,共有 4 种解决方案:
粘性 session
粘性 session 是指Ngnix 每次都将同一用户的所有请求转发至同一台服务器上,即将用户与服务器绑定。
服务器 session 复制
即每次 session 发生变化时,创建或者修改,就广播给所有集群中的服务器,使所有的服务器上的 session 相同。
session 共享
缓存 session,使用 redis, memcached。
session 持久化
将 session 存储至数据库中,像操作数据一样才做 session
32、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 倍。
33、什么是 Spring Framework?
Spring 是一个开源应用框架,旨在降低应用程序开发的复杂度。
它是轻量级、松散耦合的。它具有分层体系结构,允许用户选择组件,同时还为 J2EE 应用程序开发提供了一个有凝聚力的框架。它可以集成其他框架,如 Structs、Hibernate、EJB 等,所以又称为框架的框架。
34、列举 Spring Framework 的优点。
由于 Spring Frameworks 的分层架构,用户可以自由选择自己需要的组件。Spring Framework 支持 POJO(Plain Old Java Object) 编程,从而具备持续集成和可测试性。由于依赖注入和控制反转,JDBC 得以简化。它是开源免费的。
35、Spring Framework 有哪些不同的功能?
IOC - 控制反转--将应用业务逻辑和系统服务分离,以实现高内聚
AOP - 面向切面编程
容器 - Spring 负责创建和管理对象(Bean)的生命周期和配置
MVC - 对 web 应用提供了高度可配置性,其他框架的集成也十分方便
事务管理 - 提供了用于事务管理的通用抽象层
JDBC 异常 - Spring的 JDBC 抽象层提供了一个异常层次结构,简化了错误处理策略。
数据访问/集成 – 该层提供与数据库交互的支持。它包含以下模块:
JDBC ( Java DataBase Connectivity)
ORM (Object Relational Mapping)
OXM (Object XML Mappers)
JMS ( Java Messaging Service)
Web – 该层提供了创建 Web 应用程序的支持。它包含以下模块:
Web
Web – Servlet Web – Socket Web – Portlet
Messaging – 该模块为 STOMP 提供支持。
36、什么是 Spring 配置文件?
Spring 配置文件是 XML 文件。该文件主要包含类信息。它描述了这些类是如何配置以及相互引入的。
但是,XML 配置文件冗长且更加干净。如果没有正确规划和编写,那么在大项目中管理变得非常困难
37、Spring 应用程序有哪些不同组件?
Spring 应用一般有以下组件:
接口 - 定义功能。
Bean 类 - 它包含属性,setter 和 getter 方法,函数等。
Spring 面向切面编程(AOP) - 提供面向切面编程的功能。
Bean 配置文件 - 包含类的信息以及如何配置它们。
用户程序 - 它使用接口。
38、使用 Spring 有哪些方式?
作为一个成熟的 Spring Web 应用程序。
作为第三方 Web 框架,使用 Spring Frameworks 中间层。
用于远程使用。
作为企业级 Java Bean,它可以包装现有的 POJO(Plain Old Java Objects)。
39、什么是 Spring IOC 容器?
Spring 框架的核心是 Spring 容器。
容器创建对象,将它们装配在一起,配置它们并管理它们的完整生命周期。
pring 容器使用依赖注入来管理组成应用程序的组件。
容器通过读取提供的配置元数据来接收对象进行实例化,配置和组装的指令。该元数据可以通过 XML,Java 注解或 Java 代码提供。
40、什么是依赖注入?
在依赖注入中,您不必创建对象,但必须描述如何创建它们。您不是直接在代码中将组件和服务连接在一起,而是描述配置文件中哪些组件需要哪些服务。由 IoC容器将它们装配在一起。
41、可以通过多少种方式完成依赖注入?
通常依赖注入可以通过三种方式:
构造函数注入
setter 注入
接口注入
在 Spring Framework 中,仅使用构造函数和 setter 注入。
42、spring 中有多少种 IOC 容器?
BeanFactory - BeanFactory 就像一个包含 bean 集合的工厂类。它会在客户端要求时实例化 bean
ApplicationContext - ApplicationContext 接口扩展了 BeanFactory 接口。它在 BeanFactory 基础上提供了一些额外的功能。
43、区分 BeanFactory 和 ApplicationContext
BeanFactory:使用懒加载; 使用语法显式提供资源对象;不支持国际化; 不支持基于依赖的注解
ApplicationContext:使用即时加载; 自己创建和管理资源对象;支持国际化;支持基于依赖的注解
44、列举 IoC 的一些好处。
最小化应用程序中的代码量。
使您的应用程序易于测试,因为它不需要单元测试用例中的任何单例或 JNDI 查找机制。
以最小的影响和最少的侵入机制促进松耦合。
支持即时的实例化和延迟加载服务。
45、什么是 spring bean?
是构成用户应用程序主干的对象。
Bean 由 Spring IoC 容器管理。
由 Spring IoC 容器实例化,配置,装配和管理。
Bean 是基于用户提供给容器的配置元数据创建。
46、spring 提供了哪些配置方式?
基于 xml 配置
bean 所需的依赖项和服务在 XML 格式的配置文件中指定。这些配置文件通常包含许多 bean 定义和特定于应用程序的配置选项。通常以 bean 标签开头
基于注解配置
可以通过在相关的类,方法或字段声明上使用注解,将 bean 配置为组件类本身,而不是使用 XML 来描述 bean 装配。
默认情况下,Spring 容器中未打开注解装配。因此,您需要在使用它之前在 Spring 配置文件中启用它
基于 Java API 配置
Spring 的 Java 配置是通过使用 @Bean 和 @Configuration 来实现。
1)、 @Bean 注解扮演与 元素相同的角色。
2)、 @Configuration 类允许通过简单地调用同一个类中的其他 @Bean 方法来定义 bean 间依赖关系。
47、spring 支持集中 bean scope?
Spring bean 支持 5 种 scope:
Singleton - 每个 Spring IoC 容器仅有一个单实例
Prototype - 每次请求都会产生一个新的实例
Request - 每一次 HTTP 请求都会产生一个新的实例,并且该 bean 仅在当前 HTTP 请求内有效
Session - 每一次 HTTP 请求都会产生一个新的 bean,同时该 bean 仅在当前 HTTP session 内有效
Global-session - 类似于标准的 HTTP Session 作用域,仅仅在基于portlet 的 web 应用中才有意义
48、spring bean 容器的生命周期是什么样的?
1)、Spring 容器根据配置中的 bean 定义中实例化 bean。
2)、Spring 使用依赖注入填充所有属性,如 bean 中所定义的配置。
3)、如果 bean 实现BeanNameAware 接口,则工厂通过传递 bean 的 ID 来调用setBeanName()。
4)、如果 bean 实现 BeanFactoryAware 接口,工厂通过传递自身的实例来调用 setBeanFactory()。
5)、如果存在与 bean 关联的任何BeanPostProcessors,则调用 preProcessBeforeInitialization() 方法。
6)、如果为 bean 指定了 init 方法( 的 init-method 属性),那么将调用它。
7)、最后,如果存在与 bean 关联的任何 BeanPostProcessors,则将调用 postProcessAfterInitialization() 方法。
8)、如果 bean 实现
DisposableBean 接口,当 spring 容器关闭时,会调用 destory()。
9)、如果为bean 指定了 destroy 方法( 的 destroy-method 属性),那么将调用它。
49、什么是 spring 的内部 bean?
只有将 bean 用作另一个 bean 的属性时,才能将 bean 声明为内部 bean。为了定义 bean,Spring 的基于 XML 的配置元数据在 或 中提供了 元素的使用。
50、什么是 spring 装配
当 bean 在 Spring 容器中组合在一起时,它被称为装配或 bean 装配。Spring容器需要知道需要什么 bean 以及容器应该如何使用依赖注入来将 bean 绑定在一起,同时装配 bean。