회사 업무상 시계열 데이터를 다룰 일이 많아서 , 메인 데이터베이스에 조회 과정 혹은 쿼리 요청시 부하가 많아 redis ts를 도입하게 되었다. 해당 redis에 시계열 데이터를 저장하고 해당 시계열 범위에 해당하는 데이터들을 조회하여 가공 및 집계 하여 필요한 데이터를 처리하는 업무가 있었다. 이렇게 해서 메인데이터베이스에 쿼리 부하를 줄이고, redis를 통해서 데이터 집계를 편하게 할 수 있었다.
실습은 redis-insight 혹은 redis-cli를 통해 테스트 해보면 된다.
TS.CREATE [key] RETENTION 60000(60sec) LABELS [태그 ...]
ex) TS.CREATE sensor:temperature RETENTION 60000 LABELS sensor_id 1 location room1
TS.ADD [key] [timestam] [value]
ex) TS.ADD sensor:temperature * 23.5 -> (*)기호는 현재 타임스탬프를 자동으로 추가한다.
TS.RANGE [key] [from] [to] FILTER_BY_TS [timestamp] -> From~ to 시계열 데이터 사이의 특정 timestamp의 데이터를 필터링
ex) TS.RANGE sensor:temperature 0 + FILTER_BY_TS 1672531200000 1672531220000
0 ,은 처음 +는 현재까지
FILTER_BY_VALUE 로도 값으로도 필터링이 가능하다.
redis-cli EVAL "
local results = redis.call('TS.RANGE', KEYS[1], ARGV[1], ARGV[2])
local sum = 0
local count = 0
for i, data in ipairs(results) do
sum = sum + tonumber(data[2])
count = count + 1
end
return sum / count
" 1 sensor:temperature 1672531200000 1672531800000