Redis分片(分布式缓存)
分片(partitioning)就是将你的数据拆分到多个 Redis 实例的过程,这样每个实例将只包含所有键的子集.(相关推荐:Redis教程)
1 分片何用
Redis 的分片承担着两个主要目标:
• 允许使用很多电脑的内存总和来支持更大的数据库。没有分片,你就被局限于单机能支持的内存容量。
• 允许伸缩计算能力到多核或多服务器,伸缩网络带宽到多服务器或多网络适配器。
2 分片基础
有很多不同的分片标准(criteria).
假想我们有 4 个 Redis 实例 R0,R1,R2,R3,还有很多表示用户的键,像 user:1,user:2,… 等等,我们能找到不同的方式来选择一个指定的键存储在哪个实例中。换句话说,有许多不同的办法来映射一个键到一个指定的 Redis 服务器。
最简单的执行分片的方式之一是范围分片(range partitioning),通过映射对象的范围到指定的 Redis 实例来完成分片。例如,我可以假设用户从 ID 0 到 ID 10000 进入实例 R0,用户从 ID 10001 到 ID 20000 进入实例 R1.
这套办法行得通,并且事实上在实践中被采用,然而,这有一个缺点,就是需要一个映射范围到实例的表格.
这张表需要管理,不同类型的对象都需要一个表,所以范围分片在 Redis 中常常并不可取,因为这要比其他分片可选方案低效得多。
一种范围分片的替代方案是哈希分片(hash partitioning).
这种模式适用于任何键,不需要键像 object_name: 这样的饿形式,就像这样简单
• 使用一个哈希函数(例如,crc32 哈希函数) 将键名转换为一个数字。例如,如果键是 foobar,crc32(foobar)将会输出类似于 93024922 的东西。
• 对这个数据进行取模运算,以将其转换为一个 0 到 3 之间的数字,这样这个数字就可以映射到我的 4 台 Redis 实例之一。93024922 模 4 等于 2,所以我知道我的键 foobar 应当存储到 R2 实例。注意:取模操作返回除法操作的余数,在许多编程语言总实现为%操作符。
有许多其他的方式可以分片,从这两个例子中你就可以知道了。一种哈希分片的高级形式称为一致性哈希(consistent hashing),被一些 Redis 客户端和代理实现。
3 分片实现(理论)
分片可由软件栈中的不同部分来承担。
• 客户端分片(Client side partitioning)
客户端直接选择正确的节点来写入和读取指定键,许多 Redis 客户端实现了客户端分片.
• 代理协助分片(Proxy assisted partitioning)
我们的客户端发送请求到一个可以理解 Redis 协议的代理上.而不是直接发送请求到 Redis 实例上.
代理会根据配置好的分片模式,来保证转发我们的请求到正确的 Redis 实例,并返回响应给客户端.
Redis 和 Memcached 的代理 Twemproxy 实现了代理协助的分片.
• 查询路由(Query routing)
你可以发送你的查询到一个随机实例,这个实例会保证转发你的查询到正确的节点.
Redis 集群在客户端的帮助下,实现了查询路由的一种混合形式 (请求不是直接从 Redis 实例转发到另一个,而是客户端收到重定向到正确的节点).
4 分片缺点
Redis 的一些特性与分片在一起时玩的不是很好
• 涉及多个键的操作通常不支持。例如,你不能对映射在两个不同 Redis 实例上的键执行交集(事实上有办法做到,但不是直接这么干).
• 涉及多个键的事务不能使用
• 分片的粒度(granularity)是键,所以不能使用一个很大的键来分片数据集,例如一个很大的有序集合
• 当使用了分片,数据处理变得更复杂,例如,你需要处理多个 RDB/AOF 文件,备份数据时你需要聚合多个实例和主机的持久化文件
• 添加和删除容量也很复杂。例如,Redis 集群具有运行时动态添加和删除节点的能力来支持透明地再均衡数据,但是其他方式,像客户端分片和代理都不支持这个特性。但是,有一种称为预分片(Presharding)的技术在这一点上能帮上忙。
5 存储 OR 缓存
尽管无论是将 Redis 作为数据存储还是缓存,Redis 的分片概念上都是一样的,但是作为数据存储时有一个重要的局限。当 Redis 作为数据存储时,一个给定的键总是映射到相同的 Redis 实例。当 Redis 作为缓存时,如果一个节点不可用而使用另一个节点,这并不是一个什么大问题,按照我们的愿望来改变键和实例的映射来改进系统的可用性(就是系统回复我们查询的能力)。
一致性哈希实现常常能够在指定键的首选节点不可用时切换到其他节点。类似的,如果你添加一个新节点,部分数据就会开始被存储到这个新节点上。
这里的主要概念如下:
• 如果 Redis 用作缓存,使用一致性哈希来来实现伸缩扩展(scaling up and down)是很容易的。
• 如果 Redis 用作存储,使用固定的键到节点的映射,所以节点的数量必须固定不能改变。否则,当增删节点时,就需要一个支持再平衡节点间键的系统,当前只有 Redis 集群可以做到这一点.
6 预分片
我们已经知道分片存在的一个问题,除非我们使用 Redis 作为缓存,增加和删除节点是一件很棘手的事情,使用固定的键和实例映射要简单得多。
然而,数据存储的需求可能一直在变化。今天我可以接受 10 个 Redis 节点(实例),但是明天我可能就需要 50 个节点。
因为 Redis 只有相当少的内存占用且轻量级(一个空闲的实例只是用 1MB 内存),一个简单的解决办法是一开始就开启很多的实例。即使你一开始只有一台服务器,你也可以在第一天就决定生活在分布式的世界里,使用分片来运行多个 Redis 实例在一台服务器上。
你一开始就可以选择很多数量的实例。例如,32 或者 64 个实例能满足大多数的用户,并且为未来的增长提供足够的空间。
这样,当你的数据存储需要增长,你需要更多的 Redis 服务器,你要做的就是简单地将实例从一台服务器移动到另外一台。当你新添加了第一台服务器,你就需要把一半的 Redis 实例从第一台服务器搬到第二台,如此等等。
使用 Redis 复制,你就可以在很小或者根本不需要停机时间内完成移动数据:
• 在你的新服务器上启动一个空实例。
• 移动数据,配置新实例为源实例的从服务。
• 停止你的客户端。
• 更新被移动实例的服务器 IP 地址配置。
• 向新服务器上的从节点发送 SLAVEOF NO ONE 命令。
• 以新的更新配置启动你的客户端。
• 最后关闭掉旧服务器上不再使用的实例。
7 分片实现(实践)
到目前为止,我们从理论上讨论了 Redis 分片,但是实践情况如何呢?你应该使用什么系统呢?
7.1 Redis 集群
Redis 集群是自动分片和高可用的首选方式.
一旦 Redis 集群可用,以及支持 Redis 集群的客户端可用,Redis 集群将会成为 Redis 分片的事实标准。
Redis 集群是查询路由和客户端分片的混合模式。
7.2 Twemproxy
Twemproxy 是 Twitter 开发的一个支持 Memcached ASCII 和 Redis 协议的代理。它是单线程的,由 C 语言编写,运行非常的快。基于 Apache 2.0 许可的开源项目。
Twemproxy 支持自动在多个 Redis 实例间分片,如果节点不可用时,还有可选的节点排除支持(这会改变键和实例的映射,所以你应该只在将 Redis 作为缓存是才使用这个特性)。
这并不是单点故障(single point of failure),因为你可以启动多个代理,并且让你的客户端连接到第一个接受连接的代理。
从根本上说,Twemproxy 是介于客户端和 Redis 实例之间的中间层,这就可以在最下的额外复杂性下可靠地处理我们的分片。这是当前建议的处理 Redis 分片的方式.
7.3 支持一致性哈希的客户端
Twemproxy 之外的可选方案,是使用实现了客户端分片的客户端,通过一致性哈希或者别的类似算法。有多个支持一致性哈希的 Redis 客户端,例如 Redis-rb 和 Predis。
请查看完整的 Redis 客户端列表,看看是不是有支持你的编程语言的,并实现了一致性哈希的成熟客户端。
Atas ialah kandungan terperinci Redis分片(分布式缓存). Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

Video Face Swap
Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas





Cara menggunakan Redis dan Node.js untuk melaksanakan fungsi caching teragih Redis ialah pangkalan data dalam memori sumber terbuka yang menyediakan storan nilai kunci yang pantas dan berskala dan sering digunakan dalam senario seperti caching, baris gilir mesej dan storan data. Node.js ialah masa jalan JavaScript berdasarkan enjin ChromeV8, sesuai untuk aplikasi web berkonkurensi tinggi. Artikel ini akan memperkenalkan cara menggunakan Redis dan Node.js untuk melaksanakan fungsi cache yang diedarkan dan membantu pembaca memahami dan mempraktikkannya melalui contoh kod tertentu.

PHP dan REDIS: Cara melaksanakan pembatalan dan kemas kini cache teragih Pengenalan: Dalam sistem teragih moden, cache ialah komponen yang sangat penting, yang boleh meningkatkan prestasi dan kebolehskalaan sistem dengan ketara. Pada masa yang sama, pembatalan dan kemas kini cache juga merupakan isu yang sangat penting, kerana jika pembatalan dan kemas kini data cache tidak dapat dikendalikan dengan betul, ia akan membawa kepada ketidakkonsistenan data sistem. Artikel ini akan memperkenalkan cara menggunakan PHP dan REDIS untuk melaksanakan pembatalan dan kemas kini cache yang diedarkan serta memberikan contoh kod yang berkaitan. 1. Apa itu MERAH

Cara mengendalikan strategi caching dan caching teragih dalam pembangunan C# Pengenalan: Dalam era maklumat yang sangat saling berkaitan hari ini, prestasi aplikasi dan kelajuan tindak balas adalah penting untuk pengalaman pengguna. Caching adalah salah satu cara penting untuk meningkatkan prestasi aplikasi. Dalam sistem teragih, berurusan dengan caching dan membangunkan strategi caching menjadi lebih penting kerana kerumitan sistem teragih sering mencipta cabaran tambahan. Artikel ini akan meneroka cara menangani strategi caching dan caching yang diedarkan dalam pembangunan C#, dan menunjukkan pelaksanaan melalui contoh kod tertentu. 1. Pengenalan menggunakan cache teragih

Cara mengendalikan transaksi teragih dan cache teragih dalam pembangunan C# memerlukan contoh kod khusus Ringkasan: Dalam sistem teragih, pemprosesan transaksi dan pengurusan cache ialah dua aspek penting. Artikel ini akan memperkenalkan cara mengendalikan transaksi teragih dan cache teragih dalam pembangunan C#, dan memberikan contoh kod khusus. Pengenalan Apabila skala dan kerumitan sistem perisian meningkat, banyak aplikasi menggunakan seni bina teragih. Dalam sistem yang diedarkan, pemprosesan transaksi dan pengurusan cache adalah dua cabaran utama. Pemprosesan transaksi memastikan konsistensi data, manakala pengurusan cache menambah baik sistem

Dengan pembangunan aplikasi web, semakin banyak perhatian beralih kepada cara meningkatkan prestasi aplikasi. Peranan caching adalah untuk mengimbangi trafik yang tinggi dan beban sibuk serta meningkatkan prestasi dan kebolehskalaan aplikasi web. Dalam persekitaran yang diedarkan, cara melaksanakan caching ketersediaan tinggi telah menjadi teknologi penting. Artikel ini akan memperkenalkan cara menggunakan beberapa alatan dan rangka kerja yang disediakan oleh go-zero untuk melaksanakan cache teragih ketersediaan tinggi, dan membincangkan secara ringkas kelebihan dan had go-zero dalam aplikasi praktikal. 1. Apa itu pergi-

Dalam persekitaran Internet semasa dengan konkurensi tinggi dan data besar, teknologi caching telah menjadi salah satu cara penting untuk meningkatkan prestasi sistem. Dalam teknologi caching Java, caching teragih adalah teknologi yang sangat penting. Jadi apakah cache yang diedarkan? Artikel ini akan menyelidiki caching teragih dalam teknologi caching Java. 1. Konsep asas cache teragih Cache teragih merujuk kepada sistem cache yang menyimpan data cache pada berbilang nod. Antaranya, setiap nod mengandungi salinan lengkap data cache dan boleh menyandarkan satu sama lain Apabila salah satu nod gagal,

Pembangunan Java: Cara Melaksanakan Caching Teragih dan Perkongsian Data Pengenalan: Dengan pengembangan berterusan skala sistem, seni bina teragih telah menjadi pilihan biasa untuk pembangunan aplikasi perusahaan. Dalam sistem teragih, caching yang cekap dan perkongsian data adalah salah satu tugas utama. Artikel ini akan memperkenalkan cara menggunakan Java untuk membangunkan kaedah caching dan perkongsian data teragih, dan menyediakan contoh kod khusus. 1. Pelaksanaan cache teragih 1.1Redis sebagai cache teragih Redis ialah pangkalan data dalam memori sumber terbuka yang boleh digunakan sebagai cache teragih. Berikut ialah

Menggunakan Redis untuk merealisasikan penyelesaian penembusan cache yang diedarkan Dengan perkembangan berterusan perniagaan Internet, jumlah akses data juga semakin meningkat Untuk meningkatkan prestasi dan pengalaman pengguna sistem, teknologi caching secara beransur-ansur menjadi bahagian yang sangat diperlukan, yang mana Redis. adalah bahagian penting. Penyelesaian perisian tengah caching yang cekap dan berskala yang digemari oleh pembangun. Apabila menggunakan Redis sebagai cache teragih, untuk mengelakkan masalah prestasi yang disebabkan oleh penembusan cache, kita perlu melaksanakan penyelesaian yang boleh dipercayai. Artikel ini akan memperkenalkan cara menggunakan Redis untuk mencapai pemisahan
