Redis Enterprise Release Notes


Enterprise 7.3.4 - 2022년 6월 7일(화)

ver 7.3.4 내용 정리

  1. Enterprise version 7.3.3과 Redis-6.2.7 합침(ent733에 redis-6.2.7 소스 반영) - 수정한 소스 파일 리스트
    redis-6.2.7\src
    redis-6.2.7\src\acl.c
    redis-6.2.7\src\blocked.c
    redis-6.2.7\src\cluster.c
    redis-6.2.7\src\server.h
    redis-6.2.7\src\server.c
    redis-6.2.7\src\monotonic.h
    redis-6.2.7\src\monotonic.c
    redis-6.2.7\src\db.c
    redis-6.2.7\src\tracking.c
    redis-6.2.7\src\debug.c
    redis-6.2.7\src\expire.c
    redis-6.2.7\src\geohash_helper.c
    redis-6.2.7\src\listpack.c
    redis-6.2.7\src\Makefile
    redis-6.2.7\src\module.c
    redis-6.2.7\src\networking.c
    redis-6.2.7\src\rdb.c
    redis-6.2.7\src\redis-benchmark.c
    redis-6.2.7\src\replication.c
    redis-6.2.7\src\rio.c
    redis-6.2.7\src\sentinel.c
    redis-6.2.7\src\t_list.c
    redis-6.2.7\src\t_stream.c
    redis-6.2.7\src\t_zset.c
    redis-6.2.7\src\tls.c
    redis-6.2.7\src\version.h
    redis-6.2.7\src\ziplist.c
    redis-6.2.7\src\zmalloc.c
    redis-6.2.7\src\scripting.c

    redis-6.2.7\deps\hiredis
    redis-6.2.7\deps\hiredis\alloc.c
    redis-6.2.7\deps\hiredis\alloc.h
    redis-6.2.7\deps\hiredis\hiredis.c

    redis-6.2.7\deps\lua
    redis-6.2.7\deps\lua\src
    redis-6.2.7\deps\lua\src\lapi.c
    redis-6.2.7\deps\lua\src\ldebug.c
    redis-6.2.7\deps\lua\src\lobject.h
    redis-6.2.7\deps\lua\src\ltable.c
    redis-6.2.7\deps\lua\src\lua.h
    redis-6.2.7\deps\lua\src\lvm.c

    deps를 수정했을 경우 전체 make를 다시해야 한다.
    make distclean
    make

Enterprise 7.3.3 - 2022년 6월 5일(일)

ver 7.3.3 내용 정리

  1. 휴지통 recyclebin 개발: 2022.05.27(Fri)~06.03(Fri)
    1) recyclebin.c 새로 만듬.
    2) rm 명령: 키를 휴지통에 넣는다. 기존 del alias rm은 사용하지 않는다.
      rmCommand() recyclebin.c
      Usage: rm key1 [key2 ...] -> multi-key
      휴지통에 같은 이름의 키가 있으면 삭제한다.
    3) reuse 명령: 휴지통의 키를 되살린다.
      reuseCommand() recyclebin.c
      Usage: reuse key1 [key2 ...] [replace] - multi-key
        replace option을 사용하면 DB에 같은 이름의 키가 있으면 지운다.
        replace option을 사용하지 않았을 경우 DB 같은 이름의 키가 있으면 되살리지 않는다.
    4) rmkeybin 명령: 휴지통의 키를 지운다.
      rmKeyRecyclebinCommand() recyclebin.c
      Usage: rmkeybin key1 [key2 ...] - multi-key
    5) flushrecyclebin 명령: 휴지통의 모든 키를 지운다.
      flushRecyclebinCommand() recyclebin.c
      Usage: flushrecyclebin
    6) flushrecyclebinall: 서버 내 모든 휴지통을 비운다.
      flushRecyclebinallCommand() recyclebin.c
    7) flush-recyclebin-spec-time "05:00" - redis.conf
      지정한 시각에 서버 내 모든 휴지통을 비운다.
      flushRecyclebinAll()
    8) recyclebin 명령: recyclebin 관련 정보 조회.
    9) rsql.c
    Usage:
        select * from recyclebin.*;
        select * from bin.key*;
        delete from recyclebin.*;
        delete from bin.*;
    RECYCLEBIN_TYPE 추가: 수정된 functions
        setObjType()
        rsqlFindTable()
        rsqlTabFirst()
        rsqlTabLast()
        rsqlTabNext()
        rsqlTabPrevious()
        rsqlTabCount()
        rsqlTabClear()
        rsqlTabDelete()
        valcntFunc()
        memoryFunc()
        typeFunc()
        encodingFunc()
        updatetimeFunc()
  2. rdb, aof loading count: 2022.06.05(Sun)
    1) rdb, aof loading 시 loading-count 마다 로그를 남긴다.
      redis.conf loading-count 추가
    2) server.h CONFIG_DEFAULT_LOADING_COUNT
    3) server.c server.loading_count
    4) config.c loading-count
    5) aof.c loadAppendOnlyFile()
    6) rdb.c rdbLoadRio()

Enterprise 7.3.2 - 2022년 5월 1일(일)

ver 7.3.2 내용 정리

  1. expire_keys = zset
    select 구현
  2. persist key member 작동하지 않은 오류 수정: expire.c persistCommand()
    update: 2022.03.31(Thu)
  3. expire_keys의 score가 제대로 바뀌지 않는 오류 수정: db.c setExpireMember()
    update: 2022.04.01(Fri)
  4. db 명령 - dbsizeCommand() db.c
    변경 전: keys=0, expire_keys=0,expire_members=0
    변경 후: total_keys=0, expires=0,members=0,keys=0
    update: 2022.04.17(Sun)
  5. select * from info.keyspace; key를 맞는 이름으로 변경, rsqlFindTable() rsql.c
    변경 전: 0) key|total_keys|string|list|set|zset|hash|stream|module|expire_keys|expire_members
    변경 후: 0) db|key|total_keys|string|list|set|zset|hash|stream|module|expires|members|keys
    info.commandstats: cmd
    info.clients: id
    info.statlog, slowlog, latencylog: datetime
    update: 2022.04.17(Sun)
  6. copy 명령 updatetime이 들어가지 않은 버그 수정.
    db.c copyCommand()
    update: 2022.05.01(Sun) - 근로자의 날.

Enterprise 7.3.1 - 2022년 3월 29일(화)

ver 7.3.1 내용 정리

  1. 2022.03.05(Sat) t_hash.c hlsCommand() 버그 수정
    addReplyMapLen(c,len*2); -> addReplyMapLen(c,len);
  2. redis-6.2.6과 합치기 완료.
    3일 소요.
  3. ent720에서 update_mstime을 mstime_t(long long:8바이트)에서 uint32_t(4바이트)로 수정하면서
    expire member가 실행(삭제)되지 않았다.
    db.c removeFromExpireMembers()에서 아래와 같이 now와 updatetime으로 분리해서 적용했다.
    long long now = mstime();
    uint32_t updatetime = time(NULL);

Enterprise 7.3.0 최종 - 2022년 2월 28일(월)

ver 7.3.0 내용 정리

  1. insert: column 수 제한 해결.
    1) column(컬럼) 수 제한: 2000 (SQLITE_MAX_COLUMN) 실제는 32676(hard limit)
    column 2100까지 테스트 했음.
    2) row(행) 수 제한: 1000 (multi-row) (SQLITE_MAX_EXPR_DEPTH)
    row 1100까지 테스트 했음.
  2. redis-benchmark 옵션 추가
    1) --hello: resp2일 경우 '#','^','!'를 처리하지 못해서 에러가 발생한다.
    hello 명령을 싫행해서 resp3로 설정한다.
    hello 명령 실행을 추가했으나 계속 Protocol error 에러가 발생해서
    networking.c addReplyTable/Row/Column()에서 구분자를 T/R/C로 고정했다.
    2) --ignoreerr: SQL select에서 key가 없으면 no such key 에러를 발생하고
    테스트가 중지된다. 테스트를 계속하기 위해서 만들었다.
  3. deps/hiredis/hiredis.c freeReplyObject()
    REDIS_REPLY_TABLE/ROW/COLUMN 추가
  4. info
    1) info clear 추가: config resetstat 명령과 동일하게 작동한다.
    2) info help 추가
    3) info server에서 REDIS_VERSION 표시
  5. db 명령: 전에 db info를 사용했는데 info를 생략하고 db만 사용해도 된다.
    db0:keys=0,string=0,list=0,set=0,zset=0,hash=0,stream=0,module=0

Enterprise 7.3.0 1차 - 2022년 2월 15일(화)

ver 7.3.0 내용 정리

  1. sql: insert 추가
    1) String: insert into string values ('key1','value2');
    2) List: insert into list values ('mylist','value1','value2');
    3) Set: insert into set values ('myset','value1','value2');
    4) ZSet: insert into zset values ('zset1',10,'value10',20,'value20');
    5) Hash: insert into hash values ('myhash1','field1','value1','field2','value2');
    6) Stream: insert into stream values ('skey1','*','field1',30,'field2',40);
    Multi-row: insert into string values ('key1','value1'),('key2','value2');
    Memory 테스트 완료.
  2. insert 성능
    - 값 1개 입력 시 성능 차이: 10배.
    - 값 20개 입력 시 성능 차이: 3배
    - 메모리 차이 없음. -> 정상.
    String
    for i in {1..10000}; do src/redis-ecli -p 7000 set key$i value$i; done -> 3.53us, 1.19mb -> 3.08mb
    for i in {1..10000}; do src/redis-ecli -p 7000 insert "insert into string values('key$i','value$i')"; done -> 26.19us, 1.19mb -> 3.07mb
    List
    for i in {1..10000}; do src/redis-ecli -p 7000 lpush mylist1 value$i; done -> 2.12us
    for i in {1..10000}; do src/redis-ecli -p 7000 insert "insert into list values('mylist2','value$i')"; done -> 25.15us
    Set
    for i in {1..10000}; do src/redis-ecli -p 7000 sadd myset1 value$i; done -> 1.17us
    for i in {1..10000}; do src/redis-ecli -p 7000 insert "insert into set values('myset2','value$i')"; done -> 24.29us
    ZSet
    for i in {1..10000}; do src/redis-ecli -p 7000 zadd zset1 $i value$i; done -> 3.58us 2.34mb
    for i in {1..10000}; do src/redis-ecli -p 7000 insert "insert into zset values('zset2',$i,'value$i')"; done -> 27.23us, 1.33mb -> 2.34mb
    Hash
    for i in {1..10000}; do src/redis-ecli -p 7000 hset myhash1 field$i value$i; done -> 2.14us, 1.33mb -> 2.05mb
    for i in {1..10000}; do src/redis-ecli -p 7000 insert "insert into hash values('myhash2','field$i','value$i')"; done -> 25.43us, 1.10mb -> 1.91mb
    Stream
    for i in {1..10000}; do src/redis-ecli -p 7000 xadd stream1 '*' field$i $i; done -> 4.40us, 1.19mb -> 1.44mb
    for i in {1..10000}; do src/redis-ecli -p 7000 insert "insert into stream values('stream2','*','field$i',$i)"; done -> 27.75us, 1.19mb -> 1.44mb
  3. column(컬럼) 수 제한
    컬럼은 키를 포함해서 126개까지 가능하다. 그 이상을 입력하면 이상해짐.

Enterprise 7.2.5 - 2022년 2월 3일(화)

ver 7.2.5 내용 정리

  1. redis-6.2.5와 병합
    1) 개발 기간: 2021년 9월 24일(금) 부터 2021년 12월 31일(금)까지 작업, 3개월 7일.
    순수 작업 일수로 51일 소요
    2) subquery 명령을 분리함.
    - string: set -> sets, append -> appends
    - list: lpush -> lpushs, rpush -> rpushs
    - set: sadd -> sadds
    - zset: zadd -> zadds
    - hash: hset -> hsets
    - stream: xadd -> xadds, xdel -> xdels
    - common: del -> dels, rm -> rms, persist -> persists
    3) Active-Active 2 nodes, 3 nodes 동기화 테스트 완료.
    - 2 노드 운영중 세 번째 노드 시작해도 동기화 잘됨.
  2. glob 출력이 중복해서 나오는 버그 수정.
    rsql.h SQLITE_LIKE_DOESNT_MATCH_BLOBS 정의해서 사용하는 것올 정함.
    이것을 정의하니 glob는 잘 나오는데, like가 출력이 나오지 않음.
    rsql.c void likeFunc() SQLITE_LIKE_DOESNT_MATCH_BLOBS 부분 실행 막았다. (주석 처리)
    2021.12.31(Fri) ent720에 반영되지 않음.
  3. redis-ecli 명령 처리 소요시간 표시.
    redis-cli.c void repl(void)에서 관련 부분 수정 .
    1) 1초 이상 걸리면 sec(초)로 표시.
    2) 1ms 이상 걸리면 ms(millisecond)로 표시
    3) 1ms 미만 걸리면 us(microsecond)로 표시
    :set timing on/off 명령 추가
    :set timing : toggle
    :set timing on : Display elapsed time
    :set timing off : No display elapsed time
    2022.01.03(Mon) ent720에 반영되지 않음.
  4. 쿼리 로그 설정 redis.conf에 추가
    1) redis.conf rsql-debug yes/no -> server.rsql_debug: SQL 실행 시 debug 로그 남김
    2) redis.conf rsql-debug-opcode yes/no -> server.rsql_debug_opcode: SQL 실행 시 opcode 로그 남김
    3) redis.conf rsql-debug-sql yes/no -> server.rsql_debug_sql: SQL 실행 시
    sql문장(1줄)과 메모리 사용량(1줄) 로그 남김
    4) redis.conf rsql-debug-mem yes/no -> server.rsql_debug_mem: SQL 실행 시 메모리 사용량 로그 남김
    config get/set 적용 가능
    문제 발생 시 쿼리 실행 계획을 확인하기 위해서 고객 사이트에서도 debug 로그를 볼 수 있다.
    이것은 rsql.c 로그에만 적용된다.
    개발/QA 서버는 rsql-debug-sql을 yes로 한다.
  5. ZSet: min(), max(), score 비교, value 비교 속도 획기적 개선 - 2022년 01월 14일(금)
    ZSet에서 min(), max(), score 비교, value 비교일 경우 index scan을 해야 한다.
    scoreIndex 추가: Non unique index, oneTable and allScoreZero==0, 2022.01.07(Fri)
    valueIndex 추가: Unique index, oneTable and allScoreZero==1, 2022.01.10(Mon)
    min(), max() 키를 하나만 지정했을 경우 min(score), max(score)는 바로 가져와야 한다.
    if (only_one_key) first node score, list node score
    score가 동일할 경우 min(value), max(value)도 바로 가져와야 한다.
    if (only_one_key && robj.same) first node value, list node value
    rsqlTabSeek() ZSET에서 do { } while(1) loop로 일일히 비교해서 값을 찾던 것을
    opcode를 고려하여
    skiplist에서는 zslFirstInRange(), zslLastInRange()를 사용하고
    ziplist에서는 zzlFirstInRange(), zzlLastInRange()를 사용하는 것으로 수정했다.
    이로써 100만건 데이터가 있는 zset5에서도 300~400us 쿼리 속도가 빨라졌다.
    select * from zset.zset5 where score =, >, >=, <, <=, in, between 확인 완료.
    많이 수정한 function
    1) rsqlFindTable(): scoreIndex, valueIndex 추가
    2) rsqlTabSeek(): ZSET 관련 부분 수정 - SeekGE/GT/LE/LT 관련
    3) rsqlTabIdxKeyCompare(): 기존 score(MEM_Int/Real) 부분 수정, value(MEM_Str/Blob) 추가 - OP_IdxGE/GT 관련
    4) rsqlTableColumnToIndex(): 인덱스 관련 추가
    5) valueIndex 생성 여부를 정하기 위해 allScoreZero() function을 추가했다.
    allScoreZero()은 Zset의 맨 앞/뒤 score가 같으면(의미상 모두 0) 1을 리턴하고 아니면 0을 리턴한다.
    1일 경우만 valueIndex를 만든다.
    그리고 valueIndex는 oneTable(from zset.myzset1)일 경우만 적용한다.
    from에 '*'를 사용하면 valueIndex를 만들지 않는다.
    6) columnZset2() 추가 : rsqlTabIdxKeyCompare()에서 MEM_Str/Blob 값 비교하려고 새로 만들었다.
    7) allocateCursor() 수정
    8) case OP_ReopenIdx: 수정

    select * from zset.myzset1 where score = 40; -> index scan 성공
    select * from zset.myzset1 where score >= 40; -> index scan 성공
    select * from zset.myzset1 where score < 40; -> index scan 성공
    select * from zset.myzset1 where score <= 40; -> index scan 성공

    select min(score) from zset.myzset1; -> index scan 성공
    select max(score) from zset.myzset1; -> index scan 성공
    select key, min(score) from zset.myzset1; -> index scan 성공
    select key, max(score) from zset.myzset1; -> index scan 성공
    select min(score),value from zset.myzset1; -> index scan 성공
    select max(score),value from zset.myzset1; -> index scan 성공

    select min(score) from zset.myzset1 where score > 30; -> index scan 성공
    select max(score) from zset.myzset1 where score >= 30; -> index scan 성공
    select max(score) from zset.myzset1 where score < 30; -> index scan 성공
    select max(score) from zset.myzset1 where score <= 30; -> index scan 성공
    select max(score) from zset.myzset1 where score between 20 and 40; -> index scan 성공

    select key,min(score) from zset.myzset* group by key; -> index 사용 못함. Full table scan
    select key,max(score) from zset.myzset* group by key; -> index 사용 못함. Full table scan

    zsetc1000s: 1000만개 member, allScoreZero=0 scoreIndex
    zsetc1000z: 1000만개 member, allScoreZero=1 valueIndex
    select min(score) from zset.zsetc1000s; (300us)
    select min(value) from zset.zsetc1000z; (263us)
    select * from zset.zsetc1000s where score = 417194852; (313us) -> index scan
    select * from zset.zsetc1000s where value = 'ele_000810073187'; (225us) -> direct search
    select * from zset.zsetc1000z where value = 'ele_000417416849'; (259us) -> index scan

  6. Set: select * from set.myset1 where value='value1'; -> direct search
    ZSet: select * from zset.myzset1 where value='value1'; -> direct search
    oneTable=1 and allScoreZero=1, valueIndex scan
    oneTable=1 and allScoreZero=0, direct search, 이 경우 value index가 없다.
    value equal(=) 조회일 경우 바로 찾는다(direct search).
    1) 분석 내용
    value == 'mem20' 비교는 OP_Ne에서 처리한다.
    OP_Ne에서 테이블 값으로 바로 찾아가려면 Tab을 받을 수 있어야 하는데
    Tab를 받을 수 있는 방법이 없다. OP_Ne는 p4에 COLLSEQ를 받는다.
    그래서 OP_Ne에서는 할 수 없다.
    방법을 생각해보니 opcode 순서가
    OP_Rewind -> OP_Column -> OP_Ne -> OP_Next 이다.
    valueEqualOnly == 1 이면 OP_Rewind에서 pTab->value로 커서 포인트를 가져다 놓는다.
    OP_Column에서 컬럼 값을 가져오고
    OP_Ne에서 비교한다.
    OP_Next에서 pTab->valueEqualOnly == 1 이면 종료시킨다.
    종료 방법은 SQLITE_DONE을 리턴한다.
    2) 결과
    setA 10만개 member
    select * from set.setA where value = 'ele_000463064363'; -> (276us) direct search
    select * from set.setA where value in ('ele_000463064363'); -> (280us) direct search

  7. 인덱스를 사용할 때는 eCurType에 인덱스를 받아야하는데 지금까지 테이블을 받았으므로
    근본적으로 맞지 않았다. (지금까지 억지로 맞추어온 것이다)
    CURTYPE_IDX, P4_INDEX 추가해서 eCurType에 인덱스를 받는 것으로 수정했다.
    이것은 위 5번, 6번에 적용된다. 2022년 01월 16일(일)

  8. Syntax error 해결: 2022년 01월 23일(일)
    rsql.c yy_syntax_error()에서 아래 부분이 주석처리되어 있던 것을 풀었다.
    if( TOKEN.z[0] ){
    rsqlErrorMsg(pParse, "syntax error");
    }else{
    rsqlErrorMsg(pParse, "incomplete input");
    }

  9. zrangebyscore myzset1 (10 (30 -> Invalid argument(s) 에러
    deps/hiredis/sds.c
    hi_sdssplitargsBracket()에서 subquery를 처리하기 위해 괄호를 열고 닫아 처리하는데
    zrangebyscore 명령은 괄호를 열기만하고 닫지 않기 때문에 에러가 발생함.
    괄호 다음에 alpha or space 일 경우만 괄호 묶음 처리를 하고 digit일 때는 넘어간다.
    isalpha(int c); isspace(int c);
    '(10' '(30' 이렇게 single/double quotes를 붙여서 사용해도 된다.
    zrangebylex myzset1 '(value10' '(value30' lex의 경우 반드시 single quotes를 붙여서 사용한다.
    2022년 02월 03일(목)

Enterprise 7.2.0 - 2021년 12월 24일(화)

ver 7.2.0 내용 정리

  1. 3노드 동기화 완료: 2노드를 동기화하기 데이터를 받는 중 세번째 노드를 시작해도
    완벽하게 동기화 된다. sync_clone_flag를 제대로 적용했다.
    1) from_clones에 없으면 처음 동기화를 시도하는 것이므로 1을 보내고
    from_clones에 있으면 0을 보낸다.
    받는 서버에서는 1이 오면 server.sync_clone_flag=1로 설정하고 마스터 클론으로
    부터 온 데이터를 요청한 서버에 보낸다.
    2) sync_clone_addr 메시지만 받았을 경우
    server.sync_clone_flag = 1 일 때 to_clones 개수와 cc->sync_clone_count 개수가
    같으면 server.sync_clone_flag를 0으로 설정한다.
    3) 2nodes일 때는 sync_clone_addr을 단독으로 받을 수 없으므로 아래 조건으로
    sync_clone_flag를 0로 만든다.
    len(from_clones)==1 and len(pending_clones)==0
  2. use-sql 적용: redisDb에 datatype별로 skiplist에 키를 저장하여 ls 명령,
    SQL(select, delete), 등을 사용하게 했는데, skiplist가 메모리를 많이 사용한다.
    약 2배 정도 더 메모리를 사용한다. 그래서 이 부분을 parameter로 선택하게 했다.
    yes: ls, SQL, info mem2/mem3, db info을 사용할 수 있다. 메모리를 더 많이 사용한다.
    no: 위 명령을 사용할 수 없다. 메모리를 원래 버전과 비슷하게 사용한다.
    server.use_sql yes/no default: no
  3. redisObject(robj) 수정: 32바이트에서 24바이트로 줄임. 원래 robj는 16바이트이다.
    robj는 실제 20바이트를 사용하지만 struct padding으로 24바이트를 사용한다.
    1) update_mstime을 mstime_t(long long:8바이트)에서 uint32_t(4바이트)로 수정했다.
    millisecond로 저장하던 시각을 second로 변경했다.
    2) rowid 제거: maxmemory가 설정되어 있고 메모리 부족시 value를 sqlite db
    file에 저장해서 메모리 부족 시에도 레디스를 사용할 수 있게 구현했는데
    이 기능을 요구하는 사용자가 없었다. 그리고 메모리도 더 사용해서 제거했다.
    persist.c를 Makefile에서 제거했다. persist.c에 있던 selectCommand() 등은
    rsql.c로 옮겼다.
  4. clone-backlog-size 적용: 그동안 repl-backlog-size를 같이 사용했는데, redis-6
    부터 같이 사용할 수 없게 config.c 가 수정되어 ent725에서 분리했다. ent720에도
    같이 적용한다. default 128mb이다.
  5. object 명령: time 옵션 추가
    object time key -> 키 생성 또는 값 최종 수정 시각을 리턴한다.
    형식: 'yyyy-mm-dd hh24:mi:ss'
    ls 명령에서 time을 조회할 수 있었으나 use-sql no를 적용하면 ls 명령을 사용할
    수 없게 때문에 timee을 조회할 수 있는 기능을 object 명령에 추가했다.
  6. redis-benchmark 옵션 추가: --usleep <microsecond>>
    usleep 옵션을 사용해서 속도를 조절할 수 있다. 단위는 microsecond이다.
  7. info memory, memory stats: clone_backlog_size 항목 추가.
    1) server.h struct redisMemOverhead clone_backlog 항목 추가.
    2) memory stats 명령에 clone.backlog 항목 추가.
  8. 미 사용 처리 server.h: CONFIG_DEFAULT_SQLITE_DBFILE, CONFIG_DEFAULT_TABLE
  9. AOF에 CD 대신 SELECT 명령을 사용하도록 수정했다.
    이유: redis community version과 호환성을 위해서이다.
    Enterprise version aof(text) 파일을 redis에서바로 올릴 수 있다.
  10. AOF 파일에 update_mstime이 없을 경우 0(1970년 1월 1일)을 넣었던 것을
    loading time을 넣는 것으로 수정했다.

Enterprise 7.1.8 - 2021년 11월 13일(토)

ver 7.1.8 내용 정리

  1. Full sync시에 tmp.rdb 파일을 dump.rdb 파일로 rename할 때 레디스가 설치된
    디렉토리와 data 디렉토리가 디스크 다른 파티션일 경우 rename에서 에러 발생.
    에러 메시지: Invalid cross-device link
    해결 방법: tmp.rdb 파일을 처음부터 data 디렉토리에 만든다.
    수정 파일: clone.c, version.h
    1) clone.c syncWithMasterClone() snprintf()

Enterprise 7.1.7 - 2021년 9월 30일(목)

ver 7.1.7 내용 정리

  1. 클론서버가 다운되었을 때 5분 동안 연결을 시도하다 중지하는 것을 1년으로
    변경했다. ELAPSE_YEAR 사용.
    연결 시도하고 실패하면 남기는 로그 레벨을 WARNING에서 DEBUG로 변경했다.
    로그 레벨이 DEBUG가 아니면 연결 시도, 연결 실패 로그를 남기지 않는다.
    수정 파일: version.h, server.h, clone.c

Enterprise 7.1.6 - 2021년 8월 31일(화)

ver 7.1.6 내용 정리

  1. license command 추가: 라이선스 파일이 올바른지 확인하는 명령
  2. license 만료일이 지나면 서버를 중지(shutdown)한다.
    license 만료일 30일 전부터 log에 license warning를 남긴다.
    license 만료일은 02:00에 check한다. 날짜가 지났으면 서버를 종료한다.
    예) 만료일이 2021년 12월 31일까지이면 2022년 1월 1일 02:00에 서버가 종료된다.

Enterprise 7.1.4 - 2021년 1월 17일(일)

ver 7.1.4 내용 정리

  1. delete from string.mystr1 or string.* -> coding and memory test ok
    1) where 조건 없는 쿼리.
  2. FindTable(): function(key) 메시지 추가.

Enterprise 7.1.3 - 2021년 1월 13일(수)

ver 7.1.3 내용 정리

  1. keyOnly, function 관련 버그 수정
    1) select key,round(min(memory)/1024/1024) from info.statlog; 서버 다운
    rsqlKeyOnly() 수정, rsqlKeyOnly2() 신규 생성
    2) SQLITE_CORRUPT_BKPT: message change
    database disk image is malformed -> The database may be corrupted.

Enterprise 7.1.2 - 2021년 1월 11일(월)

ver 7.1.2 내용 정리

  1. SQL Select Stream 지원
    1) select * from stream.sensor*;
    2) TabFirst(), TabLast(), TabNext(), TabPrevious() update
    3) columnStream() New function

Enterprise 7.1.1 - 2021년 1월 9일(토)

ver 7.1.1 내용 정리

  1. selectCommand() AOF에서 읽은 "select dbnum"을 처리할 수 있도록 수정. rsql.c
    1) AOF용 fakeClient 처리 추가
    2) 일반 client select 1 처리 추가
  2. keyOnly 수정.
    1) function이 중첩되어 있을 때 수정.
    2) 다른 opcode가 있을 때: 예) sum(memory(key))/1024 -> 수정.
    3) key function일 때 컬럼명을 key만 허용하게 수정.
    key function: valcnt,memory,type,encoding,ttl,pttl,idletime,updatetime
    다른 컬럼명을 사용하면 "no such key or any other problems" 메시지 표시.
  3. where key not in ('key1','key2','key3') 버그 수정
    1) rsqlVdbeRecordCompareWithSkip() Str도 Blob과 동등하게 비교하도록 수정.

Enterprise 7.1.0 - 2021년 1월 4일(월)

ver 7.1.0 내용 정리

  1. infodb
    1) select * from info.server INFO_SERVER 0
    2) select * from info.client INFO_CLIENT 1
    3) select * from info.clients INFO_CLIENTS 2
    4) select * from info.memory INFO_MEMORY 3
    5) select * from info.persistence or persist 단축어 INFO_PERSISTENCE 4
    6) select * from info.stats INFO_STATS 5
    7) select * from info.replication or repl 단축어 INFO_REPLICATION 6
    8) select * from info.cpu INFO_CPU 7
    9) select * from info.commandstats or cmds 단축어 INFO_COMMANDSTATS 8
    10) select * from info.clones (아직 미구현) INFO_CLONES 9
    11) select * from info.keyspace or keys 단축어 INFO_KEYSPACE 10
    12) select * from cluster.info INFO_CLUSTER_INFO 11
    13) select * from cluster.nodes INFO_CLUSTER_NODES 12
    14) select * from info.slowlog INFO_SLOWLOG 13
    15) select * from info.latencylog INFO_LATENCYLOG 14
    16) select * from info.statlog INFO_STATLOG 15
  2. flushinfodb 명령 추가
    1) infodb의 내용을 지운다.
    2) slowlog,latencylog,statlog는 날짜를 지정해서 지울 수 있다.
    flushinfodb statlog 2021-01-02 -> 이전 날짜 데이터(로그)를 삭제한다.
    3) 사용법: flushinfodb help 참조
  3. aof_rewrite_spec_time 시간에 3개 로그 3개월 전 데이터 지운다.
    1) infodbDelCron()

Enterprise 7.0.1 - 2021년 1월 2일(토)

ver 7.0.1 내용 정리

  1. select 명령 과거 버전 호환성을 위해 조건에 맞으면 기존 select 기능을 실행한다.
    1) cli에 dbnum이 표시되지는 않는다. cli에서는 cd 사용 권장.
    2) commandstat 통계는 select로 잡힌다.

Enterprise 7.0.0 - 2020년 12월 16일(수)

ver 7.0.0 내용 정리

  1. SQL Select 지원
    1) 2020년 2월 10일(월) version 7 작업 시작
    2) 파일: rsql.c
    3) ent-6.1.3 and ent7 merge
    4) 대상 datatype: String, List, Set, ZSet, Hash
    5) select * from string.*
    6) select * from list.*
    7) select * from set.*
    8) select * from zset.*
    9) select * from hash.*
    10) select * from string.* order by key desc
    11) select * from string.* limit 10
    12) select count(*) from string.*
    13) sum(),avg(),min(),max(),abs(),round()
    14) length(),upper(),lower(),left(),right(),mid(),replace(),instr(),trim()
    15) group_concat()
    16) select * from string.my* where value between 'A' and 'C'
    17) select * from string.my* where key like 'b%'
    18) select * from string.my* where key glob 'b%'
    19) IN, NOT IN, GROUP BY, GROUP BY HAVING
    20) UNION, INTERSECT, EXCEPT
    21) SUBQUERY: select * from string.* where key in (select value from set.myset1);
  2. log 10번에 한 번 제목 찍기.
    1) latency.c
    latencyLog() 수정
    latencyLoggingHeader() 생성.
    2) slowlog.c
    slowlogLog() 수정
    slowLoggingHeader() 생성

Enterprise 7.0.0-c2 - 2020년 4월 12일(일)

ver 7.0.0-c2 내용 정리

  1. Upgrade: AOF 파일 Rewrite를 시간(hh24:mm)을 지정해서 실행하게 한다.
    keyword: AOF 시간 지정
    1) redis.conf: Add parameter: auto-aof-rewrite-spec-time hh24:mm
    2) struct redisServer
    aof_rewrite_spec_time hh24:mm or NULL, 분 단위까지 지정한다.
    aof_rewrite_spec_hour int <- hh24, range 00-23, default -1
    aof_rewrite_spec_minute int <- mm, range 00-59, default -1
    aof_rewrite_last_run_time : 마지막으로 AOF rewrite가 실행된 시간을 저장한다.
    spec_time에 여러 번 실행되지 않게 하기 위해서.
    3) server.h struct redisServer
    4) version.h -> 6.0.2
    5) server.c serverCron(), initServerConfig()
    6) aof.c backgroundRewriteDoneHandler()
    7) config.c loadServerConfigFromString()
    configSetCommand() config set
    configGetCommand() config get
    rewriteConfig() config rewrite

Enterprise 7.0.0-c1 - 2020년 3월 19일(목)

ver 7.0.0-c1 내용 정리

  1. slowlog.c slowlogLog() strncat() 관련 수정.
    버그로 서버 다운 발생.

Enterprise 6.1.3 - 2020년 7월 18일(토)

ver 6.1.3 내용 정리

  1. 기간: 2020.06.26(Fri) ~ 2020.07.18(Sat)
  2. Monitor mode: redis-ecli.c
  3. 클론 로딩일 때 emptyDb() 적용
  4. 3노드 동기화 구현: sync_clone_flag, sync_clone_flag_time
    1) sync_clone_flag
    이 값은 동기화 요청을 한 클론으로 부터 받는다.
    클론이 처음 동기화를 요청하는 경우(from_clones==0)
    CLONECONF sync_clone_flag=1로 보낸다.
    요청을 받은 서버는 sync_clone_flag를 1로 설정한다.
    sync_clone_flag가 1로 설정되면 다른 마스터 클론으로 부터 온 데이터를
    다른 클론에 보내도록 propagation을 설정한다.
    2) sync_clone_flag_time
    sync_clone_flag가 1로 설정될 때 server.unixtime을 넣는다.
    설정 후 5분이 지나면 0으로 만든다.
    3) 2021년12월18일(토) 업데이트: 3노드 동기화가 제대로 구현되지 않았다.
    이유는 sync_clone_flag를 1에서 0으로 변경하는 시점이 정확하지 않았다.
    이 당시에는 이유를 알지 못했다. ent720 버전을 만들면서 정확하게 구현해서
    ent720부터는 3노드 동기호가 잘된다.
  5. sync-start-wait-time parameter: sync_start_wait_time
    서버 시작 후 이 시간 동안은 마스터 서버와 동기화를 위한 시간으로 일반 명령의
    실행을 막는다. default 60sec

Enterprise 6.1.2 - 2020년 6월 22일(일)

ver 6.1.2 내용 정리

  1. 기간: 2020.06.19(Fri) ~ 2020.06.22(Sun)

Enterprise 6.1.1 - 2020년 5월 25일(월)

ver 6.1.1 내용 정리

  1. redis.db 파일을 data-dir에 놓는다.
  2. flushall 명령을 실행하면 redis.db에 있는 redis 테이블을 drop하고 create한다. 그래서 모든 데이터를 지운다. nkeys, rowid도 0으로 초기화한다.
  3. 레디스 서버 시작할 때 AOF/RDB 로드 중 메모리가 부족하면 서버를 중지(exit)한다. 동기화(sync) 중 메모리가 부족한 경우에는 로드를 중지하고 서버 로그를 남긴다. 서버를 중지하지는 않는다.
  4. Startsync로 동기화 시 받은 rdb 파일이 maxmemory 보다 크면 로드하지 않는다. Maxmemory가 설정된 경우만 체크한다. readSyncBulkPayloadClone()
  5. Startsync 명령이 중복해서 실행되지 않도록 했다. server.startsync 서버 시작 시 redis.conf에 있는 startsync는 중복이 허용된다.
  6. Startsync 명령이 2분(120초) 동안 성공하지 못하면 취소한다. 서버 시작 시 redis.conf에 있는 startsync는 5분 동안 성공하지 못하면 취소한다.
  7. db info 명령에 server.nkeys, server.rowid 추가했다.
  8. stat.log에 server.nkeys, server.rowid 추가했다.
  9. serverCron() LL_VERBOSE, used_memory human 표시 추가했다.
  10. ls * value: redis 테이블에서 모든 데이터를 읽어오고 테이블에서는 삭제한다. ls * val: redis 테이블에서 모든 데이터를 읽오기만 한다.

ver 6.1.1 소스 정리

  1. server.h
    1. checkMemoryAndExitIfNeeded()에서 AOF/RDB를 구분하기 위해 만들었다.
      /* 2020.05.24(Sun) ver 6.1.1 Use checkMemoryAndExitIfNeeded() */
      #define AOF 0
      #define RDB 1
    2. struct redisServer
    3. 리턴값을 받기 위해 void를 int로 변경했다.
      int checkMemoryAndExitIfNeeded(int); /* 2020.05.22(Fri) ver 6.1.1 */
    4. 4) flushall에 redis table drop, create하기 위해 추가했다.
      /* 2020.05.24(Sun) ver 6.1.1 */
      int createTable(void);
      int dropTable(void);
  2. server.c
    1. VERBOSE 로그에서 5초마다 한번씩 찍히는 메시지에서 메모리 사용량(used_memory)를 humam으로 표시하기 위해 추가했다.
      /* 2020.05.23(Sun) ver 6.1.1 Charlie, 2 lines */
      char hmem[64];
      size_t zmalloc_used = zmalloc_used_memory();
    2. 위에서 zmalloc_used를 구했으므로 매번 zmalloc_used_memory() 호출하던 것을 이미 계산해 놓은 것을 사용하는 것으로 변경했다.
      /* 2020.05.23(Sun) ver 6.1.1 Modify zmalloc_used_memory() -> zmalloc_used */
      if (zmalloc_used > server.stat_peak_memory)
          server.stat_peak_memory = zmalloc_used;
    3. VERBOSE 로그에서 5초마다 한번씩 찍히는 메시지에서 human으로 표시한다.
      /* 2020.05.23(Sun) ver 6.1.1 bytesToHuman */ bytesToHuman(hmem,zmalloc_used); serverLog(LL_VERBOSE,     "%lu clients connected (%lu replicas), %s(%zu bytes) in use",     listLength(server.clients)-listLength(server.slaves),     listLength(server.slaves),hmem,zmalloc_used);
    4. initServerConfig()에 redisServer에 추가한 nkeys,startsync를 초기화한다.
      server.nkeys = 0; /* 2020.05.24(Sun) ver 6.1.1 Number of keys in redis.db file */
      server.startsync = 0; /* 2020.05.24(Sun) ver 6.1.1 startsync 여부, 증가 */
    5. stat.log serverInfoLog()에 redisServer의 nkeys,rowid를 추가했다.
      /* 2020.05.24(Sun) ver 6.1.1 Add nKeys,rowid */
      info = sdscatprintf(info,
      "%-21s Memory=%s,Rss=%s,Keys=%lld,Cpu=%ld,Clients=%ld,Cmd=%lld,Conn=%lld,
      nKeys=%ld,rowid=%ld", tmbuf,hmem,rss_hmem,keys,cpu,clients,server.stat_numcommands,server.stat_numconnections
      ,server.nkeys,server.rowid);
  3. clone.c
    1. 1) readSyncBulkPayloadClone()
      repl_transfer_size(받을 데이터(파일) 크기)가 maxmemory보다 크면 로드하지 않는다.
    2. 2) readSyncBulkPayloadClone() RDB load가 실패했을 경우 AOF를 rewrite하는 기능인데 여기서는 불필요하고 오히려 서버의 성능을 떨어뜨리린다.
      startsync했을 경우 메모리가 부족하면 load를 중지하고 에러를 리턴하는데 그때마다 AOF rewrite는 매우 부담되는 작업이다. 그리고 startsync는 실패하면 120회(2분) 반복 시도한다. 그때마다 AOF rewrite는 정말 필요없다.
    3. 3) startSyncCommand() startsync를 명령으로 입력해서 실행했을 경우 완료되면 다음 명령을 실행할 수 있다. 서버 시작 시 redis.conf에 있는 startsync 명령은 중복해서 실행 가능하다.
    4. 4) startSyncCommand() startsync가 정상적으로 시작되었으면 1로 설정한다.
    5. 5) endSyncCommand() endsync가 정상적으로 완료되었으면 0으로 설정한다.
    6. 6) cloneCron() 1초마다 실행되는 cloneCron에 startsync 증가를 추가했다. 이 값이 120이 넘으면 startsync를 취소한다.
    7. 7) cloneCron() 이것은 명령으로 startsync를 입력했을 경우에 2분이 적용된다. 서버 시작 시에 실행된 startsync는 5분이 지나면 취소된다.
  4. db.c
    1. 1) flushallCommand() flushall 명령을 실행하면 redis.db에 있는 redis 테이블을 삭제하고 다시 생성한다. 데이터를 모두 지웠으므로 파일에도 쓰레기를 남겨놓을 필요가 없다. sqlite에는 truncate table 명령이 없다.
    2. 2) keysCmdGate() restore_value 변수 추가 이것은 메모리 부족으로 redis.db 파일에 저장된 데이터를 모두 메모리로 올리기 위해서 사용한다.
      redis.db에 데이터가 있으면 background로 AOF rewrite, RDB save를 수행할 수 없다. 왜냐하면 parent와 child가 한 파일을 접근할 수 없기 때문이다. Child가 접근하면 database lock이 발생한다. 이것은 bgrewriteaof, bgsave 명령을 실행할 수 없고, startsync, replicaof 명령을 실행할 수 없음을 의미한다.
      Maxmemory를 증가시키고 ls * value 명령으로 모든 데이터를 메모리로 올리고 redis.db에서는 삭제한다. 그러면 위에서 설명한 background 명령을 실행할 수 있다. ls * val을 사용하면 redis.db에서 삭제하지 않는다. 값을 조회하는 용도일 때는 이 옵션을 사용한다.
    3. keysCmdGate() 'value', 'val'을 구분해서 처리한다.
    4. keysCmdGate() restore_value, restore_val 값에 따라 그에 맞는 function을 호출한다.
    5. dbsizeInfo() db info 명령에서 expire member 관련 표시 2개를 삭제했다. 너무 많은 숫자가 나와서 필요한 정보를 보는데 방해된다. 만든 나도 시간이 지나서 보면 뭘 의미하는지 잘 기억나지 않는다.
    6. dbsizeCommand() db info 명령에 nkeys,rowid 를 추가했다.
  5. evict.c
    1. checkMemoryAndExitIfNeeded() 아래 2가지 경우에 호출된다.
      aof.c: loadAppendOnlyFile() checkMemoryAndExitIfNeeded(AOF)
      rdb.c: rdbLoadRio() checkMemoryAndExitIfNeeded(RDB)
    2. 2) freeMemoryBySave()
      1) timelimit 100ms를 초과하면 서버 로그를 남긴다.
      2) DB에 키가 없는데 메모리가 부족할 경우 서버 로그를 남긴다.
          repl_backlog_size를 maxmemory보다 크게했을 경우 발생한다.
  6. rdb.c
    1. 1) rdbSaveRio() redis.db에 값이 없거나 child일 때는 에러 처리한다.
    2. 2) rdbSaveRio() 메모리 부족으로 에러가 발생해도 이미 로드한 데이터는 그대로 둔다. freeMemoryForLoading()는 사용하지 않는다.
  7. aof.c
    1. 1) loadAppendOnlyFile()
  8. 8. persist.c
    1. 1) openSqliteDb() redis.db 파일이 data-dir에 생기게 수정했다.
    2. 2) insertSql(), deleteSql() redis table에 insert하면 1 증가, delete하면 1 감소 이 숫자로 redis table에 있는 값의 개수를 알 수 있다.
    3. 3) restoreValNoDelete() Child이면 에러를 리턴한다. Child는 redis.db에 접근할 수 없다. 접근하도록 허용하면 database lock이 발생한다.

ver 6.1.1 테스트

  1. 서버 시작 시 maxmemory보다 큰 AOF/RDB 파일 로드
    결과: 서버 중지
  2. Startsync(동기화) 테스트1: 소스 서버 문제
    소스 서버에서 파일을 작성하지 못했을 경우
    6000번 서버가 메모리가 부족해서 redis.db에 데이터가 있는 경우
    6001번 서버에서 startsync를 실행하면
    6000번 서버는 background로 RDB 파일을 만드는 중 select하면 RDB 파일 작성을 중지하고 에러를 리턴한다.
    6001번 서버는 에러를 받고 동기화를 중지하고 1초 후에 다시 시도한다. 2분이 지나도 성공하지 못하면 동기화를 취소한다.
  3. Startsync(동기화) 테스트2: 타겟 서버 문제
    타겟 서버의 maxmemory보다 큰 파일을 받았을 경우
    6001번 서버는 파일을 받기 전에 사이즈를 확인해서 maxmemory보다 크면 동기화를 중지하고 1초 후에 다시 시도한다. 2분이 지나도 성공하지 못하면 동기화를 취소한다.
  4. Startsync(동기화) 테스트3: 타겟 서버 문제
    타겟 서버에서 RDB 파일을 로드 중 maxmemory를 초과하면 로드를 중지한다. 이미 로드된 데이터는 그대로 둔다.
  5. Startsync(동기화) 테스트4: 서버 시작 시
    5분 동안 성공하지 못하면 취소한다.

Enterprise 6.1.0 - 2020년 5월 22일(금)

메모리 한계를 넘다.

메모리 부족 시 key(data)를 지우지 않고 sqlite db에 저장해서 데이터 유실없이 계속 사용하게 했다.

2020년 2월 9일 최초 버전이 startsync 시 CPU 100%를 사용하는 문제가 있어서 재작업했다.
  1. redisObject에 rowid(8바이트)를 추가했다.
    • val->rowid를 구해서(++server.rowid) db에 id, value를 저장한다.
    • rowid가 0 보다 크면 value가 db에 저장되어있는 것이다.
    • db 저장 조건: val->rowid > 0 and val->ptr == NULL
    • Module와 String의 embstr, int는 대상에 제외한다.
  2. redisServer.rowid id를 구하는 전역변수이다.
    • insert 시마다 1씩 증가시킨다. int64
  3. table: redis id integer primary key, value blob
    • insert into redis(id,value) values(:id,:value);
    • select value from redis where id=:id;
    • delete from redis where id=:id;
    • key는 저장하지 않는다. key를 사용하면 int id보다 속도가 느리다.
  4. persist.c
    • opendb: redis.db를 오픈하고 redis table을 만든다. 서버 초기화 시 수행.
    • closedb: redis.db를 close한다.
    • insertSql: value를 insert한다.
    • selectSql: value를 select한다.
    • deleteSql: value를 delete한다.
    • saveVal: evict.c에서 메모리 부족 시 saveVal()를 호출해서 value를 db에 저장한다.
    • restoreVal: 대분분의 명령 실행 시 value가 db에 저장되어 있으면 select해서 원래대로 복원한다.
    • insertCommand: value를 db에 저장한다. 테스트용.
    • Module와 String의 embstr, int는 대상에 제외한다.
  5. serialize.c
    • rdb.c를 참조해서 만들었다.
    • table에 저장할 value를 serialize하는 목적이다.
    • Serialize해서 value에 저장한다. 그러므로 select value해도 그냥 볼 수 없다.
    • 기본적으로 rdb format과 같다.
    • Module은 대상에 제외한다.
  6. evict.c
    • 메모리 부족 시 제거 대상 키를 선별한다.
    • 선별된 key의 value를 sqlite db에 저장한다.
    • evictionPoolPopulate() 제외 대상 추가
    • freeMemoryIfNeeded() db에 저장하는 saveVal() 추가
  7. db.c
    • lookupKey: restoreVal() 추가 Value를 필요로하는 대부분의 명령에 적용된다.
    • dbSyncDelete: deleteSql() 추가 db에 저장된 key를 삭제할 때 사용된다. expire 일때도 같이 적용된다.
    • keysCmdGate에 rowid를 추가했다. lsCommand에 적용된다.
  8. server.c
    • initServerConfig: sqlite_dbfile, sqlitedb, table, iStmt, sStmt, dStmt, rowid 초기화
    • initServer: initSqliteDb() 추가.
    • prepareForShutdown: closeSqliteDb() 추가.
  9. object.c
    • createObject: rowid=0 초기화
    • OBJ_ENCODING_EMBSTR_SIZE_LIMIT 28로 변경
    • freeObject(): val->ptr만 free() 한다.
  10. sqlite.c 추가
  11. server.h
    • include "sqlite3.h"
    • redisObject int64_t rowid 추가
    • redisServer
      • sqlite_dbfile
      • sqlitedb
      • table
      • iStmt
      • sStmt
      • dStmt
      • rowid

Enterprise 6.0.4 - 2020년 5월 19일(월)

  1. startsync가 redis.conf에 있을 때는 IP:Port 자기 자신인지 체크하는 부분 추가
    startSyncCommand()에서는 이미 체크하고 있었다.
    config.c loadServerConfigFromString()

Enterprise 6.0.3 - 2020년 5월 17일(일)

  1. 마스터 클론과 연결이 끊긴지 5분이 지나면 클론을 삭제하고 더 이상 연결을 시도하지 않는다. serverLog()에 연결이 끊긴 경과 시간을 초로 표시했다. 1) clone.c cloneCron() 수정 2) clone.c readSyncBulkPayloadClone() server.current_clone = NULL; 추가 3) server.h ELAPSE_MIN1,2,5 추가 4) version.h -> 6.0.3
  2. networking.c checkClientOutputBufferLimits() 수정 client-output-buffer-limit parameter 관련해서 hard or soft limit를 초과했을 때 serverLog() 추가.
  3. config.c configCommand() 수정 config set 또는 resetstat 명령을 실행하면 로그를 남김. config set/resetstat serverLog() 추가
  4. config.c loadServerConfigFromString() 수정 redis.conf 파일에 auto-aof-rewrite-spec-time이 "" 또는 Null 일 때 처리

Enterprise 6.0.2 - 2020년 4월 11일(토)

  1. Upgrade: AOF 파일 Rewrite를 시간(hh24:mm)을 지정해서 실행하게 한다.
    keyword: AOF 시간 지정
    1. redis.conf: Add parameter: auto-aof-rewrite-spec-time hh24:mm
    2. struct redisServer
      aof_rewrite_spec_time hh24:mm or NULL, 분 단위까지 지정한다.
      aof_rewrite_spec_hour int <- hh24, range 00-23, default -1
      aof_rewrite_spec_minute int <- mm, range 00-59, default -1
      aof_rewrite_last_run_time : 마지막으로 AOF rewrite가 실행된 시간을 저장한다.
      spec_time에 여러 번 실행되지 않게 하기 위해서.
    3. server.h struct redisServer
    4. version.h -> 6.0.2
    5. server.c serverCron(), initServerConfig()
    6. aof.c backgroundRewriteDoneHandler()
    7. config.c loadServerConfigFromString()
      configSetCommand() config set
      configGetCommand() config get
      rewriteConfig() config rewrite

Enterprise 6.0.1 - 2020년 3월 19일(목)

  1. slowlog.c slowlogLog() strncat() 관련 수정. 2002.03.19(목) 버그로 서버 다운 발생.
  2. version.h 6.0.1로 수정.

Enterprise 6.0.0 - 2019년 12월 21일(토)

  1. version.h에 ENT_VERSION 추가. 2019.11.12(Tue)
    • server.c info()에 ENT_VERSION 추가
    • redis-cli.c help에 ENT_VERSION 추가 redis-cli를 redis-ecli로 수정
  2. serverLog() date format 변경: YYYY-mm-DD HH:MM:SS.fff. 2019.11.14(Thu)
    server.c 수정.
  3. Lua script: 2019.12.21(Sat)
    • command: update_mstime 적용
    • 클론에 전파 완료
    • Script list 명령 추가
    • Script info 명령 추가
    • Script get 명령 추가
  4. SET. 2020.01.03(Fri)
    • sls myset val* 명령 추가.
    • srm myset val* 명령 추가

Enterprise 2019.09.15 버전 Based on Redis 5.0.4 - 2019년 9월 15일(일)

  1. Slowlog 명령에 geth, log 옵션 추가
  2. Latency 명령에 latesth, historyh, log 옵션 추가
  3. Server 모니터링 정보(stat, slowlog, latency) 기록 기능 추가
  4. Log dir, Data dir 구분 설정 기능 추가
    Log directory: redis.log, stat.log, slowlog.log, latency.log
    Data directory: appendonly.aof, dump.rdb

Enterprise 2019.08 버전 Based on Redis 5.0.4 - 2019년 8월 31일(수)

  1. Expire Member 기능 추가
    1. EXPIRE key members: 멤버에 expire 기능 추가
      • 사용 가능 데이터타입: SET, ZSET, HASH
      • EXPIRE myset member 10 <seconds>
      • EXPIRE myset member1 member2 10 <seconds>
    2. EXPIRE members를 구현하기 위해 redisDb에 expire_keys(ZSET), expire_members(dict), expire_member_count(long long)를 추가했다.
    3. SETs: SADD에 expire member 기능 추가
      • SADD myset member ex 10 <seconds>
      • SADD myset member1 member2 ex 10 <seconds>: multi member 가능
      • SADD myset (get key) ex 10 <seconds>: subquery 가능
    4. ZSETs: ZADD에 expire member 기능 추가
      • ZADD myzset 10 mem1 ex 10 <seconds>
      • ZADD myzset 10 mem1 20 mem2 ex 10 <seconds>: multi member 가능
      • ZADD myzset (get key) ex 10 <seconds>: subquery 가능
    5. HASHs: HSET에 expire member 기능 추가
      • HSET myhash f1 v1 ex 10 <seconds>
      • HSET myhash f1 v1 f2 v2 ex 10 <seconds>: multi member 가능
      • HSET myhash (get key) ex 10 <seconds>: subquery 가능
    6. TTL key member: 멤버 ttl 조회 기능 추가
    7. PERSIST key member: 멤버단위로 설정된 만료시간을 삭제하는 기능 추가
    8. RENAME 명령: 내부적으로 만료시간이 설정된 멤버가 있는지 확인해서 db->expire_keys, db->expire_members에 키 이름 변경 기능 추가
    9. MOVE 명령: 내부적으로 만료시간이 설정된 멤버가 있는지 확인해서 해당 키를 이동하는 기능 추가
    10. 키가 삭제(DEL, EXPIRE)될 때 내부적으로 만료시간이 설정된 멤버가 있는지 확인해서 같이 삭제하는 기능 추가
    11. SREM 명령: 내부적으로 만료시간이 설정된 멤버가 있는지 확인해서 만료시간을 삭제하는 기능 추가
    12. ZREM 명령: 내부적으로 만료시간이 설정된 멤버가 있는지 확인해서 만료시간을 삭제하는 기능 추가
    13. HDEL 명령: 내부적으로 만료시간이 설정된 멤버가 있는지 확인해서 만료시간을 삭제하는 기능 추가
    14. SET, ZSET, HASH: 멤버를 조회할 때 expire된 멤버가 있는지 확인해서 있으면 삭제하는 기능 추가
    15. databasesCron()에 설정된 멤버를 삭제하는 기능 추가
    16. DBSIZE INFO 명령: expire member 정보 표시하는 기능 추가
  2. redis-cli: Enterprise 버전 표시
  3. redis-cli: --stat에 옵션 추가
    • -pagesize 추가: pagesize 지정
    • -t 추가: 출력에 일시(date,time) 추가
  4. SELECT 명령: index를 입력하지 않으면 0번 DB로 이동
  5. SERVER_INFO_INTERVAL: redis.conf에 추가
    • 서버 정보를 일정 시간 마다 redis.log 파일에 찍는다.
  6. SMEMBERS multi key 기능 추가
    • SMEMBERS key1 key2 가능
    • SMEMBERS key1 key2 sort 가능
  7. HGETALL, HKEYS, HVALS multi key 기능 추가
    • HGETALL key1 key2 가능
    • HKEYS key1 key2 가능
    • HVALS key1 key2 가능
  8. Redis-server 시작 직후(data load 후)와 종료할 때 redis.log에 dbsize 정보 기록

Enterprise 2019.06 버전 Based on Redis 5.0.4 - 2019년 6월 30일(일)

  1. ZRANGE JOIN 기능 추가
    1. 대상 명령
    2. ZSETs 키들과 조인할 수 있고, HMGET 명령으로 HASHs 키와 조인할 수 있고, GET 명령으로 STRINGs 키와 조인해서 값을 조회할 수 있습니다.
  2. Data Type별 키 관리 기능 추가
    1. 내부 처리
      • redisDb에 robj *datatypes[] 추가
      • 키가 추가될 때 저장: dbAdd()에 기능 추가
      • 키가 삭제될 때 삭제: dbSyncDelete(), dbAsyncDelete()에 기능 추가
      • flushdb(), flushall(): emptyDb()에 기능 추가
    2. KEYS 명령에 기능 추가
      • KEYS * string: String type의 키들만 조회
      • KEYS * list set: List와 set type의 키들을 조회
    3. DBSIZE INFO 명령에 data type별 키 개수 조회 기능 추가
  3. Subquery 기능 추가
    1. Subquery가 가능한 명령과 subquery로 사용 가능한 명령
      * 사용 예) SET key (GET key1)
      • SET: GET, LPOP, RPOP, LINDEX, LRANGE, HGET
      • APPEND: GET, MGET, LPOP, RPOP, LINDEX, LRANGE, SMEMBERS, SUNION, SINTER, SDIFF, ZRANGE, ZREVRANGE, HGET, HMGET, HKEYS, HVALS, HGETALL
      • LPUSH: GET, MGET, LPOP, RPOP, LRANGE, SMEMBERS, SUNION, SINTER, SDIFF, ZRANGE, ZREVRANGE, HGET, HMGET, HKEYS, HVALS, HGETALL
      • RPUSH: GET, MGET, LPOP, RPOP, LRANGE, SMEMBERS, SUNION, SINTER, SDIFF, ZRANGE, ZREVRANGE, HGET, HMGET, HKEYS, HVALS, HGETALL
      • SADD: GET, MGET, LPOP, RPOP, LRANGE, SMEMBERS, SUNION, SINTER, SDIFF, ZRANGE, ZREVRANGE, HGET, HMGET, HKEYS, HVALS, HGETALL
      • ZADD: GET, MGET, LPOP, RPOP, LRANGE, SMEMBERS, SUNION, SINTER, SDIFF, ZRANGE, ZREVRANGE, HGET, HMGET, HKEYS, HVALS, HGETALL, KEYS
      • HSET: GET, MGET, HGET, HMGET, HGETALL
      • XADD: HGETALL, ZRANGE, ZREVRANGE
      • DEL: GET, MGET, LPOP, RPOP, LRANGE, SMEMBERS, SUNION, SINTER, SDIFF, ZRANGE, ZREVRANGE, HGET, HMGET, HKEYS, HVALS, HGETALL, KEYS
      • UNLINK: GET, MGET, LPOP, RPOP, LRANGE, SMEMBERS, SUNION, SINTER, SDIFF, ZRANGE, ZREVRANGE, HGET, HMGET, HKEYS, HVALS, HGETALL, KEYS
  4. 추가된 명령
    • LREVRANGE: LIST에서 오른쪽에서 왼쪽으로 조회, 소트 기능
    • ZISMEMBER: ZSET에서 멤버가 있는지 확인
  5. KEYS 명령에 많은 옵션 추가
  6. LRANGE 명령에 소트기능 추가
  7. LINSERT 명령에 인덱스로 특정 위치에 데이터 넣는 기능 추가
  8. LREM 명령에 인덱스로 값을 삭제하는 기능 추가
  9. SMEMBERS 명령에 소트 기능 추가
  10. SUNION, SINTER, SDIFF 명령에 소트 기능 추가
  11. XRANGE, XREVRANGE 명령에 필드명으로 조회하는 기능 추가

Email 답글이 올라오면 이메일로 알려드리겠습니다.

혹시 처음이세요?
레디스게이트에는 레디스에 대한 많은 정보가 있습니다.
레디스 소개, 명령어, SQL, 클라이언트, 서버, 센티널, 클러스터 등이 있습니다.
혹시 필요한 정보를 찾기 어려우시면 redisgate@gmail.com로 메일 주세요.
제가 찾아서 알려드리겠습니다.
 
close
IP를 기반으로 보여집니다.