Redis
 sql >> Teknologi Basis Data >  >> NoSQL >> Redis

apakah mungkin untuk memanggil fungsi lua yang didefinisikan dalam skrip lua lain di redis?

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.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Redis memasukkan rusak, atau menyortir dengan aneh?

  2. Perbedaan antara menyimpan Integer dan String di Redis

  3. Klien C#/.NET untuk Redis

  4. Redis store key tanpa nilai

  5. Laravel 4:Panggil ke metode yang tidak ditentukan Redis::connection()