Pengenalan kepada Redis
Redis adalah sumber terbuka sepenuhnya dan percuma, mematuhi protokol BSD, dan merupakan pangkalan data nilai kunci berprestasi tinggi
Redis dan cache nilai kunci lain Produk ini mempunyai tiga ciri berikut:
Redis menyokong kegigihan data Ia boleh menyimpan data dalam memori ke cakera dan memuatkannya semula untuk digunakan semasa memulakan semula.
Redis bukan sahaja menyokong data jenis nilai kunci mudah, tetapi juga menyediakan storan struktur data seperti senarai, set, zset, cincang dll.
Redis menyokong sandaran data, iaitu sandaran data dalam mod tuan-hamba
Kelebihan Redis
Prestasi cemerlang Tinggi - Kelajuan baca Redis ialah 110,000 kali/s dan kelajuan tulis ialah 81,000 kali/s.
Jenis data kaya - Redis menyokong operasi jenis data Rentetan, Senarai, Cincang, Set dan Set Tertib untuk kes binari.
Atomicity - Semua operasi Redis adalah atom, yang bermaksud sama ada ia akan dilaksanakan dengan jayanya atau tidak dilaksanakan sama sekali jika gagal. Operasi individu adalah atom. Transaksi berbilang operasi boleh dilaksanakan menggunakan arahan MULTI dan EXEC untuk memastikan atomicity.
Ciri lain - Redis juga menyokong pemberitahuan penerbitan/langganan, tamat tempoh kunci dan ciri lain.
Jenis data Redis
Redis menyokong 5 jenis data: rentetan (rentetan), hash (hash), senarai (senarai), set ( set), zset (set diisih: set tersusun)
rentetan
rentetan ialah jenis data redis yang paling asas. Kunci sepadan dengan nilai.
rentetan selamat binari. Maksudnya, rentetan redis boleh mengandungi sebarang data. Contohnya, imej jpg atau objek bersiri.
Salah satu jenis data asas Redis ialah jenis rentetan dan saiz nilai jenis rentetan boleh sehingga 512 MB.
Faham: rentetan adalah seperti peta dalam java, kunci sepadan dengan nilai
127.0.0.1:6379> set hello world OK 127.0.0.1:6379> get hello "world"
hash
Pengumpulan cincang ialah jenis data Redis yang terdiri daripada pasangan nilai kunci. Hash Redis ialah jadual pemetaan kekunci dan nilai jenis rentetan amat sesuai untuk menyimpan objek.
Pemahaman: Anda boleh menganggap cincangan sebagai set nilai kunci. Anda juga boleh menganggapnya sebagai cincangan yang sepadan dengan berbilang rentetan. Perbezaan antara
dan rentetan : rentetan ialah pasangan nilai kunci, manakala cincang ialah berbilang pasangan nilai kunci.
// hash-key 可以看成是一个键值对集合的名字,在这里分别为其添加了 sub-key1 : value1、 sub-key2 : value2、sub-key3 : value3 这三个键值对 127.0.0.1:6379> hset hash-key sub-key1 value1 (integer) 1 127.0.0.1:6379> hset hash-key sub-key2 value2 (integer) 1 127.0.0.1:6379> hset hash-key sub-key3 value3 (integer) 1 // 获取 hash-key 这个 hash 里面的所有键值对 127.0.0.1:6379> hgetall hash-key 1) "sub-key1" 2) "value1" 3) "sub-key2" 4) "value2" 5) "sub-key3" 6) "value3" // 删除 hash-key 这个 hash 里面的 sub-key2 键值对 127.0.0.1:6379> hdel hash-key sub-key2 (integer) 1 127.0.0.1:6379> hget hash-key sub-key2 (nil) 127.0.0.1:6379> hget hash-key sub-key1 "value1" 127.0.0.1:6379> hgetall hash-key 1) "sub-key1" 2) "value1" 3) "sub-key3" 4) "value3"
senarai
Senarai redis ialah senarai rentetan ringkas, diisih mengikut susunan sisipan. Kita boleh menambah elemen di kiri atau kanan senarai.
127.0.0.1:6379> rpush list-key v1 (integer) 1 127.0.0.1:6379> rpush list-key v2 (integer) 2 127.0.0.1:6379> rpush list-key v1 (integer) 3 127.0.0.1:6379> lrange list-key 0 -1 1) "v1" 2) "v2" 3) "v1" 127.0.0.1:6379> lindex list-key 1 "v2" 127.0.0.1:6379> lpop list (nil) 127.0.0.1:6379> lpop list-key "v1" 127.0.0.1:6379> lrange list-key 0 -1 1) "v2" 2) "v1"
Kita dapat lihat senarai itu ialah koleksi rentetan yang ringkas, yang tidak jauh berbeza daripada senarai di Jawa Perbezaannya ialah senarai di sini menyimpan rentetan. Elemen dalam senarai boleh diulang.
set
set redis ialah koleksi jenis rentetan yang tidak tertib. Memandangkan set itu dilaksanakan menggunakan struktur data jadual cincang, kerumitan masa operasi pemasukan, pemadaman dan cariannya ialah O(1)
127.0.0.1:6379> sadd k1 v1 (integer) 1 127.0.0.1:6379> sadd k1 v2 (integer) 1 127.0.0.1:6379> sadd k1 v3 (integer) 1 127.0.0.1:6379> sadd k1 v1 (integer) 0 127.0.0.1:6379> smembers k1 1) "v3" 2) "v2" 3) "v1" 127.0.0.1:6379> 127.0.0.1:6379> sismember k1 k4 (integer) 0 127.0.0.1:6379> sismember k1 v1 (integer) 1 127.0.0.1:6379> srem k1 v2 (integer) 1 127.0.0.1:6379> srem k1 v2 (integer) 0 127.0.0.1:6379> smembers k1 1) "v3" 2) "v1"
set redis dan java Set in masih sedikit berbeza.
Set Redis ialah kunci yang sepadan dengan berbilang nilai jenis rentetan, dan ia juga merupakan koleksi jenis rentetan Walau bagaimanapun, tidak seperti senarai redis, elemen koleksi rentetan dalam set tidak boleh diulang, tetapi senarai boleh.
Zset
redis zset, seperti set, ialah koleksi elemen jenis rentetan dan elemen dalam koleksi tidak boleh diulang.
Perbezaannya ialah setiap elemen dalam zset dikaitkan dengan skor berganda jenis. Redis menggunakan markah untuk mengisih ahli dalam set dari kecil kepada besar.
Elemen zset adalah unik, tetapi markah boleh diulang.
127.0.0.1:6379> zadd zset-key 728 member1 (integer) 1 127.0.0.1:6379> zadd zset-key 982 member0 (integer) 1 127.0.0.1:6379> zadd zset-key 982 member0 (integer) 0 127.0.0.1:6379> zrange zset-key 0 -1 withscores 1) "member1" 2) "728" 3) "member0" 4) "982" 127.0.0.1:6379> zrangebyscore zset-key 0 800 withscores 1) "member1" 2) "728" 127.0.0.1:6379> zrem zset-key member1 (integer) 1 127.0.0.1:6379> zrem zset-key member1 (integer) 0 127.0.0.1:6379> zrange zset-key 0 -1 withscores 1) "member0" 2) "982"
zset disusun mengikut saiz markah.
Terbitkan dan langgan
Secara amnya, Redis tidak digunakan untuk penerbitan dan langganan mesej.
Pengenalan
Redis publish dan subscribe (pub/sub) ialah model komunikasi mesej: pengirim (pub) menghantar mesej dan pelanggan (sub) menerima mesej.
Pelanggan Redis boleh melanggan sebarang bilangan saluran.
Rajah berikut menunjukkan saluran saluran1 dan hubungan antara tiga pelanggan yang melanggan saluran ini - pelanggan2, pelanggan5 dan pelanggan1:
学Redis这篇就够了
当有新消息通过 PUBLISH 命令发送给频道 channel1 时, 这个消息就会被发送给订阅它的三个客户端:
学Redis这篇就够了
实例
以下实例演示了发布订阅是如何工作的。在我们实例中我们创建了订阅频道名为 redisChat:
127.0.0.1:6379> SUBsCRIBE redisChat Reading messages... (press Ctrl-C to quit) 1) "subscribe" 2) "redisChat"
现在,我们先重新开启个 redis 客户端,然后在同一个频道 redisChat 发布两次消息,订阅者就能接收到消息。
127.0.0.1:6379> PUBLISH redisChat "send message" (integer) 1 127.0.0.1:6379> PUBLISH redisChat "hello world" (integer) 1 # 订阅者的客户端显示如下 1) "message" 2) "redisChat" 3) "send message" 1) "message" 2) "redisChat" 3) "hello world"
事务
redis 事务一次可以执行多条命令,服务器在执行命令期间,不会去执行其他客户端的命令请求。
事务中的多条命令被一次性发送给服务器,而不是一条一条地发送,这种方式被称为流水线,它可以减少客户端与服务器之间的网络通信次数从而提升性能。
Redis 最简单的事务实现方式是使用 MULTI 和 EXEC 命令将事务操作包围起来。
批量操作在发送 EXEC 命令前被放入队列缓存。
在接收到 EXEC 命令后,进入事务执行。如果在事务中有命令执行失败,其他命令仍然会继续执行。也就是说 Redis 事务不保证原子性。
在事务执行过程中,其他客户端提交的命令请求不会插入到事务执行命令序列中。
一个事务从开始到执行会经历以下三个阶段:
开始事务。
命令入队。
执行事务。
实例
以下是一个事务的例子, 它先以 MULTI 开始一个事务, 然后将多个命令入队到事务中, 最后由 EXEC 命令触发事务, 一并执行事务中的所有命令:
redis 127.0.0.1:6379> MULTI OK redis 127.0.0.1:6379> SET book-name "Mastering C++ in 21 days" QUEUED redis 127.0.0.1:6379> GET book-name QUEUED redis 127.0.0.1:6379> SADD tag "C++" "Programming" "Mastering Series" QUEUED redis 127.0.0.1:6379> SMEMBERS tag QUEUED redis 127.0.0.1:6379> EXEC 1) OK 2) "Mastering C++ in 21 days" 3) (integer) 3 4) 1) "Mastering Series" 2) "C++" 3) "Programming"
单个 Redis 命令的执行是原子性的,但 Redis 没有在事务上增加任何维持原子性的机制,所以 Redis 事务的执行并不是原子性的。
事务可以理解为一个打包的批量执行脚本,但批量指令并非原子化的操作,中间某条指令的失败不会导致前面已做指令的回滚,也不会造成后续的指令不做。
这是官网上的说明 From redis docs on transactions:
It's important to note that even when a command fails, all the other commands in the queue are processed – Redis will not stop the processing of commands.
比如:
redis 127.0.0.1:7000> multi OK redis 127.0.0.1:7000> set a aaa QUEUED redis 127.0.0.1:7000> set b bbb QUEUED redis 127.0.0.1:7000> set c ccc QUEUED redis 127.0.0.1:7000> exec 1) OK 2) OK 3) OK
如果在 set b bbb 处失败,set a 已成功不会回滚,set c 还会继续执行。
Redis 事务命令
下表列出了 redis 事务的相关命令:
序号命令及描述:
1. DISCARD 取消事务,放弃执行事务块内的所有命令。
2. EXEC 执行所有事务块内的命令。
3. MULTI 标记一个事务块的开始。
4. UNWATCH 取消 WATCH 命令对所有 key 的监视。
5. WATCH key [key …]监视一个 (或多个) key ,如果在事务执行之前这个 (或这些) key 被其他命令所改动,那么事务将被打断。
持久化
Redis 是内存型数据库,为了保证数据在断电后不会丢失,需要将内存中的数据持久化到硬盘上。
RDB 持久化
将某个时间点的所有数据都存放到硬盘上。
可以将快照复制到其他服务器从而创建具有相同数据的服务器副本。
如果系统发生故障,将会丢失最后一次创建快照之后的数据。
如果数据量大,保存快照的时间会很长。
AOF 持久化
将写命令添加到 AOF 文件(append only file)末尾。
使用 AOF 持久化需要设置同步选项,从而确保写命令同步到磁盘文件上的时机。
这是因为对文件进行写入并不会马上将内容同步到磁盘上,而是先存储到缓冲区,然后由操作系统决定什么时候同步到磁盘。
选项同步频率always每个写命令都同步eyerysec每秒同步一次no让操作系统来决定何时同步
always 选项会严重减低服务器的性能
everysec 选项比较合适,可以保证系统崩溃时只会丢失一秒左右的数据,并且 Redis 每秒执行一次同步对服务器几乎没有任何影响。
no 选项并不能给服务器性能带来多大的提升,而且会增加系统崩溃时数据丢失的数量。
随着服务器写请求的增多,AOF 文件会越来越大。Redis提供了一项称作AOF重写的功能,能够消除AOF文件中的重复写入命令。
复制
Jadikan satu pelayan sebagai hamba pelayan lain dengan menggunakan arahan port hos slaveof.
Pelayan hamba hanya boleh mempunyai satu pelayan induk dan replikasi induk-induk tidak disokong.
Proses sambungan
Pelayan induk mencipta fail syot kilat, iaitu fail RDB dan menghantarnya ke pelayan hamba, dan menggunakan rekod penimbal untuk dilaksanakan semasa arahan tulis penghantaran.
Selepas fail syot kilat dihantar, mula menghantar arahan tulis yang disimpan dalam penimbal daripada pelayan.
Pelayan hamba membuang semua data lama, memuatkan fail syot kilat yang dihantar oleh pelayan induk, dan kemudian pelayan hamba mula menerima arahan tulis daripada pelayan induk.
Setiap kali pelayan induk melaksanakan arahan tulis, ia menghantar arahan tulis yang sama kepada pelayan hamba.
Rantai tuan-hamba
Apabila beban terus meningkat, jika pelayan induk tidak dapat mengemas kini semua pelayan hamba dengan cepat, atau menyambung semula dan menyegerakkan pelayan hamba Boleh menyebabkan beban sistem.
Untuk menyelesaikan masalah ini, lapisan perantara boleh diwujudkan untuk mengurangkan beban kerja replikasi pelayan utama. Pelayan peringkat pertengahan secara serentak bertindak sebagai pelayan hamba pelayan peringkat atas dan pelayan induk pelayan peringkat bawah.
Sentinel
Sentinel boleh memantau pelayan dalam kelompok dan secara automatik Memilih pelayan induk baharu daripada pelayan hamba.
Sharding
Sharding ialah kaedah membahagikan data kepada beberapa bahagian Data boleh disimpan dalam berbilang mesin peningkatan prestasi boleh dicapai apabila menyelesaikan masalah.
Andaikan terdapat 4 kejadian Redis R0, R1, R2, R3, dan terdapat banyak kunci yang mewakili pengguna pengguna:1, pengguna:2, &hellip , terdapat cara yang berbeza untuk memilih kunci yang ditentukan untuk disimpan Dalam contoh yang mana.
Yang paling mudah ialah julat sharding, contohnya, ID pengguna dari 0 ~ 1000 disimpan dalam contoh R0, ID pengguna dari 1001 ~ 2000 disimpan dalam contoh R1, dan seterusnya. Walau bagaimanapun, ini memerlukan penyelenggaraan jadual julat pemetaan, yang mahal untuk diselenggara.
Satu lagi ialah cincangan sharding. Kejadian yang perlu disimpan ditentukan dengan menjalankan fungsi cincang CRC32 pada kekunci, menukarnya kepada nombor, dan kemudian modulo bilangan kejadian.
Mengikut lokasi sharding dilakukan, ia boleh dibahagikan kepada tiga kaedah sharding:
Client sharding: Pelanggan menggunakan konsistensi Algoritma seperti pencincangan menentukan nod mana ia harus diedarkan.
Perkongsian proksi: Hantar permintaan pelanggan kepada proksi dan proksi memajukannya ke nod yang betul.
Pembahagian pelayan: Kluster Redis.
Atas ialah kandungan terperinci Apakah mata pengetahuan komprehensif Redis?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!