Rumah >pangkalan data >Redis >Penulisan skrip Lua dan aplikasi untuk Redis

Penulisan skrip Lua dan aplikasi untuk Redis

WBOY
WBOYasal
2023-05-11 17:17:092171semak imbas

Redis ialah pangkalan data storan nilai kunci sumber terbuka dan skrip Lua ialah alat pengaturcaraan yang sangat berkuasa dalam Redis. Lua ialah bahasa skrip yang ringan dan cekap yang boleh digunakan sebagai bahasa sambungan untuk pelayan Redis. Artikel ini akan memperkenalkan penulisan, kaedah panggilan dan aplikasi praktikal skrip Lua dalam Redis.

1. Skrip Lua dalam Redis

1.1 Pengenalan kepada bahasa skrip Lua

Sebagai bahasa yang ringan, skrip Lua mempunyai set sintaks khusus dan jenis dinamik yang sangat kecil. prestasi yang baik dan ciri lain, tetapi ciri ini menjadikan skrip Lua lebih sesuai untuk menyelesaikan beberapa masalah tertentu.

1.2 Kebaikan dan keburukan bahasa skrip Lua dalam Redis

Kebaikan:

  • Atomicity: Skrip Lua adalah atom dan tidak akan diganggu oleh pelanggan lain , dilaksanakan secara berasingan.
  • Kebolehgunaan semula: Kod skrip Lua boleh digunakan semula pada berbilang nod REDIS.
  • Prestasi cemerlang: Penterjemah skrip Lua dan Pelayan Redis mencapai prestasi yang sangat cekap dengan berkongsi proses.

Kelemahan:

  • Sukar untuk nyahpepijat: Ciri bahasa skrip Lua adalah berbeza daripada ciri bahasa Redis, dan sukar untuk menjalankan penyiasatan lengkap skrip Lua ;
  • Pautan antara skrip Redis dan Lua: Skrip Lua perlu menghantar parameter dan mengembalikan data melalui klien, menambah overhed tambahan.

1.3 Peraturan skrip Lua dalam Redis

  • Persekitaran Lua yang digunakan oleh Redis ialah 5.1 dan serasi dengan beberapa sintaks lanjutan versi 5.2
  • Semua Arahan Redis mesti dipanggil melalui Redis.call;
  • Semua rujukan nilai Redis.key perlu dihantar menggunakan KEYS atau ARGV
  • Semua pengendalian ralat perlu menggunakan fungsi ralat.

1.4 Contoh kod skrip Lua dalam Redis

Berikut ialah contoh skrip Lua bagi pembilang:

kiraan tempatan = tonumber(redis.call("get ", KEYS[1])) atau 0
jika dikira > tonumber(ARGV[1]) maka

redis.call("set", KEYS[1], ARGV[1])
return 0

lain

count = redis.call("incr", KEYS[1])
return count 

tamat

2. Redis Kaedah memanggil skrip Lua

Terdapat dua cara untuk memanggil skrip Lua dalam Redis:

2.1 Menggunakan arahan EVAL

Redis menyediakan arahan EVAL, yang boleh digunakan untuk jalankan dan tulis skrip Lua yang Baik.

Sintaks:
kunci numkey skrip EVAL [kunci ...] arg [arg ...]

Contoh:

redis.eval('return redis. call("GET", KEYS[1])', 1, "mykey")

2.2 Gunakan arahan SCRIPT LOAD

Dalam Redis, anda juga boleh menggunakan arahan SCRIPT LOAD untuk memuatkan Lua dalam skrip awal dan kemudian panggil cincang SHA1 untuk melaksanakan skrip.

Sintaks:
skrip LOAD SKRIP

Contoh:

skrip tempatan = [[

local key = KEYS[1]
local max_count = tonumber(ARGV[1])
local current_count = tonumber(redis.call("get", key))
if current_count and current_count >= max_count then
    redis.call("del", key)
end
redis.call("incr", key)
return true

]]

kunci tempatan = 'limiter:xxx'
bilangan_maksimum tempatan = 10
skrip tempatan_sha = redis.call('SCRIPT', 'LOAD', script)
redis.call('EVALSHA', script_sha, 1, key, max_count)

3. Contoh aplikasi skrip Lua dalam Redis

3.1 Kunci teragih

Kunci teragih memerlukan kod skrip yang sama pada semua nod Redis ini kecekapan operasi aplikasi.

Contoh skrip Lua yang melaksanakan kunci teragih:

kunci_kunci tempatan = KEYS[1]
masa tamat_kunci tempatan = tonumber(ARGV[1])
nilai_kunci tempatan = KEYS[2 ]
masa_sah_kunci tempatan = tonumber(ARGV[2])

jika redis.call("set", kunci_kunci, nilai_kunci, "NX", "EX", lock_timeout) maka

redis.call("expire", lock_key, lock_valid_time)
return lock_value

else

return nil

tamat

3.2 Pertanyaan paging koleksi yang dipesan

Koleksi yang dipesan Redis menyediakan fungsi pertanyaan paging, yang boleh berdasarkan julat skor dalam koleksi yang dipesan. Lakukan pertanyaan paging.

Contoh skrip Lua yang melaksanakan pertanyaan paging set tersusun:

local page_no = tonumber(ARGV[1])
local page_size = tonumber(ARGV[2])
local mula = (halaman_no - 1) * page_size
local stop = page_no * page_size - 1
local opts = {score_cast_func = tonumber}

local result = {}

local data = redis.call("ZRANGE", KEYS[1], mula, berhenti, "WITHSCORES")
untuk idx = 1, #data, 2 do

local k = data[idx]
local v = tonumber(data[idx + 1])
table.insert(result, {k, v})

tamat

kembali hasil

Kesimpulan:

Skrip Lua ialah alat yang sangat berkuasa dalam Redis, jadi kaedah menulis dan memanggil skrip Lua adalah sangat penting. Dalam aplikasi praktikal, kita boleh menulis skrip Lua yang sepadan untuk senario aplikasi tertentu untuk meningkatkan prestasi dan kelajuan berjalan Redis.

Atas ialah kandungan terperinci Penulisan skrip Lua dan aplikasi untuk Redis. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn