Tôi giả sử rằng bạn đang làm việc trên một hàng đợi , nơi bạn chèn 1000 mục tại một nơi và truy xuất chúng ở nhiều nơi theo thứ tự mà nó được chèn .
Bạn không thể đạt được nó với một lệnh duy nhất nhưng bạn có thể làm điều đó với 2 lệnh. Bạn có thể viết một script lua để biến chúng thành nguyên tử.
Lrange:http://redis.io/commands/lrange
Lrange list -100 -1
Điều này sẽ liệt kê cho bạn 100 phần tử đầu tiên trong danh sách. ở đây phần bù là -100. Lưu ý rằng điều này sẽ trả về các mục theo thứ tự ngược lại mà nó được chèn vào. Vì vậy, bạn cần đảo ngược vòng lặp để đảm bảo cơ chế hàng đợi.
Ltrim:http://redis.io/commands/ltrim
ltrim list 0 -101
Thao tác này sẽ cắt 100 phần tử đầu tiên trong danh sách. ở đây 101 là n + 1 vì vậy nó phải là 101. Ở đây bù đắp là 101
Viết chúng bên trong một khối lua sẽ đảm bảo cho bạn tính nguyên tử.
Để tôi cho bạn một ví dụ đơn giản.
Bạn chèn 100 phần tử vào một nơi duy nhất.
lpush list 1 2 3 .. 100
Bạn có nhiều khách hàng đang cố gắng truy cập khối lua này. Giả sử giá trị n của bạn là 5 ở đây. 1stclient tham gia và được chèn 5 phần tử đầu tiên.
127.0.0.1:6379> lrange list -5 -1
1) "5"
2) "4"
3) "3"
4) "2"
5) "1"
Bạn giữ chúng trong đối tượng lua của mình và xóa chúng.
127.0.0.1:6379> LTRIM list 0 -6
OK
trả chúng về mã của bạn, bây giờ kết quả bạn muốn là 1 2 3 4 5 nhưng những gì bạn nhận được là 5 4 3 2 1. Vì vậy, bạn cần đảo ngược vòng lặp và thực hiện thao tác.
Khi khách hàng tiếp theo đến, nó sẽ nhận được bộ giá trị tiếp theo.
127.0.0.1:6379> lrange list -5 -1
1) "10"
2) "9"
3) "8"
4) "7"
5) "6"
Bằng cách này, bạn có thể đạt được yêu cầu của mình. Hi vọng điêu nay co ich.
CHỈNH SỬA:
Tập lệnh Lua:
local result = redis.call('lrange', 'list','-5','-1')
redis.call('ltrim','list','0','-6')
return result