redis原理編及び性能最適化

8744 ワード

一、redis単一スレッドはなぜ性能が良いのか
1.解釈
1)      ,              ,    。       ,   HashMap,HashMap                  O(1)
2)      ,        ,Redis              
3)     ,                 ,                     CPU,           ,          ,                  
4)    I/O    ,   IO
5)        ,                            ,Redis       VM    ,               ,              

2.ではなぜRedisは単一スレッドなのか
1)    :  Redis        ,CPU  Redis   ,Redis                     。         ,  CPU      ,                (             !)

二、持続化メカニズム
1.持続化の概念
1)          ,                 ,           ,             ,                ,             
2)Redis          ,      ,   linux      ,    Redis      ,           ,       ,Redis                 ,              
3)Redis        
	(1)RDB     		                            
	(2)AOF                                      , Redis                     ,                 

2.RDB(Redis DataBase)方式
1)RDB  
	(1)                       ,       Snapshot  ,                 
	(2)RDB    dump.rdb  
	(3)Redis     (fork)           ,               ,          ,                   。     ,         IO   ,                        ,                 , RDB    AOF       。RDB                   
2)    RDB  
	(1)            (        :  cp dump.rdb dump_new.rdb)
	(2)    save  bgsave
		a. save:save     ,    ,     (  )
		b. bgsave:Redis            ,              。    lastsave                 (  )
		c.   flushall  ,    dump.rdb  ,      ,   
3)    		
	(1)      (dump.rdb)     redis            ,  config get dir     
4)    	
	(1)      RDB       :redis-cli config set save ""
5)  
	(1)          (   AOF  ,       ,RDB        )
	(2)              
	(3)       ,      Redis           ,               。  ,               24     ,            30    。         ,           ,             	
	(4)        ,RDB        。                                 
	(5)     。  Redis       ,       ,         fork    ,                 ,                IO   
6)  
	(1)            ,    redis      ,                
	(2)fork   ,            ,  2         (  RDB   fork                ,  ,         ,                  ,   1  )

3.AOF(Append Only File)方式
1)AOF  
	(1)              , Redis             (      ),              ,redis                ,   ,redis                                    (AOF    appendonly.aof  )
2)AOF  /  /  
	(1)    	
		a.   :     appendonly no,  yes;
		b.      aof             (    config get dir    );
		c.   :  redis      ;
	(2)    
		a.   :     appendonly no,  yes;
		b.   :  redis-check-aof --fix      ;
		c.   :  redis      ;
3)rewrite
	(1)rewrite  
		a. AOF        ,                ,       , AOF              ,Redis    AOF       ,               .      bgrewriteaof;
	(2)    
		a. AOF          , fork            (           rename),           ,        Set  。  aof     ,       aof  ,                           aof  ,         ;	
	(3)    
		a. Redis         AOF  ,      AOF       rewrite           64M   ;
4)    
	a.      :appendfsync always      ,                               ;
	b.     :appendfsync everysec     ,    ,       ,     ;
	c.    :appendfsync no     ;
5)  
	a.                ,      。Redis    3     ,     、         。   ,           ,         ,              ,                 。      ,             ,                     。    ,            。     ,    ,            
	b.                    append  ,                ,                 。                             ,    , Redis       ,      redis-check-aof                 
	c.       ,Redis      rewrite  。 Redis append                    ,  Redis                           。     rewrite               	
	d. AOF        、                    。   ,                  
6)  
	a.           aof      rdb  ,      rdb;
	b.          ,AOF           RDB。  ,              ,          RDB    

三、redis期限切れポリシー
1.有効期限の設定
1)expire key time(     ) --         
2)setex(String key, int seconds, String value) --         
  :
	a.                    ,         expire       
	b.         ,         
	c.          ,           ,  persist key

2.3つの期限切れポリシー
1)    
	(1)  :   key        ,  key       ,     key        , key    
	(2)  
		a.          
	(3)  
		a.    key  ,    key      CPU  , CPU        ,CPU                ,           key
		b.         ,            key       (           ),      
		c.    
2)    	
	(1)  :key        ,        key          ,   ,   ,  null
	(2)  
		a.               key     ,       key,   CPU          ,                   (          ,             key )	
	(3)  
		a.     key        ,       ,       ,          (             )
3)    
	(1)  :              key  
	(2)  
		a.               ,        CPU     --  "    "   
		b.       key--  "    "   
	(3)  
		a.        ,  "    "
		b.  CPU      ,  "    "	
	(4)  
		a.              (          )     (           )(               )	

3.Redisが採用した期限切れの策略——不活性削除+定期削除
1)      
	(1)   get setnx    ,   key    
	(2)   ,  key,        
	(3)    ,        
2)      (    ,                           key)
	(1)       (  redis.conf    "database"  ,   16)
	(2)            key(        20 key,          20 ,         )
		a.           key       ,           
		b.               key,   key    ,    ,  key
		c.                   ,     ,        	

4.RDBの期限切れkeyに対する処理——期限切れkeyはRDBに何の影響もない
1)            RDB  
	(1)   key  ,       ,   key   RDB  
2) RDB            
	(2)         ,  key       ,    ,      (    )

5.AOFの期限切れkeyに対する処理——期限切れkeyはAOFに何の影響もない
1)            AOF  
	(1) key   ,      ,           ( key     aof   ,          )
	(2) key   ,        ,    aof      del  (     aof                   )
2)AOF  
	(1)   ,    key    ,    key     aof  

四、redisメモリ淘汰メカニズム
1.概念
1)redis                  ,          

2.構成
1)maxmemory : maxmemory 0        Redis         
2)maxmemory-policy :       	
ps: redis       ,    

3.プロセス
1)  ,                 ( set)
2)  ,Redis        ,          maxmemory                     (key),         
3)  ,        ,         

4.メモリ淘汰ポリシー
1)volatile-lru :                          。redis                       ,               ,                        
2)volatile-ttl :                        。redis                       ,               ,                         	
3)volatile-random :                     。                       
4)allkeys-lru :                  。          ,                   ,        
5)allkeys-random :             ,          ,            ,        
6)no-enviction :          ,       ,         ,              

5.淘汰ポリシーの選択方法
1)allkeys-lru:                   ,           ,                     ,      allkeys-lru  
2)allkeys-random:           key       ,         
3)volatile-ttl:           Redis    key    eviction	
4)volatile-lru   volatile-random         Redis                     ,             Redis          ,       key                 ,        allkeys-lru             

五、redisよくある問題分析(貫通、破壊、雪崩)
1.キャッシュスルー
1)  
	(1)        key,      ,      DB,    DB   
2)    
	(1)       ,        bitmap,         key,    key     
	(2)  key  DB    ,        ,           

2.キャッシュ雪崩
1)  
	(1)   key          ,              ,    DB    、    ,    
2)    
	(1)                     ,    key         ,           
	(2)       。A1       ,A2       ,A1       A2
	(3)      reload  ,       ,                 

3.キャッシュ破壊
1)  
	(1)     key,        ,        ,         DB,    DB    、    			
2)    
	(1)   key  ,  SETNX(set if not exists)        key     key   ,          key

六、redis最適化
1.redis性能に影響する要因
1)       。          ping                       。    ,         Gbits/s                。        ,Redis             CPU
2)CPU         。      ,Redis             CPU
3)                  。     10KB   ,       。                      
4)Redis        。                 ,Redis                       
5)              ,      TCP/IP   UNIX         。     , UNIX     TCP/IP    50%    
6)      pipelining ,UNIX              
7)      Redis ,                (  1500  ) ,       pipelining     
8)  CPU      ,Redis        NUMA       
9)     ,                 。  epool/kqueue  ,Redis            
10)      ,    NIC(s)               
11)    ,Redis              ,              ,          

参考サイト
Redis学習ノート
Redis失効ポリシー
注:文章は他の文章を参考にして自分で整理したもので、一部の参考になるかもしれないし、大部分の参考になるかもしれないが、決して直接転載するわけではない.権利侵害したら削除すると思う.私はこれを自分のノートに使うだけだ.ついでに知識を整理すると同時に、一部の人を助けることができる.ps:間違いがあったら、皆さんのご指摘をお願いします.弟さんは感謝に堪えません.