개발하면서/코드보면서
-
Auth개발하면서/코드보면서 2012. 9. 21. 21:42
Redis의 보안관련해서 소개하겠습니다. http://redis.io/topics/security 위의 문서중에서 rename-command, masterauth/require가 어떻게 동작하는지 알아보겠습니다. 첫째로, rename-command에 대해 알아보겠습니다. 우선 어떤 기능이냐면, 일반적인 client가 특정 명령어를 못하도록 막는 기능을 합니다. SORT나 FLUSHALL, CONFIG같은 명령어는 일반 client가 실행하게 하면 안되겠죠. 사용법은 간단합니다. redis.conf에 rename-command [org command] [new command] ex ) rename-command FLUSHALL kakaka 아래는 실행 화면입니다. populateCommandTable 함수..
-
Pub / Sub개발하면서/코드보면서 2012. 9. 13. 22:16
Pub/Sub는 분산시스템에서 거의 뭐 필수적으로 사용되는 모델입니다. 간단히 말하면 그룹채팅같은거죠... Redis에서는 이 모델을 어떻게 구현했는지 알아보겠습니다. 우선 channel에 참여하는 명령어 SUBSCRIBE는 (pubsub.c:pubsubSubscribeChannel) 를 호출합니다. 엇~?? 이거 어디서 많이 봤습니다. redisClient->pubsub_channels(dict) 에 key : channel, value : NULL을 저장합니다. 그리고 watch와 마찬가지로 해당 server.pubsub_channels에 key와 client를 저장합니다. WATCH와 다른점은 client에서 ilst가 아니라 dict로 정보를 저장하고 있다는점입니다. 서버에는 channel에 접속..
-
transactions개발하면서/코드보면서 2012. 9. 8. 14:42
Redis에는 transaction기능도 있습니다. :) MULTI, EXEC, DISCARD, WATCH, UNWATCH 명령어가 있는데, transaction이 redisClient별 이루어 지는 관계로 우선 redisClient에 대해 먼저 알아보겠습니다. redisClient 구조체는 아래와 같이 생겼습니다. transaction 설명하는데 필요한 변수만 적었습니다. 우선 MULTI, EXEC명령어에 대한 source를 보겠습니다. redisClient 에는 flag라는 변수가 있는데, OR연산을 통해 아래와 같은 정보를 표시합니다. MULTI라는 명령어를 실행하면 별거 없습니다. 해당 client의 flag에 REDIS_MULTI를 표시합니다. (multi.c:multiCommand) MULTI..
-
persistence RDB개발하면서/코드보면서 2012. 9. 3. 00:24
Redis는 두 종류의 persistence기능을 가지고 있습니다. RDB와 AOF가 있습니다. RDB에 대해 알아보겠습니다. snapshot입니다. 끝....은 페인팅이고... RDB는 해당 시점에 저장되어있는 데이타를 모두 iterator로 돌면서 key, value, expire정보들을 파일에 기록합니다. 파일에 기록할때는 rio라는 interface를 사용합니다. 단순합니다. read, write, tell(현재 file pointer의 위치를 리턴), checksum 함수 포인터가 있고, union으로 메모리에 쓸때 사용하는 구조체, 파일에 쓸때 사용하는 구조체가 있습니다. memory인지, 파일인지에 따라서 사용하기 전에 초기화를 해줍니다. 재미진건 rdb에서 crc64를 이용해서 checks..
-
Expires개발하면서/코드보면서 2012. 8. 21. 00:05
http://redis.io/commands/expire 위 링크와 소스를 보고 이해했습니다. expireGenericCommand 함수에서 설정을합니다. expire는 마스터에서만 직접 이뤄집니다. 그리고 (설정시간이 현재보다 이전시간이고, AOF를 로딩하지않고, 마스터일때의 동작)과 (그렇지 않을때의 동작,) 두가지 branch가 나옵니다. 첫번째의 경우는, 이미 시간이 지나간 것이니 삭제를 수행합니다. (networking.c rewriteClientCommandVector 따로 포스팅 해야겠다...) 두번째의 경우는 redisDb의 expires dict에 key를 저장하고 signalModifiedKey를 수행합니다. Redis에서는 Optimistic Lock을 사용합니다. get / set ..
-
Sorted Set개발하면서/코드보면서 2012. 6. 17. 22:39
Sorted Set은 ziplist와 SkipList라는 자료구조를 사용합니다. SkipList자료구조가 생소해서 소스까지 이해하는데 시간이 좀 걸렸던 기억이 나네요;;순서대로 읽으시면 이해하시는데 더 편한것같습니다. 가장 강추는 http://www.slideshare.net/jongwookkim/skip-list ~!! http://www.lsi.upc.edu/~conrado/research/talks/survey-CALIN.pdf search와 insert에 이해가 쉽도록 그려줬음 : ) http://en.wikipedia.org/wiki/Skip_list 수학적인 얘기나오면 무조건 패스~!! 했습니다. 영어가 좀 많다싶어도 패스....(하........멀기만하네요;;) skiplist에 대한 얘기는..
-
persistence AOF개발하면서/코드보면서 2012. 6. 17. 22:38
RDB는 snapshot같이 수행한 순간에 데이타를 파일에 기록합니다.여기서 문제점이 있는데 기록하는 순간에 컴퓨터 파워가 나가거나, kill -9 로 강제 종료한다면, 마지막 정상적인 rdb파일 이후에 들어온 데이타는 잃어버리게 됩니다. 그래서 append-only-fie을 사용하게 됩니다. 제가 생각한 AOF개념은 데이타를 파일에 쓸때 모든데이타를 한번에 쓰지말고( RDB), 버퍼를 만들어서 일정크기, 일정시간동안 입력들어온 데이타는 버퍼에 기록하다가 파일에 붙여 넣자입니다. 소스를 보니까 파일에 기록된 것 이후에 들어온 query는 파일에 append도 하지만 fork후 child process가 현재 dict에 저장되어있는 데이타를 파일에 기록하고, 기록 하는 동안에 client의 명령어들을 ao..
-
Set개발하면서/코드보면서 2012. 6. 17. 22:38
Set은 intset과 hashtable을 사용합니다. hashtable은 hashes에서 설명한것처럼 dict을 사용합니다. intset에 대해 알아보겠습니다. contents에 value값이 들어가고 encoding에는 현재 어떤 int형인지 (INTSET_ENC_INT16/32/64) length에는 현재 저장한 value의 갯수가 저장됩니다. insert할때는 binary search로 해당값이 있는지 확인하고 없으면 min 위치에 값을 저장합니다. 처음에 encoding은 int16_t로 하는데 그 범위에 벗어나는 값이 들어오면 전체 데이타를 다 수정합니다.;;; intsetUpgradeAndAdd 아~~ 같은값이 있으면 뭐 상관없는데, 아니라면 아래 작업을 수행합니다. resize후에 memm..