Tập lệnh EVAL sau sẽ thực hiện những gì bạn muốn:
local keys = redis.call('KEYS',KEYS[1])
for i,k in ipairs(keys) do
local res = redis.call('HKEYS',k)
for j,v in ipairs(res) do
if string.find(v,ARGV[1]) then
redis.call('HDEL',k,v)
end
end
end
Bạn cần gọi nó bằng cách cung cấp các thông số sau:
EVAL <script> 1 prefix:* cc_..
Xin lưu ý rằng nó chặn vòng lặp sự kiện Redis cho đến khi tập lệnh hoàn tất, vì vậy nó có thể đóng băng Redis trong một thời gian nếu bạn có một số lượng lớn khóa. Tính nguyên tử có một cái giá.
Cập nhật:
Nếu bạn không cần tính nguyên tử, thì tập lệnh sau sẽ tránh chặn Redis quá lâu (nhưng xin lưu ý, nó vẫn sẽ chặn nếu bạn có số lượng khóa toàn cầu lớn hoặc nếu một trong những đối tượng băm của bạn rất lớn:có không có cách nào để tránh điều này).
Tiền tố./redis-cli keys 'prefix:*' | awk '
BEGIN {
script = "local res = redis.call('\''HKEYS'\'',KEYS[1]); \
for j,v in ipairs(res) do \
if string.find(v,ARGV[1]) then \
redis.call('\''HDEL'\'',KEYS[1],v); \
end \
end"
}
{
printf "EVAL \"%s\" 1 %s cc_..\n", script, $1
}' | ./redis-cli
(đã thử nghiệm với bash)