redis Timeseries

현종's Dev·2024년 12월 30일
0

개요

회사 업무상 시계열 데이터를 다룰 일이 많아서 , 메인 데이터베이스에 조회 과정 혹은 쿼리 요청시 부하가 많아 redis ts를 도입하게 되었다. 해당 redis에 시계열 데이터를 저장하고 해당 시계열 범위에 해당하는 데이터들을 조회하여 가공 및 집계 하여 필요한 데이터를 처리하는 업무가 있었다. 이렇게 해서 메인데이터베이스에 쿼리 부하를 줄이고, redis를 통해서 데이터 집계를 편하게 할 수 있었다.

redis TimeSeries

  • 타임스탬프 기반의 데이터를 저장할 수 있다.
  • 집계 및 연산이 가능하다 -> lua 언어로 추가적으로 가능
  • 시계열 데이터를 일정 retention을 주고 저장이 가능하고, 일정 범위를 조회할 수 있다. 그룹화 및 필터링이 가능하다.
  • 데이터 필터링을 위한 태그 지정이 가능하다.

redis stack server 설치

  • redis timeseries는 redis 추가 모듈로 redis stack를 설치하여 실행하여야한다.

시계열 데이터 쿼리

실습은 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 로도 값으로도 필터링이 가능하다. 
  • 집계 같은경우에는 AGGREGATION으로도 가능하지만, Lua를 통해 간단하게 스크립트를 작성해서도 가능하다.
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

추가

  • redis timeseries 말고도 추가적인 모듈을 사용하여 실제 업무에서도 도입을 해보고 테스트를 진행하고 있다. 아무래도 시계열 데이터를 다루는 업무다보니 많은 데이터 처리가 필요하고 데이터베이스에 부하가 가기도 해서 부하를 줄이기 위해 레디스 모듈을 사용해보고 있다. 문서를 더 찾아보면서 확인해보면서 고도화가 필요할 것 같다.
profile
Dev, Back

0개의 댓글