* INCR key
Time complexity O(1)
key에 저장된 value의 값을 1 증가시킨다.
- incrCommand in t_string.c
a. incrDecrCommand(c, 1);
b. 정수값의 경우 shared.integers[value]로 미리 만들어 놓은 object를 value로 사용
* DECR key
Time complexity O(1)
key에 저장된 value의 값을 1 감소시킨다.
- decrCommand in t_string.c
a. incrDecrCommand(c, -1);
* MGET key [key ...]
Time complexity O(N)
key에 맞는 값을 찾아서 리턴. 없으면 nil을 리턴. 다수의 key를 설정하므로 multi bulk리턴
* RPUSH key value [value ...]
Time complexity O(1)
기존에 저장된 value의 끝(tail)에 value를 추가. 기존에 저장된 value가 list가 아니면 에러 리턴. key가 없으면 ziplist를 새로 만듦.
ZIPLIST와 LINKEDLIST에 사용 가능
* LPUSH key value [value ...]
Time complexity O(1)
기존에 저장된 value의 처음(head)에 value를 추가. 기존에 저장된 value가 list가 아니면 에러 리턴. key가 없으면 ziplist를 새로 만듦.
ZIPLIST와 LINKEDLIST에 사용 가능
* RPUSHX key value
Time complexity O(1)
key가 있고 list인 경우에만 끝에 value를 추가.
* LPUSHX key value
Time complexity O(1)
key가 있고 list인 경우에만 처음에 value를 추가.
* LINSERT key BEFORE|AFTER pivot value
Time complexity O(N)
value를 pivot의 이전(BEFORE)이나 뒤(AFTER)에 추가.
pivot의 encoding값이 REDIS_ENCODING_RAW이어야 함. 기존에 저장된 value들이 ZIPLIST이고 새로 저장할 value의 크기가 list_max_ziplist_value를 넘으면 LINKEDLIST로 컨버전. pivot은 앞에서부터 뒤로 loop를 돌며 찾는다.
저장한 후 value가 ZIPLIST이고 리스트의 크기가 list_max_ziplist_entries보다 크면 LINKEDLIST로 컨버전한다.
* RPOP key
Time complexity O(1)
list에서 마지막 값을 제거한다.
* LPOP key
Time complexity O(1)
list에서 처음 값을 제거한다.
* BRPOP key [key ...] timeout
Time complexity O(1)
처음으로 비어있지 않은 list의 마지막 값을 제거한다.
주어진 모든 key가 비어 있으면 timeout만큼 block된다. 하지만, MULTI/EXEC안에서 이 명령어가 실행된 것이면 바로 "*-1\r\n"을 리턴한다.
block은 리턴을 하지 않아 버리는 것이다. 그럼으로서 client는 무한정 기다리게 된다. 서버는 serverCron에서 확인하여 지정한 timeout이 지나고 나면 리턴을 한다.
* BRPOPLPUSH source destination timeout
Time complexity O(1)
* BLPOP key [key ...] timeout
Time complexity O(1)
처음으로 비어있지 않은 list의 처음 값을 제거한다.
주어진 모든 key가 비어 있으면 timeout만큼 block된다. 하지만, MULTI/EXEC안에서 이 명령어가 실행된 것이면 바로 "*-1\r\n"을 리턴한다.
2015년 6월 10일 수요일
Redis command 분석 - 1
* GET key
Time complexity: O(1)
key의 값(value) 얻어오기. key가 없으면 nil을 리턴
GET은 string만을 다루기 때문에 key의 값이 string이 아니면 에러가 리턴됨
- getCommand in t_string.c
a. db로부터 key를 찾는다.
b. key가 있으면 access time을 업데이트
c. key가 없으면 "$-1\r\n"을 client에 보낸다.
d. 찾은 key의 type이 string이 아니면 "-ERR Operation against a key holding the wrong kind of value\r\n"을 client에 보낸다.
e. 리턴할 value의 크기를 prefix로 해주고(예: "$2344\r\n") 뒤에 value를 붙인 후 client에게 보낸다.(예: value가 Hello인 경우 - "$5\r\nHello\r\n")
- value의 크기가 32보다 작은 경우는 자주 사용되므로 미리 shared.bulkhdr[]에 보낼 값을 만들어 놓고 사용함
shared.bulkhdr[j] = createObject(REDIS_STRING, sdscatprintf(sdsempty(), "$%d\r\n", j));
* SET key value
Time complexity: O(1)
string인 value를 key로 하여 저장. key가 이미 있으면 그 값의 타입이 무었인지에 상관없이 덮어쓴다.
- setCommand in t_string.c
a. 공간 절약을 위해 string이 숫자이면 숫자로 변환한다.
b. db에 key/value를 무조건 설정한다.(없으면 add, 있으면 overwrite)
c. expire가 설정되어 있으면 delete
d. 이 key를 watch하고 있는 client가 있으면 이 client의 flags값에 REDIS_DIRTY_CAS를 더함으로서 그 client에서의 exec가 실패하도록 해준다.
e. 항상 "+OK\r\n"을 client에게 보낸다.(set은 실패하지 않음)
* SETNX key value
Time complexity: O(1)
key가 없을 경우만 key/value를 저장한다.
- setnxCommand in t_string.c
a. key가 없을 경우는 SET과 같다.
b. key가 있을 경우 ":0\\r\n"을 key가 없을 경우는 ":1\r\n"을 client에게 보낸다.
* SETEX key seconds value
Time complexity: O(1)
주어진 시간에 timeout하는 key/value 저장
아래의 두 명령을 MULTI/EXEC block 안에서 실행하는 것과 같은 명령
SET key value
EXPIRE key seconds
- setexCommand in t_string.c
위의 SET 명령어에 더하여 expire에 관련된 부분만 추가해줌
a. seconds를 milliseconds로 바꾼다.
b. db의 expires로부터 key를 찾는다.(없으면 추가)
c. key의 value를 milliseconds로 바꾸어준다.
* PSETEX key milliseconds value
Time complexity: O(1)
expire time을 millisecond로 설정한다는 것만 제외하고는 setex와 같은 명령어
* APPEND key value
Time complexity: O(1)
key가 이미 있고 string이라면 string의 끝에 value를 더한다. 없으면 key를 만들어서 value를 넣는다.
- appendCommand in t_string.c
a. key를 찾는다.
b. 없으면 key를 만들어 value를 저장한다.
c. key가 있으면 type을 확인하여 type이 string이 아니면 "-ERR Operation against a key holding the wrong kind of value\r\n"을 client에게 보낸다.
d. append할 경우 string의 size가 512MB를 넘으면 "string exceeds maximum allowed size (512MB)"를 client에게 보낸다.
e. object가 shared이거나 encoded이면 value를 copy한 후 key의 value에 덮어쓴다.
f. key의 value가 바뀌었으므로 watch하고 있는 client에 signal을 날린다.
* STRLEN key
Time complexity: O(1)
key에 저장된 value의 size를 리턴한다. key가 string이 아니면 에러를 리턴한다.
- strlenCommand in t_string.c
a. key가 없으면 ":0\r\n"을 client에게 보낸다.
b. key가 string이 아니면 "-ERR Operation against a key holding the wrong kind of value\r\n"을 client에게 보낸다.
c. value의 크기를 client에게 보낸다.
* DEL key [key ...]
Time complexity: O(1)
지정한 키를 지운다. key가 없으면 무시한다.
- delCommand in db.c
a. argument로 지정한 key들을 지운다.
b. 지정한 key를 watch하고 있는 client에게 알린다.
c. 지운 key의 수를 client에게 보낸다.
* EXISTS key
Time complexity: O(1)
key가 존재하는지 확인한다.
- existsCommand in db.c
a. key가 존재하는지 확인한다.
b. 있으면 ":1\r\n"을 client에게 보낸다.
c. 없으면 ":0\r\n"을 client에게 보낸다.
* SETBIT key offset value
Time complexity: O(1)
key에 저장된 value의 offset위치의 bit를 set(1) 또는 clear(0)한다.
- setbitCommand in bitops.c
a. offset의 값을 가져온다. 512MB이하여야 한다. 아닐경우 "-ERR bit offset is not an integer or out of range\r\n"를 리턴한다.
b. value의 값을 가져온다. LONG_MIN과 LONG_MAX사이여야 한다. 아닐 경우 "-ERR bit is not an integer or out of range\r\n"를 client에게 보낸다.
c. offset이 0이나 1이 아니면 "-ERR bit is not an integer or out of range\r\n"를 client에게 보낸다.
d. key를 찾는다.
e. key가 없으면 empty string을 새로 만든다.
f. key가 있으면 type이 string인지 확인한다. 그리고 나서 key가 shared 또는 encoded이면 copy를 하여 기존의 다른 값이 변하지 않도록 한다.
g. string의 크기가 offset만큼 크지 않으면 offset 설정이 가능하도록 string의 크기를 증가시킨다. 이때 추가되는 부분의 bit값은 0으로 한다.
h. offset 부분의 값을 value로 바꾼다.(key의 값이 바뀌므로 watch중인 client에 signal을 보낸다.)
i. 값을 바꾼 bit의 원래 값을 client에게 보낸다.
* GETBIT key offset
Time complexity: O(1)
key에 저장된 value의 offset 위치의 값을 리턴한다.
- getbitCommand in bitops.c
a. offset 값이 정상적인지 확인한다.
b. key가 없으면 ":0\r\n"을 client에게 보낸다. type이 string이 아니면 에러를 리턴한다.
c. key가 있으면 offset 위치의 값을 client에게 보낸다.(":1\\r\n" or ":0\r\n")
d. offset의 위치가 key의 string 크기를 벗어나면 0으로 가정하고 값을 리턴한다.
* SETRANGE key offset value
Time complexity: O(1)
string의 부분을 변경한다.
- setrangeCommand in t_string.c
a. offset값을 가져온다. 값이 0보다 작으면 "-ERR offset is out of range\r\n"을 client에게 보낸다.
b. key를 찾는다.
c. key가 없는 경우 다음의 순서로 진행한다.
c-1. value의 크기가 0이면 ":0\r\n"을 client에게 보낸다.
c-2. offset + value의 크기가 최대 크기를 넘으면 에러를 리턴한다.
c-3. key에 빈 스트링을 넣는다.
d. key가 있는 경우
d-1. key의 타입이 string인지 확인한다.
d-2. value의 크기가 0이면 저장되어 있는 key의 value의 크기를 리턴한다.
d-3. offset + value의 크기가 최대 크기를 넘으면 에러를 리턴한다.
d-4. object가 shared이거나 encoded이면 object를 복사한다.
e. value의 크기가 0보다 크면 key의 value의 offset위치의 값을 변경한다. 이때 offset위치가 저장되어 있는 value의 크기보다 크면 0(zero byte)을 붙여서 값 변경이 가능하도록 해준다.
f. 변경된 value의 크기를 리턴한다.
* GETRANGE key start end
Time complexity: O(N)
string의 지정한 부분의 값을 가져온다. 음수의 start와 end는 뒤에서 부터를 의미한다. 이전 버전에서는 SUBSTR이었다.(코드에 남아있으므로 사용은 가능하다.)
- getrangeCommand in t_string.c
a. key가 없으면 "$0\r\n\r\n"를 리턴한다.
b. start가 음수인 경우 뒤에서 부터 value에서의 실제 위치를 계산했을 때 value의 0 index보다 더 작게 가면 0으로 설정한다.
c. end가 음수인 경우 뒤에서 부터 value에서의 실제 위치를 계산했을 때 value의 0 index보다 작으면 0으로 설정한다.
d. end가 value의 크기보다 크면 값을 value의 크기로 조정한다.
c. end보다 start가 더 크면 "$0\r\n\r\n"를 리턴한다.
Time complexity: O(1)
key의 값(value) 얻어오기. key가 없으면 nil을 리턴
GET은 string만을 다루기 때문에 key의 값이 string이 아니면 에러가 리턴됨
- getCommand in t_string.c
a. db로부터 key를 찾는다.
b. key가 있으면 access time을 업데이트
c. key가 없으면 "$-1\r\n"을 client에 보낸다.
d. 찾은 key의 type이 string이 아니면 "-ERR Operation against a key holding the wrong kind of value\r\n"을 client에 보낸다.
e. 리턴할 value의 크기를 prefix로 해주고(예: "$2344\r\n") 뒤에 value를 붙인 후 client에게 보낸다.(예: value가 Hello인 경우 - "$5\r\nHello\r\n")
- value의 크기가 32보다 작은 경우는 자주 사용되므로 미리 shared.bulkhdr[]에 보낼 값을 만들어 놓고 사용함
shared.bulkhdr[j] = createObject(REDIS_STRING, sdscatprintf(sdsempty(), "$%d\r\n", j));
* SET key value
Time complexity: O(1)
string인 value를 key로 하여 저장. key가 이미 있으면 그 값의 타입이 무었인지에 상관없이 덮어쓴다.
- setCommand in t_string.c
a. 공간 절약을 위해 string이 숫자이면 숫자로 변환한다.
b. db에 key/value를 무조건 설정한다.(없으면 add, 있으면 overwrite)
c. expire가 설정되어 있으면 delete
d. 이 key를 watch하고 있는 client가 있으면 이 client의 flags값에 REDIS_DIRTY_CAS를 더함으로서 그 client에서의 exec가 실패하도록 해준다.
e. 항상 "+OK\r\n"을 client에게 보낸다.(set은 실패하지 않음)
* SETNX key value
Time complexity: O(1)
key가 없을 경우만 key/value를 저장한다.
- setnxCommand in t_string.c
a. key가 없을 경우는 SET과 같다.
b. key가 있을 경우 ":0\\r\n"을 key가 없을 경우는 ":1\r\n"을 client에게 보낸다.
* SETEX key seconds value
Time complexity: O(1)
주어진 시간에 timeout하는 key/value 저장
아래의 두 명령을 MULTI/EXEC block 안에서 실행하는 것과 같은 명령
SET key value
EXPIRE key seconds
- setexCommand in t_string.c
위의 SET 명령어에 더하여 expire에 관련된 부분만 추가해줌
a. seconds를 milliseconds로 바꾼다.
b. db의 expires로부터 key를 찾는다.(없으면 추가)
c. key의 value를 milliseconds로 바꾸어준다.
* PSETEX key milliseconds value
Time complexity: O(1)
expire time을 millisecond로 설정한다는 것만 제외하고는 setex와 같은 명령어
* APPEND key value
Time complexity: O(1)
key가 이미 있고 string이라면 string의 끝에 value를 더한다. 없으면 key를 만들어서 value를 넣는다.
- appendCommand in t_string.c
a. key를 찾는다.
b. 없으면 key를 만들어 value를 저장한다.
c. key가 있으면 type을 확인하여 type이 string이 아니면 "-ERR Operation against a key holding the wrong kind of value\r\n"을 client에게 보낸다.
d. append할 경우 string의 size가 512MB를 넘으면 "string exceeds maximum allowed size (512MB)"를 client에게 보낸다.
e. object가 shared이거나 encoded이면 value를 copy한 후 key의 value에 덮어쓴다.
f. key의 value가 바뀌었으므로 watch하고 있는 client에 signal을 날린다.
* STRLEN key
Time complexity: O(1)
key에 저장된 value의 size를 리턴한다. key가 string이 아니면 에러를 리턴한다.
- strlenCommand in t_string.c
a. key가 없으면 ":0\r\n"을 client에게 보낸다.
b. key가 string이 아니면 "-ERR Operation against a key holding the wrong kind of value\r\n"을 client에게 보낸다.
c. value의 크기를 client에게 보낸다.
* DEL key [key ...]
Time complexity: O(1)
지정한 키를 지운다. key가 없으면 무시한다.
- delCommand in db.c
a. argument로 지정한 key들을 지운다.
b. 지정한 key를 watch하고 있는 client에게 알린다.
c. 지운 key의 수를 client에게 보낸다.
* EXISTS key
Time complexity: O(1)
key가 존재하는지 확인한다.
- existsCommand in db.c
a. key가 존재하는지 확인한다.
b. 있으면 ":1\r\n"을 client에게 보낸다.
c. 없으면 ":0\r\n"을 client에게 보낸다.
* SETBIT key offset value
Time complexity: O(1)
key에 저장된 value의 offset위치의 bit를 set(1) 또는 clear(0)한다.
- setbitCommand in bitops.c
a. offset의 값을 가져온다. 512MB이하여야 한다. 아닐경우 "-ERR bit offset is not an integer or out of range\r\n"를 리턴한다.
b. value의 값을 가져온다. LONG_MIN과 LONG_MAX사이여야 한다. 아닐 경우 "-ERR bit is not an integer or out of range\r\n"를 client에게 보낸다.
c. offset이 0이나 1이 아니면 "-ERR bit is not an integer or out of range\r\n"를 client에게 보낸다.
d. key를 찾는다.
e. key가 없으면 empty string을 새로 만든다.
f. key가 있으면 type이 string인지 확인한다. 그리고 나서 key가 shared 또는 encoded이면 copy를 하여 기존의 다른 값이 변하지 않도록 한다.
g. string의 크기가 offset만큼 크지 않으면 offset 설정이 가능하도록 string의 크기를 증가시킨다. 이때 추가되는 부분의 bit값은 0으로 한다.
h. offset 부분의 값을 value로 바꾼다.(key의 값이 바뀌므로 watch중인 client에 signal을 보낸다.)
i. 값을 바꾼 bit의 원래 값을 client에게 보낸다.
* GETBIT key offset
Time complexity: O(1)
key에 저장된 value의 offset 위치의 값을 리턴한다.
- getbitCommand in bitops.c
a. offset 값이 정상적인지 확인한다.
b. key가 없으면 ":0\r\n"을 client에게 보낸다. type이 string이 아니면 에러를 리턴한다.
c. key가 있으면 offset 위치의 값을 client에게 보낸다.(":1\\r\n" or ":0\r\n")
d. offset의 위치가 key의 string 크기를 벗어나면 0으로 가정하고 값을 리턴한다.
* SETRANGE key offset value
Time complexity: O(1)
string의 부분을 변경한다.
- setrangeCommand in t_string.c
a. offset값을 가져온다. 값이 0보다 작으면 "-ERR offset is out of range\r\n"을 client에게 보낸다.
b. key를 찾는다.
c. key가 없는 경우 다음의 순서로 진행한다.
c-1. value의 크기가 0이면 ":0\r\n"을 client에게 보낸다.
c-2. offset + value의 크기가 최대 크기를 넘으면 에러를 리턴한다.
c-3. key에 빈 스트링을 넣는다.
d. key가 있는 경우
d-1. key의 타입이 string인지 확인한다.
d-2. value의 크기가 0이면 저장되어 있는 key의 value의 크기를 리턴한다.
d-3. offset + value의 크기가 최대 크기를 넘으면 에러를 리턴한다.
d-4. object가 shared이거나 encoded이면 object를 복사한다.
e. value의 크기가 0보다 크면 key의 value의 offset위치의 값을 변경한다. 이때 offset위치가 저장되어 있는 value의 크기보다 크면 0(zero byte)을 붙여서 값 변경이 가능하도록 해준다.
f. 변경된 value의 크기를 리턴한다.
* GETRANGE key start end
Time complexity: O(N)
string의 지정한 부분의 값을 가져온다. 음수의 start와 end는 뒤에서 부터를 의미한다. 이전 버전에서는 SUBSTR이었다.(코드에 남아있으므로 사용은 가능하다.)
- getrangeCommand in t_string.c
a. key가 없으면 "$0\r\n\r\n"를 리턴한다.
b. start가 음수인 경우 뒤에서 부터 value에서의 실제 위치를 계산했을 때 value의 0 index보다 더 작게 가면 0으로 설정한다.
c. end가 음수인 경우 뒤에서 부터 value에서의 실제 위치를 계산했을 때 value의 0 index보다 작으면 0으로 설정한다.
d. end가 value의 크기보다 크면 값을 value의 크기로 조정한다.
c. end보다 start가 더 크면 "$0\r\n\r\n"를 리턴한다.
기억해 두면 좋은 Git 명령어
1. Git 설정
$ git config --global user.name "John Doe"
$ git config --global user.email john@gmail.com
선호하는 에디터가 있으면 아래도 해준다.
$ git config --global core.editor vi
- 도움말 보기
$ git help <verb>
2. 기본 명령어
- Git 저장소 만들기
$ git init
- 저장소 clone하기
$ git clone git://github.com/schacon/grit.git
- 저장소에 파일 추가하기
$ git add *.c
- 저장소에 commit하기
$ git commit -m "initial commit"
- 파일의 상태 확인하기
$ git status
- 무시하고 싶은 파일은 .gitignore에 적어준다. 표준 Glob 패턴 입력이 가능하다.
- 변경 내용 확인하기(수정한 파일과 staged된것의 내용 비교)
$ git diff
- 변경 내용 확인하기(staged된것과 저장소의 내용 비교)
$ git diff --cached
or
$ git diff --staged
- 파일 삭제하기
$ git rm test.txt
- 파일 삭제시 파일이 변경된 상태라면 git rm이 되지 않는다. 그러므로 위의 명령에 -f를 주거나 rm 후 git rm을 해야 한다.
- 파일을 실제로 지우지는 않고 저장소에서만 제거하고 싶으면
$ git rm --cached readme.txt
- 파일 이름 변경하기
$ git mv README.txt README
or
$ mv README.txt README
$ git rm RADME.txt
$ git add README
- 히스토리 조회하기
$ git log
- staged 상태인 것 되돌리기
$ git reset HEAD readme.txt
- 수정한 파일을 수정이전 버전으로 되돌리기
$ git checkout -- readme.txt
- 현재 프로젝트에 등록된 리모트 저장소 확인
$ git remote -v
- 새 리모트 저장소 추가
$ git remote add [단축이름] [url]
- 리모트 저장소와 연결된 추적 브랜치 만들기
$ git checkout -b [로컬 브랜치 이름] [리모트 저장소 이름]:[리모트 브랜치 이름]
- 리모트 저장소에서 데이터 가져오기
$ git fetch [remote-name]
- 리모트 저장소에서 데이터 가져와서 머지까지 하기
$ git pull [remote-name]
- 파일을 리모트 저장소에 올리기
$ git push [리모트 저장소 이름] [브랜치 이름]
브랜치 이름이 로컬과 리모트가 다른 경우
$ git push [리모트 저장소 이름] [로컬 브랜치 이름]:[리모트 브랜치 이름]
- 리모트 브랜치 삭제하기
$ git push [리모트 저장소 이름] :[리모트 브랜치 이름]
- 리모트 저장소의 구체적인 정보 확인하기
$ git remote show origin
- 리모트 저장소의 이름 바꾸기
$ git remote rename pb paul => pb를 paul로 바꾼다.
- 리모트 저장소 삭제하기
$ git remote rm paul
- tag 조회하기
$ git tag
- 간단한 tag 만들기(lightweight tag)
$ git tag v1.4
- 자세한 tag 만들기(annotated tag)
$ git tag -a v1.4 -m 'my version 1.4'
- tag 정보 확인하기
$ git show v1.4
- 예전 커밋에 tag 넣기
$ git tag -a v1.2 9fceb02 => 커밋 체크섬 일부를 마지막에 넣어줌
- tag를 리모트 서버에 전송하기
$ git push origin v1.4
- 여러개의 tag를 한번에 보내기
$ git push origin --tags
- 브랜치 목록 보기
$ git branch
- 브랜치 만들기(만들기만 하고 이동하지는 않음)
$ git branch testing
- 브랜치 이동하기
$ git checkout testing
- 머지된 브랜치 삭제하기
$ git branch -d testing
- 머지가 안된 브랜치 강제로 삭제하기(조심해서 사용하자)
$ git branch -D testing
- 브랜치 머지하기
$ git merge master => master의 내용을 현재 브랜치로 머지함
- 현재 checkout한 브랜치 기준으로 머지정보 확인하기
$ git branch --merged
$ git branch --no-merged
- rebase 하기
$ git rebase master
- server 브랜치를 master 브랜치로 rebase 하기
$ git branch master server
$ git config --global user.name "John Doe"
$ git config --global user.email john@gmail.com
선호하는 에디터가 있으면 아래도 해준다.
$ git config --global core.editor vi
- 도움말 보기
$ git help <verb>
2. 기본 명령어
- Git 저장소 만들기
$ git init
- 저장소 clone하기
$ git clone git://github.com/schacon/grit.git
- 저장소에 파일 추가하기
$ git add *.c
- 저장소에 commit하기
$ git commit -m "initial commit"
- 파일의 상태 확인하기
$ git status
- 무시하고 싶은 파일은 .gitignore에 적어준다. 표준 Glob 패턴 입력이 가능하다.
- 변경 내용 확인하기(수정한 파일과 staged된것의 내용 비교)
$ git diff
- 변경 내용 확인하기(staged된것과 저장소의 내용 비교)
$ git diff --cached
or
$ git diff --staged
- 파일 삭제하기
$ git rm test.txt
- 파일 삭제시 파일이 변경된 상태라면 git rm이 되지 않는다. 그러므로 위의 명령에 -f를 주거나 rm 후 git rm을 해야 한다.
- 파일을 실제로 지우지는 않고 저장소에서만 제거하고 싶으면
$ git rm --cached readme.txt
- 파일 이름 변경하기
$ git mv README.txt README
or
$ mv README.txt README
$ git rm RADME.txt
$ git add README
- 히스토리 조회하기
$ git log
- staged 상태인 것 되돌리기
$ git reset HEAD readme.txt
- 수정한 파일을 수정이전 버전으로 되돌리기
$ git checkout -- readme.txt
- 현재 프로젝트에 등록된 리모트 저장소 확인
$ git remote -v
- 새 리모트 저장소 추가
$ git remote add [단축이름] [url]
- 리모트 저장소와 연결된 추적 브랜치 만들기
$ git checkout -b [로컬 브랜치 이름] [리모트 저장소 이름]:[리모트 브랜치 이름]
- 리모트 저장소에서 데이터 가져오기
$ git fetch [remote-name]
- 리모트 저장소에서 데이터 가져와서 머지까지 하기
$ git pull [remote-name]
- 파일을 리모트 저장소에 올리기
$ git push [리모트 저장소 이름] [브랜치 이름]
브랜치 이름이 로컬과 리모트가 다른 경우
$ git push [리모트 저장소 이름] [로컬 브랜치 이름]:[리모트 브랜치 이름]
- 리모트 브랜치 삭제하기
$ git push [리모트 저장소 이름] :[리모트 브랜치 이름]
- 리모트 저장소의 구체적인 정보 확인하기
$ git remote show origin
- 리모트 저장소의 이름 바꾸기
$ git remote rename pb paul => pb를 paul로 바꾼다.
- 리모트 저장소 삭제하기
$ git remote rm paul
- tag 조회하기
$ git tag
- 간단한 tag 만들기(lightweight tag)
$ git tag v1.4
- 자세한 tag 만들기(annotated tag)
$ git tag -a v1.4 -m 'my version 1.4'
- tag 정보 확인하기
$ git show v1.4
- 예전 커밋에 tag 넣기
$ git tag -a v1.2 9fceb02 => 커밋 체크섬 일부를 마지막에 넣어줌
- tag를 리모트 서버에 전송하기
$ git push origin v1.4
- 여러개의 tag를 한번에 보내기
$ git push origin --tags
- 브랜치 목록 보기
$ git branch
- 브랜치 만들기(만들기만 하고 이동하지는 않음)
$ git branch testing
- 브랜치 이동하기
$ git checkout testing
- 머지된 브랜치 삭제하기
$ git branch -d testing
- 머지가 안된 브랜치 강제로 삭제하기(조심해서 사용하자)
$ git branch -D testing
- 브랜치 머지하기
$ git merge master => master의 내용을 현재 브랜치로 머지함
- 현재 checkout한 브랜치 기준으로 머지정보 확인하기
$ git branch --merged
$ git branch --no-merged
- rebase 하기
$ git rebase master
- server 브랜치를 master 브랜치로 rebase 하기
$ git branch master server
2015년 5월 12일 화요일
OkHttp에서 ConnectionPool.java에 대한 설명
network connection을 재활용하기 위해 ConnectionPool을 사용합니다.
ConnectionPool의 생성은 아래의 세 property에 의한 초기값을 가지고 생성됩니다.
private static final ConnectionPool systemDefault;
static {
...
systemDefault = new ConnectionPool(...);
}
http.keepAlive: connection을 pool할지 말지 정하는 값. 기본값은 true.
http.keepAliveDuration: pool에 들어와 있는 동안 alive로 고려하는 시간 http.maxConnections: pool에 있을 수 있는 최대 idle connection의 수
http.keepAlive가 false이면 maxIdleConnection의 수를 0으로 해서 ConnectionPool을 만듭니다. pool을 사용하지 않겠다는 이야기가 되겠죠?
pool되는 connection의 관리를 위해 LinkedList를 사용합니다.
private final LinkedList<Connection> connections = new LinkedList<>();
pool에 있다가 더이상 pooling하지 않게된 connection을 지워주기 위한 executor로 ThreadPoolExecutor를 사용합니다. maximumPoolSize를 1로 설정하여 하나의 쓰레드만으로 동작하도록 만듭니다.
pool에서 connection을 찾을 때는 get함수를 사용합니다. 이 함수는 Address를 기준으로 찾습니다. Address가 같지 않거나 alive인 connection이 아니거나 idle 상태로 들어갔거나 하면 다른 connection을 찾습니다. for loop 중간에 list에서 뺄 수도 있으므로 listIterator를 사용합니다.
재활용을 하려는 connection은 recycle 함수에 파라메터로 넣어줍니다. 이때 내부에서 addConnection함수를 호출해주고 addConnection함수는 pool되어 있는 connection들을 clean up하도록 합니다.
clean up하는 connection은 다음과 같습니다.
alive시간이 지난 connection을 clean up을 합니다. 그리고 idle 상태인 connection의 수가 maxIdleConnections를 넘은 경우 오래된 connection부터 찾아서 maxIdleConnections 이하로까지 clean up을 해줍니다.
clean up할 connection이 없는 경우는 wait 상태로 들어갑니다. 이 상태가 풀리는 경우는 addConnection함수가 호출되는 경우입니다.
ConnectionPool의 생성은 아래의 세 property에 의한 초기값을 가지고 생성됩니다.
private static final ConnectionPool systemDefault;
static {
...
systemDefault = new ConnectionPool(...);
}
http.keepAlive: connection을 pool할지 말지 정하는 값. 기본값은 true.
http.keepAliveDuration: pool에 들어와 있는 동안 alive로 고려하는 시간 http.maxConnections: pool에 있을 수 있는 최대 idle connection의 수
http.keepAlive가 false이면 maxIdleConnection의 수를 0으로 해서 ConnectionPool을 만듭니다. pool을 사용하지 않겠다는 이야기가 되겠죠?
pool되는 connection의 관리를 위해 LinkedList를 사용합니다.
private final LinkedList<Connection> connections = new LinkedList<>();
pool에 있다가 더이상 pooling하지 않게된 connection을 지워주기 위한 executor로 ThreadPoolExecutor를 사용합니다. maximumPoolSize를 1로 설정하여 하나의 쓰레드만으로 동작하도록 만듭니다.
pool에서 connection을 찾을 때는 get함수를 사용합니다. 이 함수는 Address를 기준으로 찾습니다. Address가 같지 않거나 alive인 connection이 아니거나 idle 상태로 들어갔거나 하면 다른 connection을 찾습니다. for loop 중간에 list에서 뺄 수도 있으므로 listIterator를 사용합니다.
재활용을 하려는 connection은 recycle 함수에 파라메터로 넣어줍니다. 이때 내부에서 addConnection함수를 호출해주고 addConnection함수는 pool되어 있는 connection들을 clean up하도록 합니다.
clean up하는 connection은 다음과 같습니다.
alive시간이 지난 connection을 clean up을 합니다. 그리고 idle 상태인 connection의 수가 maxIdleConnections를 넘은 경우 오래된 connection부터 찾아서 maxIdleConnections 이하로까지 clean up을 해줍니다.
clean up할 connection이 없는 경우는 wait 상태로 들어갑니다. 이 상태가 풀리는 경우는 addConnection함수가 호출되는 경우입니다.
2015년 1월 20일 화요일
English Study - 5
The EU is trying to jumpstart the peace process: 유럽연합은 그 평화협상에 힘을 불어넣으려 하고 있다.
Her whole demeanor is a facade: 그녀가 하는 모든 행동은 가식이에요.
It was surprising how he could bang out an essay: 그가 에세이를 단숨에 쓸 수 있어서 놀라웠다.
She kept him dangling for a week before making her decision: 그녀는 결정을 내리지 않고 일주일동안 그의 애를 태웠다.
The tank became bogged down in mud: 그 탱크가 진창에 빠지고 말았다.
procrastinator: 질질끄는 사람, 꾸물거리는 사람
curmudgeon: 괴팍한 사람
Her whole demeanor is a facade: 그녀가 하는 모든 행동은 가식이에요.
It was surprising how he could bang out an essay: 그가 에세이를 단숨에 쓸 수 있어서 놀라웠다.
She kept him dangling for a week before making her decision: 그녀는 결정을 내리지 않고 일주일동안 그의 애를 태웠다.
The tank became bogged down in mud: 그 탱크가 진창에 빠지고 말았다.
procrastinator: 질질끄는 사람, 꾸물거리는 사람
curmudgeon: 괴팍한 사람
2015년 1월 15일 목요일
English Study - 4
To prescribe a course of antibiotics: 일련의 항생제 치료를 처방하다.
You shouldn't tinker with anything unless you know what you are doing: 무엇이든 확실히 모르면 만지려고 해서는 안됩니다.
I worked at a pharmaceutical company in Minneapolis: 저는 미네아폴리스에 있는 한 제약회사에서 일했습니다.
They refused to comply with the UN resolution: 그들은 유엔 결의사항에 따르기를 거부했다.
antimicrobial: 항균성의, 항균제
It's cruel to keep animals in confined spaces: 동물을 사방이 막힌 좁은 공간에 두는 것은 잔인한 짓이다.
They have introduced a new system whereby all employees must undergo regular training: 그들은 (그에따라) 모든 직원들이 반드시 정기적인 교육을 받아야 하는 새로운 시스템을 도입했다.
I felt we were off to greener pastures: 나는 우리가 더 나은 환경으로 나왔다는 기분이 들었다.
Sheep and cows were grazing in the pasture: 양과 소들이 목장에서 풀을 뜯고 있다.
rancher: 대규모 목장 주인
You shouldn't tinker with anything unless you know what you are doing: 무엇이든 확실히 모르면 만지려고 해서는 안됩니다.
I worked at a pharmaceutical company in Minneapolis: 저는 미네아폴리스에 있는 한 제약회사에서 일했습니다.
They refused to comply with the UN resolution: 그들은 유엔 결의사항에 따르기를 거부했다.
antimicrobial: 항균성의, 항균제
It's cruel to keep animals in confined spaces: 동물을 사방이 막힌 좁은 공간에 두는 것은 잔인한 짓이다.
They have introduced a new system whereby all employees must undergo regular training: 그들은 (그에따라) 모든 직원들이 반드시 정기적인 교육을 받아야 하는 새로운 시스템을 도입했다.
I felt we were off to greener pastures: 나는 우리가 더 나은 환경으로 나왔다는 기분이 들었다.
Sheep and cows were grazing in the pasture: 양과 소들이 목장에서 풀을 뜯고 있다.
rancher: 대규모 목장 주인
2015년 1월 13일 화요일
English Study - 3
The administration was tainted with scandal: 그 행정부는 스캔들로 오명을 얻었다.
Your ideas jar with mine: 네 생각은 내 생각과 일치하지 않는다.
She was obviously disoriented and highly upset: 그녀는 분명히 혼란스러워했고 무지 화났었어.
We are in dire need of your help: 우리는 당신의 도움이 절실히 필요합니다.
A bout of work: 한차례의 일
She poked him in the ribs with her elbow: 그녀가 그의 옆구리를 팔꿈치로 쿡 찔렀다.
She prodded him in the ribs to wake him up: 그녀는 그의 잠을 깨우려고 그의 옆구리를 쿡 찔렀다.
She is by no means an inexperienced teacher: 그녀는 결코 경험없는 교사가 아니다.
Peek a boo: 까꿍놀이(어린아이 앞에서 얼굴을 가렸다가 까꿍(Peekaboo!)하면서 얼굴을 보여주며 어르는 것)
The woman is shooing away the flies: 여자가 파리를 쉬이하며 내쫓고 있다.
The team reclaimed the title from their rivals: 그 팀은 경쟁팀에게서 타이틀을 되찾았다.
Your ideas jar with mine: 네 생각은 내 생각과 일치하지 않는다.
She was obviously disoriented and highly upset: 그녀는 분명히 혼란스러워했고 무지 화났었어.
We are in dire need of your help: 우리는 당신의 도움이 절실히 필요합니다.
A bout of work: 한차례의 일
She poked him in the ribs with her elbow: 그녀가 그의 옆구리를 팔꿈치로 쿡 찔렀다.
She prodded him in the ribs to wake him up: 그녀는 그의 잠을 깨우려고 그의 옆구리를 쿡 찔렀다.
She is by no means an inexperienced teacher: 그녀는 결코 경험없는 교사가 아니다.
Peek a boo: 까꿍놀이(어린아이 앞에서 얼굴을 가렸다가 까꿍(Peekaboo!)하면서 얼굴을 보여주며 어르는 것)
The woman is shooing away the flies: 여자가 파리를 쉬이하며 내쫓고 있다.
The team reclaimed the title from their rivals: 그 팀은 경쟁팀에게서 타이틀을 되찾았다.
피드 구독하기:
글 (Atom)
Generic interfaces 요점
https://go.dev/blog/generic-interfaces Generic interface를 정의할 때 최소한의 제약만을 정의하고 실제 구현체들이 자신만의 필요한 제약을 추가할 수 있도록 하는 것이 좋다. pointer receiver를...