关于java:助力金九银十2021最新34道Redis高频面试题

58次阅读

共计 11494 个字符,预计需要花费 29 分钟才能阅读完成。

文章内容过长,倡议先珍藏 缓缓看!

Redis(Remote Dictionary Server) 是一个应用 C 语言编写的,开源的(BSD 许可)高性能非关系型(NoSQL)的键值对数据库。

Redis 能够存储键和五种不同类型的值之间的映射。键的类型只能为字符串,只反对五种数据类型:字符串、列表、汇合、散列表、有序汇合。

与传统数据库不同的是 Redis 的数据是存在内存中的,所以读写速度十分快,因而 redis 被广泛应用于缓存方向,每秒能够解决超过 10 万次读写操作,是已知性能最快的 Key-Value DB。另外,Redis 也常常用来做分布式锁。除此之外,Redis 反对事务、长久化、LUA 脚本、LRU 驱动事件、多种集群计划。

明天就来讲讲 Redis 面试题,为金九银十冲刺做筹备,对于 Redis 所有的面试题我都曾经整顿成了 pdf 文档,须要的自行支付!Redis 学习笔记 + 面试真题

一、概述

1、Redis 有哪些优缺点

长处

  • 读写性能优异,Redis 能读的速度是 110000 次 /s,写的速度是 81000 次 /s。
  • 反对数据长久化,反对 AOF 和 RDB 两种长久化形式。
  • 反对事务,Redis 的所有操作都是原子性的,同时 Redis 还反对对几个操作合并后的原子性执行。
  • 数据结构丰盛,除了反对 string 类型的 value 外还反对 hash、set、zset、list 等数据结构。
  • 反对主从复制,主机会主动将数据同步到从机,能够进行读写拆散。

毛病

  • 数据库容量受到物理内存的限度,不能用作海量数据的高性能读写,因而 Redis 适宜的场景次要局限在较小数据量的高性能操作和运算上。
  • Redis 不具备主动容错和复原性能,主机从机的宕机都会导致前端局部读写申请失败,须要期待机器重启或者手动切换前端的 IP 能力复原。
  • 主机宕机,宕机前有局部数据未能及时同步到从机,切换 IP 后还会引入数据不统一的问题,升高了零碎的可用性。

Redis 较难反对在线扩容,在集群容量达到下限时在线扩容会变得很简单。为防止这一问题,运维人员在零碎上线时必须确保有足够的空间,这对资源造成了很大的节约。

2、为什么要用 Redis / 为什么要用缓存

次要从“高性能”和“高并发”这两点来对待这个问题。

高性能:

如果用户第一次拜访数据库中的某些数据。这个过程会比较慢,因为是从硬盘上读取的。将该用户拜访的数据存在数缓存中,这样下一次再拜访这些数据的时候就能够间接从缓存中获取了。操作缓存就是间接操作内存,所以速度相当快。如果数据库中的对应数据扭转的之后,同步扭转缓存中相应的数据即可!

高并发:

间接操作缓存可能接受的申请是远远大于间接拜访数据库的,所以咱们能够思考把数据库中的局部数据转移到缓存中去,这样用户的一部分申请会间接到缓存这里而不必通过数据库。

3、为什么要用 Redis 而不必 map/guava 做缓存?

缓存分为本地缓存和分布式缓存。以 Java 为例,应用自带的 map 或者 guava 实现的是本地缓存,最次要的特点是轻量以及疾速,生命周期随着 jvm 的销毁而完结,并且在多实例的状况下,每个实例都须要各自保留一份缓存,缓存不具备一致性。

应用 redis 或 memcached 之类的称为分布式缓存,在多实例的状况下,各实例共用一份缓存数据,缓存具备一致性。毛病是须要放弃 redis 或 memcached 服务的高可用,整个程序架构上较为简单。

4、Redis 为什么这么快

1)齐全基于内存,绝大部分申请是纯正的内存操作,十分疾速。数据存在内存中,相似于 HashMap,HashMap 的劣势就是查找和操作的工夫复杂度都是 O(1);

2)数据结构简略,对数据操作也简略,Redis 中的数据结构是专门进行设计的;

3)采纳单线程,防止了不必要的上下文切换和竞争条件,也不存在多过程或者多线程导致的切换而耗费 CPU,不必去思考各种锁的问题,不存在加锁开释锁操作,没有因为可能呈现死锁而导致的性能耗费;

4)应用多路 I/O 复用模型,非阻塞 IO;

5 应用底层模型不同,它们之间底层实现形式以及与客户端之间通信的利用协定不一样,Redis 间接本人构建了 VM 机制,因为个别的零碎调用零碎函数的话,会节约肯定的工夫去挪动和申请;

二、数据类型

5、Redis 有哪些数据类型

Redis 次要有 5 种数据类型,包含 String,List,Set,Zset,Hash,满足大部分的应用要求

6、Redis 的利用场景

总结一

计数器:能够对 String 进行自增自减运算,从而实现计数器性能。Redis 这种内存型数据库的读写性能十分高,很适宜存储频繁读写的计数量。

缓存:将热点数据放到内存中,设置内存的最大使用量以及淘汰策略来保障缓存的命中率。

会话缓存:能够应用 Redis 来对立存储多台应用服务器的会话信息。当应用服务器不再存储用户的会话信息,也就不再具备状态,一个用户能够申请任意一个应用服务器,从而更容易实现高可用性以及可伸缩性。

全页缓存(FPC):除根本的会话 token 之外,Redis 还提供很简便的 FPC 平台。以 Magento 为例,Magento 提供一个插件来应用 Redis 作为全页缓存后端。此外,对 WordPress 的用户来说,Pantheon 有一个十分好的插件 wp-redis,这个插件能帮忙你以最快速度加载你曾浏览过的页面。

查找表:例如 DNS 记录就很适宜应用 Redis 进行存储。查找表和缓存相似,也是利用了 Redis 疾速的查找个性。然而查找表的内容不能生效,而缓存的内容能够生效,因为缓存不作为牢靠的数据起源。

音讯队列(公布 / 订阅性能):List 是一个双向链表,能够通过 lpush 和 rpop 写入和读取音讯。不过最好应用 Kafka、RabbitMQ 等消息中间件。

分布式锁实现:在分布式场景下,无奈应用单机环境下的锁来对多个节点上的过程进行同步。能够应用 Redis 自带的 SETNX 命令实现分布式锁,除此之外,还能够应用官网提供的 RedLock 分布式锁实现。

其它:Set 能够实现交加、并集等操作,从而实现独特好友等性能。ZSet 能够实现有序性操作,从而实现排行榜等性能。

总结二

Redis 相比其余缓存,有一个十分大的劣势,就是反对多种数据类型。

数据类型阐明 string 字符串,最简略的 k - v 存储 hashhash 格局,value 为 field 和 value,适宜 ID-Detail 这样的场景。list 简略的 list,程序列表,反对首位或者开端插入数据 set 无序 list,查找速度快,适宜交加、并集、差集解决 sorted set 有序的 set

其实,通过下面的数据类型的个性,根本就能想到适合的利用场景了。

string——适宜最简略的 k - v 存储,相似于 memcached 的存储构造,短信验证码,配置信息等,就用这种类型来存储。

hash——个别 key 为 ID 或者惟一标示,value 对应的就是详情了。如商品详情,个人信息详情,新闻详情等。

list——因为 list 是有序的,比拟适宜存储一些有序且数据绝对固定的数据。如省市区表、字典表等。因为 list 是有序的,适宜依据写入的工夫来排序,如:最新的*,音讯队列等。

set——能够简略的了解为 ID-List 的模式,如微博中一个人有哪些好友,set 最牛的中央在于,能够对两个 set 提供交加、并集、差集操作。例如:查找两个人独特的好友等。

Sorted Set——是 set 的加强版本,减少了一个 score 参数,主动会依据 score 的值进行排序。比拟适宜相似于 top 10 等不依据插入的工夫来排序的数据。

如上所述,尽管 Redis 不像关系数据库那么简单的数据结构,然而,也能适宜很多场景,比个别的缓存数据构造要多。理解每种数据结构适宜的业务场景,不仅有利于晋升开发效率,也能无效利用 Redis 的性能。

三、长久化

7、什么是 Redis 长久化?

长久化就是把内存的数据写到磁盘中去,避免服务宕机了内存数据失落。

8、Redis 的长久化机制是什么?各自的优缺点?

Redis 提供两种长久化机制 RDB(默认)和 AOF 机制:

RDB:是 Redis DataBase 缩写快照

RDB 是 Redis 默认的长久化形式。依照肯定的工夫将内存的数据以快照的模式保留到硬盘中,对应产生的数据文件为 dump.rdb。通过配置文件中的 save 参数来定义快照的周期。

长处:

1、只有一个文件 dump.rdb,不便长久化。

2、容灾性好,一个文件能够保留到平安的磁盘。

3、性能最大化,fork 子过程来实现写操作,让主过程持续解决命令,所以是 IO 最大化。应用独自子过程来进行长久化,主过程不会进行任何 IO 操作,保障了 redis 的高性能

4. 绝对于数据集大时,比 AOF 的启动效率更高。

毛病:

1、数据安全性低。RDB 是距离一段时间进行长久化,如果长久化之间 redis 产生故障,会产生数据失落。所以这种形式更适宜数据要求不谨严的时候)

2、AOF(Append-only file)长久化形式:是指所有的命令行记录以 redis 命令请 求协定的格局齐全长久化存储)保留为 aof 文件。

AOF:长久化

AOF 长久化(即 Append Only File 长久化),则是将 Redis 执行的每次写命令记录到独自的日志文件中,当重启 Redis 会从新将长久化的日志中文件复原数据。

当两种形式同时开启时,数据恢复 Redis 会优先选择 AOF 复原。

长处:

1、数据安全,aof 长久化能够配置 appendfsync 属性,有 always,每进行一次 命令操作就记录到 aof 文件中一次。

2、通过 append 模式写文件,即便中途服务器宕机,能够通过 redis-check-aof 工具解决数据一致性问题。

3、AOF 机制的 rewrite 模式。AOF 文件没被 rewrite 之前(文件过大时会对命令 进行合并重写),能够删除其中的某些命令(比方误操作的 flushall))

毛病:

1、AOF 文件比 RDB 文件大,且复原速度慢。

2、数据集大的时候,比 rdb 启动效率低。

优缺点是什么?

  • AOF 文件比 RDB 更新频率高,优先应用 AOF 还原数据。
  • AOF 比 RDB 更平安也更大
  • RDB 性能比 AOF 好
  • 如果两个都配了优先加载 AOF

9、如何抉择适合的长久化形式

一般来说,如果想达到足以媲美 PostgreSQL 的数据安全性,你应该同时应用两种长久化性能。在这种状况下,当 Redis 重启的时候会优先载入 AOF 文件来复原原始的数据,因为在通常状况下 AOF 文件保留的数据集要比 RDB 文件保留的数据集要残缺。

如果你十分关怀你的数据,但依然能够接受数分钟以内的数据失落,那么你能够只应用 RDB 长久化。

有很多用户都只应用 AOF 长久化,但并不举荐这种形式,因为定时生成 RDB 快照(snapshot)十分便于进行数据库备份,并且 RDB 复原数据集的速度也要比 AOF 复原的速度要快,除此之外,应用 RDB 还能够防止 AOF 程序的 bug。

如果你只心愿你的数据在服务器运行的时候存在,你也能够不应用任何长久化形式。

10、Redis 长久化数据和缓存怎么做扩容?

如果 Redis 被当做缓存应用,应用一致性哈希实现动静扩容缩容。

如果 Redis 被当做一个长久化存储应用,必须应用固定的 keys-to-nodes 映射关系,节点的数量一旦确定不能变动。否则的话(即 Redis 节点须要动态变化的状况),必须应用能够在运行时进行数据再均衡的一套零碎,而以后只有 Redis 集群能够做到这样。

四、内存相干

14、MySQL 里有 2000w 数据,redis 中只存 20w 的数据,如何保障 redis 中的数据都是热点数据?

redis 内存数据集大小回升到肯定大小的时候,就会实施数据淘汰策略。

15、Redis 的内存淘汰策略有哪些?

Redis 的内存淘汰策略是指在 Redis 的用于缓存的内存不足时,怎么解决须要新写入且须要申请额定空间的数据。

全局的键空间选择性移除

noeviction:当内存不足以包容新写入数据时,新写入操作会报错。

allkeys-lru:当内存不足以包容新写入数据时,在键空间中,移除最近起码应用的 key。(这个是最罕用的)

allkeys-random:当内存不足以包容新写入数据时,在键空间中,随机移除某个 key。

设置过期工夫的键空间选择性移除

volatile-lru:当内存不足以包容新写入数据时,在设置了过期工夫的键空间中,移除最近起码应用的 key。

volatile-random:当内存不足以包容新写入数据时,在设置了过期工夫的键空间中,随机移除某个 key。

volatile-ttl:当内存不足以包容新写入数据时,在设置了过期工夫的键空间中,有更早过期工夫的 key 优先移除。

总结

Redis 的内存淘汰策略的选取并不会影响过期的 key 的解决。内存淘汰策略用于解决内存不足时的须要申请额定空间的数据;过期策略用于解决过期的缓存数据。

16、Redis 次要耗费什么物理资源?

内存。

17、Redis 的内存用完了会产生什么?

如果达到设置的下限,Redis 的写命令会返回错误信息(然而读命令还能够失常返回。)或者你能够配置内存淘汰机制,当 Redis 达到内存下限时会冲刷掉旧的内容。

18、Redis 如何做内存优化?

能够好好利用 Hash,list,sorted set,set 等汇合类型数据,因为通常状况下很多小的 Key-Value 能够用更紧凑的形式寄存到一起。尽可能应用散列表(hashes),散列表(是说散列表外面存储的数少)应用的内存十分小,所以你应该尽可能的将你的数据模型形象到一个散列表外面。比方你的 web 零碎中有一个用户对象,不要为这个用户的名称,姓氏,邮箱,明码设置独自的 key,而是应该把这个用户的所有信息存储到一张散列表外面。

五、线程模型

19、Redis 线程模型

Redis 基于 Reactor 模式开发了网络事件处理器,这个处理器被称为文件事件处理器(file event handler)。它的组成构造为 4 局部:多个套接字、IO 多路复用程序、文件事件分派器、事件处理器。因为文件事件分派器队列的生产是单线程的,所以 Redis 才叫单线程模型。

文件事件处理器应用 I/O 多路复用(multiplexing)程序来同时监听多个套接字,并依据套接字目前执行的工作来为套接字关联不同的事件处理器。

当被监听的套接字筹备好执行连贯应答(accept)、读取(read)、写入(write)、敞开(close)等操作时,与操作绝对应的文件事件就会产生,这时文件事件处理器就会调用套接字之前关联好的事件处理器来解决这些事件。

尽管文件事件处理器以单线程形式运行,但通过应用 I/O 多路复用程序来监听多个套接字,文件事件处理器既实现了高性能的网络通信模型,又能够很好地与 redis 服务器中其余同样以单线程形式运行的模块进行对接,这放弃了 Redis 外部单线程设计的简略性。

六、线程模型

19、Redis 线程模型

Redis 基于 Reactor 模式开发了网络事件处理器,这个处理器被称为文件事件处理器(file event handler)。它的组成构造为 4 局部:多个套接字、IO 多路复用程序、文件事件分派器、事件处理器。因为文件事件分派器队列的生产是单线程的,所以 Redis 才叫单线程模型。

文件事件处理器应用 I/O 多路复用(multiplexing)程序来同时监听多个套接字,并依据套接字目前执行的工作来为套接字关联不同的事件处理器。

当被监听的套接字筹备好执行连贯应答(accept)、读取(read)、写入(write)、敞开(close)等操作时,与操作绝对应的文件事件就会产生,这时文件事件处理器就会调用套接字之前关联好的事件处理器来解决这些事件。

尽管文件事件处理器以单线程形式运行,但通过应用 I/O 多路复用程序来监听多个套接字,文件事件处理器既实现了高性能的网络通信模型,又能够很好地与 redis 服务器中其余同样以单线程形式运行的模块进行对接,这放弃了 Redis 外部单线程设计的简略性。

七、事务

20、什么是事务?

事务是一个独自的隔离操作:事务中的所有命令都会序列化、按程序地执行。事务在执行的过程中,不会被其余客户端发送来的命令申请所打断。

事务是一个原子操作:事务中的命令要么全副被执行,要么全副都不执行。

21、Redis 事务的概念

Redis 事务的实质是通过 MULTI、EXEC、WATCH 等一组命令的汇合。事务反对一次执行多个命令,一个事务中所有命令都会被序列化。在事务执行过程,会依照程序串行化执行队列中的命令,其余客户端提交的命令申请不会插入到事务执行命令序列中。

总结说:redis 事务就是一次性、程序性、排他性的执行一个队列中的一系列命令。

22、Redis 事务的三个阶段

事务开始 MULTI

命令入队

事务执行 EXEC

事务执行过程中,如果服务端收到有 EXEC、DISCARD、WATCH、MULTI 之外的申请,将会把申请放入队列中排队。

23、Redis 事务相干命令

Redis 事务性能是通过 MULTI、EXEC、DISCARD 和 WATCH 四个原语实现的。

Redis 会将一个事务中的所有命令序列化,而后按程序执行。

1)redis 不反对回滚,“Redis 在事务失败时不进行回滚,而是继续执行余下的命令”,所以 Redis 的外部能够放弃简略且疾速。

2)如果在一个事务中的命令呈现谬误,那么所有的命令都不会执行;

.3)如果在一个事务中呈现运行谬误,那么正确的命令会被执行。

WATCH 命令是一个乐观锁,能够为 Redis 事务提供 check-and-set(CAS)行为。能够监控一个或多个键,一旦其中有一个键被批改(或删除),之后的事务就不会执行,监控始终继续到 EXEC 命令。

MULTI 命令用于开启一个事务,它总是返回 OK。MULTI 执行之后,客户端能够持续向服务器发送任意多条命令,这些命令不会立刻被执行,而是被放到一个队列中,当 EXEC 命令被调用时,所有队列中的命令才会被执行。

EXEC:执行所有事务块内的命令。返回事务块内所有命令的返回值,按命令执行的先后顺序排列。当操作被打断时,返回空值 nil。

通过调用 DISCARD,客户端能够清空事务队列,并放弃执行事务,并且客户端会从事务状态中退出。

UNWATCH 命令能够勾销 watch 对所有 key 的监控。

24、事务管理(ACID)概述

原子性(Atomicity):原子性是指事务是一个不可分割的工作单位,事务中的操作要么都产生,要么都不产生。

一致性(Consistency):事务前后数据的完整性必须保持一致。

隔离性(Isolation):多个事务并发执行时,一个事务的执行不应影响其余事务的执行。

持久性(Durability):持久性是指一个事务一旦被提交,它对数据库中数据的扭转就是永久性的,接下来即便数据库产生故障也不应该对其有任何影响

Redis 的事务总是具备 ACID 中的一致性和隔离性,其余个性是不反对的。当服务器运行在 AOF 长久化模式下,并且 appendfsync 选项的值为 always 时,事务也具备耐久性。

25、Redis 事务反对隔离性吗?

Redis 是单过程程序,并且它保障在执行事务时,不会对事务进行中断,事务能够运行直到执行完所有事务队列中的命令为止。因而,Redis 的事务是总是带有隔离性的。

26、Redis 事务保障原子性吗,反对回滚吗?

Redis 中,单条命令是原子性执行的,但事务不保障原子性,且没有回滚。事务中任意命令执行失败,其余的命令仍会被执行。

27、Redis 事务其余实现

基于 Lua 脚本,Redis 能够保障脚本内的命令一次性、按程序地执行,其同时也不提供事务运行谬误的回滚,执行过程中如果局部命令运行谬误,剩下的命令还是会持续运行完

基于两头标记变量,通过另外的标记变量来标识事务是否执行实现,读取数据时先读取该标记变量判断是否事务执行实现。但这样会须要额定写代码实现,比拟繁琐。

八、集群计划

28、哨兵模式

哨兵的介绍:

sentinel,中文名是哨兵。哨兵是 redis 集群机构中十分重要的一个组件,次要有以下性能:

集群监控:负责监控 redis master 和 slave 过程是否失常工作。

音讯告诉:如果某个 redis 实例有故障,那么哨兵负责发送音讯作为报警告诉给管理员。

故障转移:如果 master node 挂掉了,会主动转移到 slave node 上。

配置核心:如果故障转移产生了,告诉 client 客户端新的 master 地址。

哨兵用于实现 redis 集群的高可用,自身也是分布式的,作为一个哨兵集群去运行,相互协同工作。

故障转移时,判断一个 master node 是否宕机了,须要大部分的哨兵都批准才行,波及到了分布式选举的问题。

即便局部哨兵节点挂掉了,哨兵集群还是能失常工作的,因为如果一个作为高可用机制重要组成部分的故障转移零碎自身是单点的,那就很坑爹了。

哨兵的外围常识

哨兵至多须要 3 个实例,来保障本人的健壮性。

哨兵 + redis 主从的部署架构,是不保证数据零失落的,只能保障 redis 集群的高可用性。

对于哨兵 + redis 主从这种简单的部署架构,尽量在测试环境和生产环境,都进行短缺的测试和演练。

29、官网 Redis Cluster 计划(服务端路由查问)

redis 集群模式的工作原理能说一下么?在集群模式下,redis 的 key 是如何寻址的?分布式寻址都有哪些算法?理解一致性 hash 算法吗?

简介

Redis Cluster 是一种服务端 Sharding 技术,3.0 版本开始正式提供。Redis Cluster 并没有应用一致性 hash,而是采纳 slot(槽)的概念,一共分成 16384 个槽。将申请发送到任意节点,接管到申请的节点会将查问申请发送到正确的节点上执行

计划阐明

通过哈希的形式,将数据分片,每个节点均分存储肯定哈希槽 (哈希值) 区间的数据,默认调配了 16384 个槽位

每份数据分片会存储在多个互为主从的多节点上

数据写入先写主节点,再同步到从节点(反对配置为阻塞同步)

同一分片多个节点间的数据不放弃一致性

读取数据时,当客户端操作的 key 没有调配在该节点上时,redis 会返回转向指令,指向正确的节点

扩容时时须要须要把旧节点的数据迁徙一部分到新节点

在 redis cluster 架构下,每个 redis 要放开两个端口号,比方一个是 6379,另外一个就是 加 1w 的端口号,比方 16379。

16379 端口号是用来进行节点间通信的,也就是 cluster bus 的货色,cluster bus 的通信,用来进行故障检测、配置更新、故障转移受权。cluster bus 用了另外一种二进制的协定,gossip 协定,用于节点间进行高效的数据交换,占用更少的网络带宽和解决工夫。

节点间的外部通信机制

(根本通信原理)集群元数据的保护有两种形式:集中式、Gossip 协定。redis cluster 节点间采纳 gossip 协定进行通信。

分布式寻址算法

hash 算法(大量缓存重建)

一致性 hash 算法(主动缓存迁徙)+ 虚构节点(主动负载平衡)

redis cluster 的 hash slot 算法

长处

  • 无核心架构,反对动静扩容,对业务通明
  • 具备 Sentinel 的监控和主动 Failover(故障转移)能力
  • 客户端不须要连贯集群所有节点,连贯集群中任何一个可用节点即可
  • 高性能,客户端直连 redis 服务,免去了 proxy 代理的损耗

毛病

  • 运维也很简单,数据迁徙须要人工干预
  • 只能应用 0 号数据库
  • 不反对批量操作(pipeline 管道操作)
  • 分布式逻辑和存储模块耦合等

30、基于客户端调配


简介

Redis Sharding 是 Redis Cluster 进去之前,业界广泛应用的多 Redis 实例集群办法。其次要思维是采纳哈希算法将 Redis 数据的 key 进行散列,通过 hash 函数,特定的 key 会映射到特定的 Redis 节点上。Java redis 客户端驱动 jedis,反对 Redis Sharding 性能,即 ShardedJedis 以及联合缓存池的 ShardedJedisPool

长处

劣势在于非常简单,服务端的 Redis 实例彼此独立,互相无关联,每个 Redis 实例像单服务器一样运行,非常容易线性扩大,零碎的灵活性很强

毛病

因为 sharding 解决放到客户端,规模进一步扩充时给运维带来挑战。

客户端 sharding 不反对动静增删节点。服务端 Redis 实例群拓扑构造有变动时,每个客户端都须要更新调整。连贯不能共享,当利用规模增大时,资源节约制约优化

31.Redis 相比 memcached 有哪些劣势?

① memcached 所有的值均是简略的字符串,redis 作为 其替代者,反对更为丰盛的数据类型

②redis 的速度比 memcached 快很多

③ redis 能够长久化其数据

32.Redis 所有数据放到内存中的起因是什么?

Redis 为了达到最快的读写速度将数据都读到内存中,并通过异步的形式将数据写入磁盘。

所以 redis 具备疾速和数据长久化的特色。如果不将数据放在内存中,磁盘 I / O 速度为重大影响 redis 的性能。在内存越来越便宜的明天,redis 将会越来越受欢迎。如果设置了最大应用的内存,则数据已有记录数达到内存限值后不能持续插入新值。

33.Redis 适宜在哪些场景应用?

①会话缓存(Session Cache)

最罕用的一种应用 Redis 的情景是会话缓存 (session cache)。用 Redis 缓存会话比其余存储(如 Mem cached) 的劣势在于:Redis 提供长久化。当保护一个不是严格要求一致性的缓存时,如果用户的购物车信息全副失落,大部分人都会不快乐的,当初,他们还会这样吗?

侥幸的是,随着 Redis 这些年的改良,很容易找到怎么失当的应用 Redis 来缓存会话的文档。甚至广为人知的商业平台 Magento 也提供 Redis 的插件。

②全页缓存(FPC)

除根本的会话 token 之外,Redis 还提供很简便的 FPC 平台。回到一致性问题,即便重启了 Redis 实例,因为有磁盘的长久化,用户也不会看到页面加载速度的降落,这是一个极大改良,相似 PHP 本地 FPC。

再次以 Magento 为例,Magento 提供一个插件来应用 Redis 作为全页缓存后端。

此外,对 WordPress 的用户来说,Pantheon 有一个十分好的插件 wp redis,这个插件能帮忙你以最快速度加载你曾浏览过的页面。

③队列

Reids 在内存存储引擎畛域的一 - 大长处是提供 list 和 set 操作,这使得 Redis 能作为一个很好的音讯队列平台来应用。Redis 作为队列应用的操作,就相似于本地程序语言 (如 Python) 对 list 的 push/pop 操作。

如果你疾速的在 Google 中搜寻“Redis queues”,你马上就能找到大量的开源我的项目,这些我的项目的目标就是利用 Redis 创立十分好的后端工具,以满足各种队列需要。例如,Celery 有一个后盾就是应用 Redis 作为 broker, 你能够从这里去查看。

④排行榜 / 计数器

Redis 在内存中对数字进行递增或递加的操作实现的十分好。汇合 (Set) 和有序汇合 (Sorted Set) 也使得咱们在执行这些操作的时候变的非常简单,Redis 只是正好提供了这

两种数据结构。所以,咱们要从排序汇合中获取到排名最靠前的 10 个用户 - 咱们称之为“user_scores”, 咱们只须要像上面一样执行即可:

当然,这是假设你是依据你用户的分数做递增的排序。如果你想返回用户及用户的分数,你须要这样执行:

ZRANGE user scores 0 10 WITHSCORES
Agora Games 就是一个很好的例子,用 Ruby 实现的,它的排行榜就是应用 Redis 来存储数据的,你能够在这里看到。

⑤公布 / 订阅

最初 (但必定不是最不重要的) 是 Redis 的公布 / 订阅性能。公布 / 订阅的应用场景的确十分多。我已看见人们在社交网络连接中应用,还可作为基于公布 / 订阅的脚本触发器,甚至用 Redis 的公布 / 订阅性能来建设聊天零碎!

34.Redis 集群计划哪些计划?

①codis

目前用的最多的集群计划,根本和 twemproxy- 致的成果,但它反对在节点数量扭转状况下,旧节点数据可复原到新 hash 节点。

②redis

cluster3.0 自带的集群,特点在于他的分布式算法不是一致性 hash,而是 hash 槽的概念,以及本身反对节点设置从节点。具体看官网文档介绍。

③在业务代码层实现

起几个毫无关联的 redis 实例,在代码层,对 key 进行 hash 计算,而后去对应的 redis 实例操作数据。这种形式对 hash 层代码要求比拟高,思考局部包含,节点生效后的代替算法计划,数据震荡后的主动脚本复原,实例的监控,等等。

正文完
 0