Saya akan menentang jawaban yang diterima, karena jawaban yang diterima salah.
Meskipun Anda tidak dapat secara eksplisit mendefinisikan fungsi bernama, Anda bisa panggil skrip apa pun yang dapat Anda panggil dengan EVALSHA
. Lebih khusus lagi, semua skrip Lua yang telah Anda definisikan secara eksplisit melalui SCRIPT LOAD
atau secara implisit melalui EVAL
tersedia di namespace Lua global di f_<sha1 hash>
(sampai/kecuali Anda memanggil SCRIPT FLUSH
), yang dapat Anda hubungi kapan saja.
Masalah yang Anda hadapi adalah bahwa fungsi didefinisikan sebagai tidak mengambil argumen, dan KEYS
dan ARGV
tabel sebenarnya global. Jadi jika Anda ingin dapat berkomunikasi antar skrip Lua, Anda juga perlu memotong KEYS
Anda dan ARGV
tabel, atau Anda perlu menggunakan ruang tombol Redis standar untuk komunikasi antar fungsi Anda.
127.0.0.1:6379> script load "return {KEYS[1], ARGV[1]}" "d006f1a90249474274c76f5be725b8f5804a346b" 127.0.0.1:6379> eval "return f_d006f1a90249474274c76f5be725b8f5804a346b()" 1 "hello" "world" 1) "hello" 2) "world" 127.0.0.1:6379> eval "KEYS[1] = 'blah!'; return f_d006f1a90249474274c76f5be725b8f5804a346b()" 1 "hello" "world" 1) "blah!" 2) "world" 127.0.0.1:6379>
Semua ini mengatakan, ini sepenuhnya melanggar spesifikasi, dan sangat mungkin untuk berhenti bekerja dengan cara yang aneh jika Anda mencoba menjalankan ini dalam skenario cluster Redis.