Giải pháp là sử dụng tập lệnh Lua:
local time = redis.call('TIME')
local ts = time[1]..string.format('%06d', time[2])
return redis.call('ZADD', KEYS[1], ts, ARGV[1])
Ở đây chúng tôi sử dụng Redis TIME
yêu cầu. Lệnh trả về:
- thời gian unix tính bằng giây
- micro giây
Vì vậy, chúng ta có thể nối hai thứ này và sử dụng dấu thời gian micro giây. Chúng ta cần xóa bớt phần micro giây.
Vì các tập hợp được sắp xếp phù hợp với giá trị số nguyên lên đến 2 ^ 53, nên dấu thời gian của chúng tôi là an toàn cho đến năm 2255.
Đây là Redis-Cluster an toàn vì chúng tôi lưu trữ trong một khóa. Để sử dụng nhiều khóa, hãy đảm bảo đặt chúng trên cùng một nút bằng cách sử dụng thẻ băm nếu bạn muốn so sánh dấu thời gian.
Bạn có thể sửa đổi tập lệnh để sử dụng độ phân giải thấp hơn micro giây.
Đây EVAL
lệnh, khóa truyền đơn giản và giá trị làm đối số, không cần tạo nhóm đã sắp xếp trước:
EVAL "local time = redis.call('TIME') local ts = time[1]..string.format('%06d', time[2]) return redis.call('ZADD', KEYS[1], ts, ARGV[1])" 1 ssetKey myVal
Như mọi khi, bạn có thể muốn tải tập lệnh và sử dụng EVALSHA
.
> SCRIPT LOAD "local time = redis.call('TIME') local ts = time[1]..string.format('%06d', time[2]) return redis.call('ZADD', KEYS[1], ts, ARGV[1])"
"81e366e422d0b09c9b395b5dfe03c03c3b7b3bf7"
> EVALSHA 81e366e422d0b09c9b395b5dfe03c03c3b7b3bf7 1 ssetKey myNewVal
(integer) 1
Một lưu ý trên phiên bản Redis. Nếu bạn đang sử dụng:
- Phiên bản Redis trước 3.2:xin lỗi, bạn không thể sử dụng
TIME
(lệnh không xác định) và sau đó viết bằngZADD
. - Phiên bản Redis lớn hơn 3.2 nhưng <5.0:Thêm
redis.replicate_commands()
trên đầu tập lệnh. Xem Scripts như một chức năng thuần túy - Redis 5.0 trở lên:bạn giỏi.