Thường là một ý tưởng sai lầm khi đặt dữ liệu liên quan vào các cơ sở dữ liệu Redis khác nhau. Hầu như không có lợi ích gì so với việc xác định không gian tên bằng các quy ước đặt tên khóa (không có thêm chi tiết liên quan đến bảo mật, tính bền bỉ, quản lý hết hạn, v.v.). Và một nhược điểm lớn là khách hàng phải xử lý thủ công việc lựa chọn cơ sở dữ liệu chính xác, điều này rất dễ xảy ra với các khách hàng nhắm mục tiêu nhiều cơ sở dữ liệu cùng một lúc.
Bây giờ, nếu bạn vẫn muốn sử dụng nhiều cơ sở dữ liệu, có một cách để làm cho nó hoạt động với tập lệnh redis-py và Lua.
redis-py không xác định trình bao bọc cho lệnh SELECT (thường được sử dụng để chuyển đổi cơ sở dữ liệu hiện tại), do triển khai nhóm kết nối an toàn luồng cơ bản. Nhưng không có gì ngăn cản bạn gọi SELECT từ tập lệnh Lua.
Hãy xem xét ví dụ sau:
$ redis-cli
SELECT 0
SET mykey db0
SELECT 1
SET mykey db1
Tập lệnh sau hiển thị giá trị của mykey trong 2 cơ sở dữ liệu từ cùng một kết nối máy khách.
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 là ngây thơ:nó chỉ chọn một cơ sở dữ liệu nhất định trước khi trả về giá trị. Cách sử dụng của nó là sai lầm, bởi vì sau khi thực thi, cơ sở dữ liệu hiện tại được liên kết với kết nối đã thay đổi. Đừng làm điều này.
Script lua2 tốt hơn nhiều. Nó lấy cơ sở dữ liệu đích và cơ sở dữ liệu hiện tại làm tham số. Nó đảm bảo rằng cơ sở dữ liệu hiện tại được kích hoạt lại trước khi kết thúc tập lệnh, để lệnh tiếp theo được áp dụng trên kết nối vẫn chạy trong cơ sở dữ liệu chính xác. phải cung cấp nó một cách có hệ thống. Xin lưu ý rằng tập lệnh Lua phải đặt lại cơ sở dữ liệu hiện tại khi bất kỳ điều gì xảy ra (ngay cả trong trường hợp lỗi trước đó), vì vậy nó làm cho các tập lệnh phức tạp trở nên cồng kềnh và khó xử.