Скрипт Redis для очистки памяти - PullRequest
0 голосов
/ 17 февраля 2020

Можно ли создать для Redis скрипт, который flu sh его памяти, когда он выше определенного значения? В моем конкретном случае c я хочу грипп sh, когда объем памяти превышает 90%. Как лучше всего использовать скрипт bash или скрипт Lua?

Ответы [ 2 ]

1 голос
/ 18 февраля 2020

Я бы использовал скрипт Lua, так как он будет работать быстрее, атомарно, и было бы легко использовать как из redis-cli, так и из любого кода приложения.

Здесь скрипт Lua для получения используемая память и maxmemory, процент и заполнитель действия. Для иллюстрации используются MEMORY STATS и INFO memory.

MEMORY STATS приносит структурированную информацию, но не включает maxmemory или total_system_memory, как INFO memory. CONFIG GET не допускается из Lua скриптов.

local stats = redis.call('MEMORY', 'STATS')
local memused = 0
for i = 1,table.getn(stats),2 do
    if stats[i] == 'total.allocated' then
        memused = stats[i+1]
        break
    end
end
local meminfo = redis.call('INFO', 'memory')
local maxmemory = 0
for s in meminfo:gmatch('[^\\r\\n]+') do
    if string.sub(s,1,10) == 'maxmemory:' then
        maxmemory = tonumber(string.sub(s,11))
    end
end
local mempercent = memused/maxmemory
local action = 'No action'
if mempercent > tonumber(ARGV[1]) then
    action = 'Flush here'
end
return {memused, maxmemory, tostring(mempercent), action}

Использовать как:

> EVAL "local stats = redis.call('MEMORY', 'STATS') \n local memused = 0 \n for i = 1,table.getn(stats),2 do \n     if stats[i] == 'total.allocated' then \n     memused = stats[i+1] \n break \n end \n end \n local meminfo = redis.call('INFO', 'memory') \n local maxmemory = 0 \n for s in meminfo:gmatch('[^\\r\\n]+') do \n     if string.sub(s,1,10) == 'maxmemory:' then \n     maxmemory = tonumber(string.sub(s,11)) \n end \n end \n local mempercent = memused/maxmemory \n local action = 'No action' \n if mempercent > tonumber(ARGV[1]) then \n     action = 'Flush here' \n end \n return {memused, maxmemory, tostring(mempercent), action}" 0 0.9
1) (integer) 860264
2) (integer) 100000000
3) "0.00860264"
4) "No action"
0 голосов
/ 18 февраля 2020

Это способ получения выделенной памяти redis-cli -h 1.2.3.4 -p 6379 memory stats | sed -n 4p. Теперь легко создать bash скрипт

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...