달력

112017  이전 다음

  •  
  •  
  •  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  •  
  •  

Redis는 두 종류의 persistence기능을 가지고 있습니다. RDB와 AOF가 있습니다.


RDB에 대해 알아보겠습니다.  snapshot입니다.


끝....은 페인팅이고...


RDB는 해당 시점에 저장되어있는 데이타를 모두 iterator로 돌면서 key, value, expire정보들을 파일에 기록합니다.


파일에 기록할때는 rio라는 interface를 사용합니다.                단순합니다.   

read, write, tell(현재 file pointer의 위치를 리턴), checksum 함수 포인터가 있고, 
union으로 메모리에 쓸때 사용하는 구조체, 파일에 쓸때 사용하는 구조체가 있습니다.


memory인지, 파일인지에 따라서 사용하기 전에 초기화를 해줍니다.

재미진건 rdb에서 crc64를 이용해서 checksum을 만듭니다.

파일에 쓸때마다 checksum을 계산합니다. 그리고 모든 db의 내용을 다쓰고 마지막에 checksum을 기록합니다.

나중에 파일 손상이나 악의적인 수정을 방지하려는 장치가 있네요 : )
(학교공부 하다가 알았는데, md5sum 동작을 구현했네요.)

http://stackoverflow.com/questions/3395690/md5sum-of-file-in-linux-c


RDB를 load할때 read에 대해 checksum을 하고, 최종 결과와, file에 있는 checksum과 비교를 해서 같아야 정상,
아니면 redis종료를 하게 됩니다.  파일에 대한 변조 검사보다 좀 더 빠르게 하는게 좋다고 생각하신다면
redis.conf:  rdbchecksum no로 설정하시면 되겠습니다.




config에 save옵션이 있습니다. 몇건 이상 변경우, 몇초 이상의 조건을 만족할때 save를 하는 옵션입니다.

설정된 값을 체크해야하니까 serverCron에서 check를 하겠죠?

서버 init시 config.c:appendServerSaveparams에서 save관련 구조체에 값을 세팅합니다.

아하~!!!! dirty의 용도가 저거 였군요~!!!!



데이타를 기록할때 Redis만의 encoding방식이 있다. 조사하다가 정리가 잘된 블로그를 발견했습니다. : 0 
어떤식으로 RDB를 기록하는지 보다 자세히 알고싶으면 참고하세요~~ : ) http://invents.sinaapp.com/lab/?p=432 

Redis 소스를 보면서, 처음봤을때는 참~~ 쉬워보였는데, 보면 볼수록 절묘하게 이어지게 짠 소스들에 감탄을하고, 
아직 모르는게 태반이라는걸 깨닫네요. 그리고 질좋은 중국어 자료들이 많아지고 있는걸 느낍니다. 


결론은........분발해야겠어요. 그저그런 개발자로 살고싶지 않다면.........엉엉 ㅠ,.ㅠ



저작자 표시 비영리
신고
Posted by 오산돌구
TAG