INSERT Introduction


동영상 설명은 아래에 있습니다.

형식: INSERT INTO DATATYPE VALUES('KEY','VALUE')
  예  : INSERT INTO STRING VALUES('KEY','VALUE')

STRING 입력

  • String key, value를 입력합니다. insert into string values('key','value')
  • 컬럼 명은 지정하지 않습니다. insert into string (key,value) values('key','value')
    이하 다른 datatype에도 동일하게 적용됩니다.
  • 1 row(key, value) 입력: insert into string values('key','value')
  • 여러 row 입력: insert into string values('key2','value2'), ('key3','value3'), ('key04','value4')
  • 기존 키가 있으면 덮어씁니다(overwrite). 이것은 SET 명령의 작동과 동일합니다.
  • Multi-row(여러 개 key, value 쌍 입력)은 1000까지 가능합니다. 이것은 MSET 명령의 작동과 동일합니다. multi-row 1000개까지는 이하 다른 datatype에도 동일하게 적용됩니다.

Example

명령>insert into string values('key01','value1');   opcode
결과>1 inserted
명령>insert into string values('key02','value2'), ('key03','value3'), ('key04','value4');   opcode
결과>3 inserted

컬럼 개수 오류

Example

명령>insert into string values('key04');
결과>ERR table string has 2 columns but 1 values were supplied
명령>insert into string values('key04','value1','value2');
결과>ERR table string has 2 columns but 3 values were supplied

LIST 입력

  • List key, value를 입력합니다. insert into list values('mylist1','value1' [,'value2'])
  • 1 row(key, value) 입력: insert into list values('mylist1','value1','value2')
    이것은 LPUSH 명령의 작동과 동일합니다.
    Column(컬럼)은 key를 포함해서 32,676개까지 가능합니다.
    이하 다른 datatype에도 동일하게 적용됩니다.
  • 여러 row 입력: insert into list values('mylist2','value1','value2'), ('mylist3','value1','value2')
    여러 row 입력 시 컬럼 갯수는 동일해야 합니다. 이하 다른 datatype에도 동일하게 적용됩니다.

Example

명령>insert into list values('mylist1','value1','value2');   opcode
결과>1 inserted
명령>insert into list values('mylist2','value1','value2'), ('mylist3','value1','value2');   opcode
결과>2 inserted

SET 입력

  • Set key, value를 입력합니다. insert into set values('myset1','value1' [,'value2'])
  • 1 row(key, value) 입력: insert into set values('myset1','value1','value2')
    이것은 SADD 명령의 작동과 동일합니다.
  • 여러 row 입력: insert into set values('myset2','value1','value2'), ('myset3','value1','value2')

Example

명령>insert into set values('myset1','value1','value2');   opcode
결과>1 inserted
명령>insert into set values('myset2','value1','value2'), ('myset3','value1','value2');   opcode
결과>2 inserted

ZSET 입력

  • ZSet key, score, value를 입력합니다. insert into zset values('zset1', 23.5, 'value1' [, 25.7, 'value2'])
  • 1 row(key, score, value) 입력: insert into zset values('zset1', 23.5, 'value1', 36.7, 'value2')
    이것은 ZADD 명령의 작동과 동일합니다.
  • 여러 row 입력: insert into zset values('zset2', 23.5, 'value1'), ('zset3', 36.7, 'value2')

Example

명령>insert into zset values('zset1', 23.5, 'value1', 36.7, 'value2');   opcode
결과>1 inserted
명령>insert into zset values('zset2', 23.5, 'value1'), ('zset3', 36.7, 'value2');   opcode
결과>2 inserted

Score(스코어) 오류

Example

명령>insert into zset values('zset4','AAA','value1');
결과>ERR value(score) is not a valid float

HASH 입력

  • Hash key, field, value를 입력합니다.
    insert into hash values('myhash1', 'field1', 'value1' [,'field1', 'value1'])
  • 1 row(key, field, value) 입력: insert into hash values('myhash1', 'field1', 'value1', 'field2', 'value2')
    이것은 HSET 명령의 작동과 동일합니다.
  • 여러 row 입력: insert into hash values('myhash2', 'field1', 'value1'),('myhash3', 'field1', 'value1')

Example

명령>insert into hash values('myhash1', 'field1', 'value1', 'field2', 'value2');   opcode
결과>1 inserted
명령>insert into hash values('myhash2', 'field1', 'value1'),('myhash3', 'field1', 'value1');   opcode
결과>2 inserted

STREAM 입력

  • Stream key, id, field, value를 입력합니다.
    insert into stream values('sensor-1', '*', 'field1', 'value1')
    id는 *만 가능합니다.
    value에 숫자 입력 가능합니다.
  • 1 row(key, id, field, value) 입력: insert into stream values('sensor_1', '*', 'field1', 'value1' [,'field2', 'value2'])
    이것은 XADD 명령의 작동과 동일합니다.
  • 여러 row 입력: insert into stream values('sensor_2', '*', 'field1', 'value1'), ('sensor-3', '*', 'field1', 50.7)

Example

명령>insert into stream values('sensor_1', '*', 'field1', 'value1', 'field2', 'value2');   opcode
결과>1 inserted
명령>insert into stream values('sensor_2', '*', 'field1', 'value1'), ('sensor_3', '*', 'field1', 50.7);   opcode
결과>2 inserted

Value에 입력 가능한 것들

숫자 계산 결과: 10+20, 10*20

  • insert into string values('key05',10+20); -> 30   opcode
  • insert into string values('key06',10*20); -> 200   opcode

Function 사용

  • insert into string values('key07', min(10,20)); -> 10   opcode
  • insert into string values('key08', max(10,20)); -> 20   opcode
  • insert into string values('key09', round(12.675,1)); -> 12.7   opcode
  • insert into string values('key10', upper('value')); -> 'VALUE'   opcode
  • insert into string values('key11', trim(' value ')); -> 'value'   opcode
  • insert into string values('key12', left('redisgate',5)); -> 'redis'   opcode
  • insert into string values('key13', 'AAA'||'BBB'); -> 'AAABBB'   opcode
  • insert into string values('key14', date('now','localtime')); -> '2022-02-18'   opcode
  • insert into string values('key15', datetime('now','localtime')); -> '2022-02-18 13:41:18'   opcode
  • insert into string values('key16', strftime('%Y-%m-%d %H:%M:%S','now','localtime'));   opcode
    -> '2022-02-18 13:41:22'

동영상 설명

Redis SQL Insert


Performance 성능


Redis-benchmark 성능

Datatype명령Cmds per sec SQL INSERT
(Cmds per sec)
비교
STRINGSET106,31542,394 40%
LISTLPUSH 121,59551,106 42%
SETSADD 121,09452,731 44%
ZSETZADD 119,37442,981 36%
HASHHSET 119,27450,836 43%
합계 587,652240,048 41%
  • Redis-benchmark로 redis 원래 명령과 insert를 각각 10만회 입력, 실행 시간 비교
  • Redis 원래 명령에 비해 insert가 평균 41% 성능이 나온다.

STRING

  • SET: src/redis-benchmark -p 7000 -c 10 -n 1000000 -r 1000000 set keyA___rand_int__ value___rand_int__
    1000000 requests completed in 9.41 seconds, 106315.12 requests per second
  • INSERT: src/redis-benchmark -p 7000 -c 10 -n 1000000 -r 1000000 insert "insert into string values ('keyB___rand_int__','value___rand_int__')"
    1,000,000 requests completed in 23.59 seconds, 42394.44 requests per second

LIST

  • LPUSH: src/redis-benchmark -p 7000 -c 10 -n 1000000 -r 1000000 lpush mylist1 value___rand_int__
    1000000 requests completed in 8.22 seconds, 121595.33 requests per second
  • INSERT: src/redis-benchmark -p 7000 -c 10 -n 1000000 -r 1000000 insert "insert into list values ('mylist2','value___rand_int__')"
    1000000 requests completed in 19.57 seconds, 51106.46 requests per second

SET

  • SADD: src/redis-benchmark -p 7000 -c 10 -n 1000000 -r 1000000 sadd myset1 value___rand_int__
    1000000 requests completed in 8.26 seconds, 121094.69 requests per second
  • INSERT: src/redis-benchmark -p 7000 -c 10 -n 1000000 -r 1000000 insert "insert into set values ('myset2','value___rand_int__')"
    1000000 requests completed in 18.96 seconds, 52731.49 requests per second

ZSET

  • ZADD: src/redis-benchmark -p 7000 -c 10 -n 1000000 -r 1000000 zadd zset1 __rand_int__ value___rand_int__
    1000000 requests completed in 8.38 seconds, 119374.48 per second
  • INSERT: src/redis-benchmark -p 7000 -c 10 -n 1000000 -r 1000000 insert "insert into zset values ('zset2', __rand_int__, 'value___rand_int__')"
    1000000 requests completed in 23.27 seconds, 42981.17 requests per second

HASH

  • HSET: src/redis-benchmark -p 7000 -c 10 -n 1000000 -r 1000000 hset myhash1 field___rand_int__ value___rand_int__
    1000000 requests completed in 8.38 seconds, 119274.81 per second
  • INSERT: src/redis-benchmark -p 7000 -c 10 -n 1000000 -r 1000000 insert "insert into hash values ('myhash2', 'field___rand_int__', 'value___rand_int__')"
    1000000 requests completed in 19.67 seconds, 50836.26 per second

Redis 내부 처리 시간 성능

Datatype구분개수 성능
StringSET 13.58us
INSERT 126.19us
MSET 1020.01us
INSERT 10 52.39us
ListLPUSH 12.12us
INSERT 125.15us
SetSADD 11.17us
INSERT 124.29us
SADD 2010.94us
INSERT 2039.71us
ZSetZADD 13.58us
INSERT 127.23us
ZADD 2019.61us
INSERT 2055.37us
HashHSET 12.14us
INSERT 125.43us
StreamXADD 14.40us
INSERT 127.75us

각각 1만회 실행 평균 소요 시간(단위: us(microsecond))

  • 1개 key, value 입력 시 레디스 원래 명령 평균 시간 2.8us, insert 평균 시간 26.0us -> 약 9.2배 차이
  • 10 or 20개 value 입력 시 레디스 원래 명령 평균 시간 16.9us, insert 평균 시간 49.2us -> 약 2.9배 차이

String

  • for i in {1..10000}; do src/redis-ecli -p 7000 set key$i value$i; done -> 3.53us
  • for i in {1..10000}; do src/redis-ecli -p 7000 insert "insert into string values('key$i','value$i')"; done -> 26.19us
  • 10개 key, value 입력
  • for i in {1..10000}; do src/redis-ecli -p 7000 mset keyA$i valueA$i keyB$i valueB$i keyC$i valueC$i keyD$i valueD$i keyE$i valueE$i keyF$i valueF$i keyG$i valueG$i keyH$i valueH$i keyI$i valueI$i keyJ$i valueJ$i; done -> 20.01us
  • for i in {1..10000}; do src/redis-ecli -p 7000 insert "insert into string values('keyA$i','valueA$i'),('keyB$i','valueB$i'),('keyC$i','valueC$i'),('keyD$i','valueD$i'),('keyE$i','valueE$i'),('keyF$i','valueF$i'),('keyG$i','valueG$i'),('keyH$i','valueH$i'),('keyI$i','valueI$i'),('keyJ$i','valueJ$i')"; done -> 52.39us

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
  • 20개 value 입력
  • for i in {1..10000}; do src/redis-ecli -p 7000 sadd myset1 AAA$i BBB$i CCC$i DDD$i EEE$i FFF$i GGG$i HHH$i III$i JJJ$i AAX$i BBX$i CCX$i DDX$i EEX$i FFX$i GGX$i HHX$i IIX$i JJX$i; done; -> 10.94us
  • for i in {1..10000}; do src/redis-ecli -p 7000 insert "insert into set values('myset2','AAA$i','BBB$i','CCC$i','DDD$i','EEE$i','FFF$i','GGG$i','HHH$i','III$i','JJJ$i', 'AAX$i','BBX$i','CCX$i','DDX$i','EEX$i','FFX$i','GGX$i','HHX$i','IIX$i','JJX$i')"; done; -> 39.71us

ZSet

  • for i in {1..10000}; do src/redis-ecli -p 7000 zadd zset1 $i value$i; done -> 3.58us
  • for i in {1..10000}; do src/redis-ecli -p 7000 insert "insert into zset values('zset2',$i,'value$i')"; done -> 27.23us
  • 20개 score, value 입력
  • for i in {1..10000}; do src/redis-ecli -p 7000 zadd zset1 $i AAA$i $i BBB$i $i CCC$i $i DDD$i $i EEE$i $i FFF$i $i GGG$i $i HHH$i $i III$i $i JJJ$i $i AAX$i $i BBX$i $i CCX$i $i DDX$i $i EEX$i $i FFX$i $i GGX$i $i HHX$i $i IIX$i $i JJX$i; done; -> 19.61us
  • for i in {1..10000}; do src/redis-ecli -p 7000 insert "insert into zset values('zset2',$i,'AAA$i',$i,'BBB$i',$i,'CCC$i',$i,'DDD$i',$i,'EEE$i',$i,'FFF$i',$i,'GGG$i',$i,'HHH$i',$i,'III$i',$i,'JJJ$i', $i,'AAX$i',$i,'BBX$i',$i,'CCX$i',$i,'DDX$i',$i,'EEX$i',$i,'FFX$i',$i,'GGX$i',$i,'HHX$i',$i,'IIX$i',$i,'JJX$i')"; done; -> 55.37us

Hash

  • for i in {1..10000}; do src/redis-ecli -p 7000 hset myhash1 field$i value$i; done -> 2.14us
  • for i in {1..10000}; do src/redis-ecli -p 7000 insert "insert into hash values('myhash2','field$i','value$i')"; done -> 25.43us

Stream

  • for i in {1..10000}; do src/redis-ecli -p 7000 xadd stream1 '*' field$i $i; done -> 4.40us
  • for i in {1..10000}; do src/redis-ecli -p 7000 insert "insert into stream values('stream2','*','field$i',$i)"; done -> 27.75us

OPCODE


insert into string values('key01','value');

insert into string values('key02','value2'), ('key03','value3'), ('key04','value4');

insert into list values('mylist1','value1','value2');

insert into list values('mylist2','value1','value2'), ('mylist3','value1','value2');

insert into set values('myset1','value1','value2');

insert into set values('myset2','value1','value2'), ('myset3','value1','value2');

insert into zset values('zset1', 23.5, 'value1', 36.7, 'value2');

insert into zset values('zset2', 23.5, 'value1'), ('zset3', 36.7, 'value2');

insert into hash values('myhash1', 'field1', 'value1', 'field2', 'value2');

insert into hash values('myhash2', 'field1', 'value1'),('myhash3', 'field1', 'value1');

insert into stream values('sensor_1', '*', 'field1', 'value1', 'field2', 'value2');

insert into stream values('sensor_2', '*', 'field1', 'value1'), ('sensor_3', '*', 'field1', 50.7);


Value에 입력 가능한 것들 OPCODE


insert into string values('key05',10+20);

insert into string values('key06',10*20);

insert into string values('key07', min(10,20));

insert into string values('key08', max(10,20));

insert into string values('key09', round(12.675,1));

insert into string values('key10', upper('value'));

insert into string values('key11', trim(' value '));

insert into string values('key12', left('redisgate',5));

insert into string values('key13', 'AAA'||'BBB');

insert into string values('key14', date('now','localtime'));

insert into string values('key15', datetime('now','localtime'));

insert into string values('key16', strftime('%Y-%m-%d %H:%M:%S','now','localtime'));


<< Info Query Insert Intro Insert String >>

Email 返事がかかってなれば、メールでお知らせします。