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

Gunakan Banyak DB Dengan Satu Skrip Redis Lua?

Biasanya merupakan ide yang salah untuk meletakkan data terkait di database Redis yang berbeda. Hampir tidak ada manfaat dibandingkan dengan mendefinisikan ruang nama dengan konvensi penamaan kunci (tidak ada rincian tambahan mengenai keamanan, ketekunan, manajemen kedaluwarsa, dll ...). Dan kelemahan utama adalah klien harus secara manual menangani pemilihan database yang benar, yang rawan kesalahan untuk klien menargetkan beberapa database pada waktu yang sama.

Sekarang, jika Anda masih ingin menggunakan banyak database, ada cara untuk membuatnya bekerja dengan redis-py dan skrip Lua.

redis-py tidak mendefinisikan pembungkus untuk perintah SELECT (biasanya digunakan untuk mengganti database saat ini), karena implementasi kumpulan koneksi thread-safe yang mendasarinya. Tetapi tidak ada yang menghalangi Anda untuk memanggil SELECT dari skrip Lua.

Perhatikan contoh berikut:

$ redis-cli
SELECT 0
SET mykey db0
SELECT 1
SET mykey db1

Script berikut menampilkan nilai mykey di 2 database dari koneksi klien yang sama.

import redis

pool = redis.ConnectionPool(host='localhost', port=6379, db=0)
r = redis.Redis(connection_pool=pool)

lua1 = """
   redis.call("select", ARGV[1])
   return redis.call("get",KEYS[1])
"""
script1 = r.register_script(lua1)

lua2 = """
   redis.call("select", ARGV[1])
   local ret = redis.call("get",KEYS[1])
   redis.call("select", ARGV[2])
   return ret
"""
script2 = r.register_script(lua2)

print r.get("mykey")
print script2( keys=["mykey"], args = [1,0] )
print r.get("mykey"), "ok"
print
print r.get("mykey")
print script1( keys=["mykey"], args = [1] )
print r.get("mykey"), "misleading !!!"

Script lua1 naif:hanya memilih database yang diberikan sebelum mengembalikan nilainya. Penggunaannya menyesatkan, karena setelah dieksekusi, database saat ini yang terkait dengan koneksi telah berubah. Jangan lakukan ini.

Script lua2 jauh lebih baik. Dibutuhkan database target dan database saat ini sebagai parameter. Itu memastikan bahwa database saat ini diaktifkan kembali sebelum akhir skrip, sehingga perintah berikutnya yang diterapkan pada koneksi masih berjalan di database yang benar. Sayangnya, tidak ada perintah untuk menebak database saat ini dalam skrip Lua, jadi klien harus menyediakannya secara sistematis. Harap dicatat skrip Lua harus mereset database saat ini di akhir apapun yang terjadi (bahkan dalam kasus kesalahan sebelumnya), sehingga membuat skrip yang rumit menjadi rumit dan canggung.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. ConnectionMultiplexer.Hubungkan terputus saat menghubungkan ke server redis

  2. Menggunakan Predis, bagaimana cara SET (yaitu menyimpan) array asosiatif multidimensi?

  3. Tidak dapat memuat file atau rakitan System.Runtime.CompilerServices.Unsafe

  4. Kesalahan bidang pada objek 'target' pada bidang '':nilai ditolak []; kode [typeMismatch.target.,typeMismatch.,typeMismatch.java.util.Date,typeMismatch]

  5. Mencoba memulai redis dan resque scheduler dalam tugas menyapu