Learning Redis - 概念

Redis 十分的流行,學習一下,在此留底 。 Redis中文

Redis 是一個高性能的key-value數據庫。

性能測試結果:SET操作每秒鐘 110000 次,GET操作每秒鐘 81000 次,

服務器配置如下:Linux 2.6Xeon X3320 2.5Ghz.

stackoverflow 網站使用 Redis 做爲緩存服務器。

國內外3個不同領域多巨頭的實踐

1. Redis存儲,來自淘寶搜索技術博客

2. 來自InfoQ    

爲什麼使用redis  

Redis使用單線程的IO複用模型,自己封裝了一個簡單的AeEvent事件處理框架,主要實現了epoll、kqueue和select,對於單純只有IO操作來說,單線程可以將速度優勢發揮到最大,但是Redis也提供了一些簡單的計算功能,比如排序、聚合等,對於這些操作,單線程模型實際會嚴重影響整體吞吐量,CPU計算過程中,整個IO調度都是被阻塞住的。

Redis 由於是單線程的,因此部署的時候爲了發揮多核CPU的性能,可以考慮有CPU有多少核就裝多少個實例。目前實現Shard是在客戶端,根據一致性hash調用不同的Redis實例


redis內存使用優化和存儲

redis複製與可擴展集羣搭建

Redis 的一些相關概念

1. 持久化策略

Dump:Snapshotting(快照),當redis掛掉後會丟掉最後一次快照到掛掉時的數據,當redis掛掉後會丟掉最後一次快照到掛掉時的數據
AOF:Append-only file,Redis會將每一個收到的寫命令都通過write函數追加到文件中,類似於MySQL中的binlog。默認寫入文件爲:appendonly.aof。當redis重啓時會通過執行文件中保存的寫命令來在內存中重建整個數據庫內容
None:不持久化

2. 寫策略

SyncMaster:同步寫入
asyncMaster:異步寫入

3. 讀策略

MasterOnly:Redis集羣中僅以主爲讀
SlaveOnly:Redis集羣中僅以從爲讀
MasterFirst:Redis集羣中讀取數據的優先級以主爲先
SlaveFirst:Redis集羣中讀取數據的優先級以從爲先
RoundRbin:Redis集羣中輪流讀取數據

4. 狀態

Pending:試運行
Maintaining:維護
Destroyed:已終止

5. 分片算法

Jedis:官方推薦的redis java客戶端

6. 哈希算法

MD5
MurmurHash

7. 內存

  1. Redis memory:redis內存情況
  2. used_memory_rss : 從操作系統的角度,返回 Redis 已分配的內存總量(俗稱常駐集大小)。這個值和 top 、 ps 等命令的輸出一致。
  3. used memory:由 Redis 分配器分配的內存總量,以字節(byte)爲單位
  4. used_memory_peak : Redis 的內存消耗峯值(以字節爲單位)

8.  參數說明

分別列出了server、clients、memory、persistence、stats等方面的信息,具體參數介紹如下:
Server:
1、redis_version :Redis 服務器版本
2、redis_git_sha1 :Git SHA1
3、redis_git_dirty :Git dirty flag
4、arch_bits :操作系統(32 或 64 位)
5、multiplexing_api :Redis 所使用的事件處理機制
6、gcc_version :編譯 Redis 時所使用的 GCC 版本
7、process_id :服務器進程的 PID
8、uptime_in_seconds :自 Redis 服務器啓動以來,經過的秒數
9、uptime_in_days :自 Redis 服務器啓動以來,經過的天數
10、lru_clock :以分鐘爲單位進行自增的時鐘,用於 LRU 管理 
Clients:
1、connected_clients :已連接客戶端的數量(不包括通過從屬服務器連接的客戶端)
2、client_longest_output_list :當前連接的客戶端當中,最長的輸出列表
3、client_biggest_input_buf :當前連接的客戶端當中,最大輸入緩存
4、blocked_clients :正在等待阻塞命令(BLPOP、BRPOP、BRPOPLPUSH)的客戶端的數量 
Memory:
1、used_memory :由 Redis 分配器分配的內存總量,以字節(byte)爲單位
2、used_memory_human :以可讀的格式返回 Redis 分配的內存總量
3、used_memory_rss :從操作系統的角度,返回 Redis 已分配的內存總量(俗稱常駐集大小)。這個值和 top 、 ps 等命令的輸出一致
4、used_memory_peak :Redis 的內存消耗峯值(以字節爲單位)
5、used_memory_peak_human :以可讀的格式返回 Redis 的內存消耗峯值
6、used_memory_ratio :內存使用率(%)
7、mem_allocator :在編譯時指定的, Redis 所使用的內存分配器。可以是 libc 、 jemalloc 或者 tcmalloc 
Persistence:
1、loading :負載轉儲文件是否持續的標識
2、rdb_changes_since_last_save :自上次轉儲的變化數
3、rdb_bgsave_in_progress :reb保存持續的標識
4、rdb_last_save_time :rdb保存成功的時間戳
5、aof_enabled:表示aof是否被激活的標識
6、aof_rewrite_in_progress:AOF是否重寫的標識
7、aof_current_size:AOF當前文件大小
8、aof_base_size :AOF最新啓動或重寫文件大小
9、aof_pending_rewrite:一旦持續rdb保存完成標識,表示aof重寫操作將完成
10、aof_buffer_length:AOF緩衝區的大小
11、aof_pending_bio_fsync:I / O隊列FSYNC未決的作業數量 
Stats:
1、total_commands_processed :服務器執行命令的總數
2、total_connections_received :服務器接受的連接的總數
3、evicted_keys :命中 key 的次數
4、expired_keys :運行以來過期的 key 的數量
5、keyspace_hits :命中 key 的次數
6、keyspace_misses :不命中 key 的次數
7、latest_fork_usec :是否開啓了 vm
8、pubsub_channels :當前使用中的頻道數量
9、pubsub_patterns :當前使用的模式的數量 
Replication:
1、role :角色(主、從)
2、connected_slaves :從屬服務器的數量
3、slaveof:設置當本機爲slav服務時,設置master服務的IP地址及端口,在Redis啓動時,它會自動從master進行數據同步 
Cpu:
1、sed_cpu_sys :Redis的服務器系統CPU消耗
2、used_cpu_sys_children :系統後臺進程所消耗的CPU
3、used_cpu_user :Redis的服務器用戶CPU消耗
4、used_cpu_user_children :用戶後臺進程所消耗的CPU 
Vm:

  1. vm_enabled :是否使用虛擬內存,默認值爲no

Custom:

  1. _db_expires:存儲的有限期

     2. _db_keys:存儲鍵值總數

9. 配置信息

配置信息具體參數介紹如下:
1、loglevel:指定日誌記錄級別,Redis總共支持四個級別:debug、verbose、notice、warning,默認爲verbose
2、maxmemory:指定Redis最大內存限制,Redis在啓動時會把數據加載到內存中,達到最大內存後,Redis會先嚐試清除已到期或即將到期的Key,當此方法處理 後,仍然到達最大內存設置,將無法再進行寫入操作,但仍然可以進行讀取操作。Redis新的vm機制,會把Key存放內存,Value會存放在swap區
3、maxmemory-policy:設置驅逐政策(eviction policy)
4、maxmemory-samples:LRU和minimal TTL是近似算法(爲了節省內存),它們會在一個有3個鍵值的樣本中選擇較沒用的那個
5、timeout:當客戶端閒置多長時間後關閉連接,如果指定爲0,表示關閉該功能
6、dir:redis服務器指定本地數據庫存放目錄
7、dbfilename:指定本地數據庫文件名,默認值爲dump.rdb
8、appendonly:是否開啓AOF持久化,yes開啓,no不開啓
9、slowlog-max-len:慢日誌的最大長度是128,當慢日誌超過128時,最先進入隊列的記錄會被踢出來,慢日誌會消耗內存,你可以使用SLOWLOG RESET清空隊列回收這些內存
10、appendfsync:指定更新日誌條件,共有3個可選值: 
no:表示等操作系統進行數據緩存同步到磁盤(快) 
always:表示每次更新操作後手動調用fsync()將數據寫到磁盤(慢,安全) 
everysec:表示每秒同步一次(折衷,默認值)
11、4、auto-aof-rewrite-min-size:啓動重寫Aof log時,Aof log的最小大小
12、auto-aof-rewrite-percentage:當Aof log增長超過指定比例時,重寫log file, 設置爲0表示不自動重寫Aof log
13、no-appendfsync-on-rewrite:如果爲yes,當BGSAVE或BGREWRITEAOF指令運行時,即把AOF文件轉寫到RDB文件中時,會阻止調用fsync()
14、save:指定在多長時間內,有多少次更新操作,就將數據同步到數據文件,可以多個條件配合
save <seconds> <changes>
Redis默認配置文件中提供了三個條件:
save 900 1
save 300 10
save 60 10000
15、hash-max-zipmap-entries:如果Hash中字段的數量小於參數值,Redis將對該Key的Hash Value採用特殊編碼。
16、hash-max-zipmap-value:如果Hash中各個字段的最大長度不超過512字節,Redis也將對該Key的Hash Value採用特殊編碼方式
17、list-max-ziplist-entries:配置元素個數最多512個
18、list-max-ziplist-value:配置value最大爲64字節
19、set-max-intset-entries:如果set中整型元素的數量不超過512時,Redis將會採用該特殊編碼。
20、zset-max-ziplist-entries:類似於上面
21、zset-max-ziplist-value:類似於上面
22、slowlog-log-slower-than:當某個請求執行時間(不包括IO時間)超過10000微妙(10毫秒),把請求記錄在慢日誌中 ,如果爲負數不使用慢日誌,如果爲0強制記錄每個指令

10. 集羣參數
1、_cpu_usage_children_perc:後臺子進程CPU使用率
2、_cpu_usage_perc:CPU使用率
3、_evicted_keys_per_sec:每秒置換鍵值總數
4、_expired_keys_per_sec:每秒過期的鍵值總數
5、_keyspace_hits_perc:查詢命中率
6、_maxmemory:置最大內存,達到最大內存設置後,Redis會先嚐試清除已到期或即將到期的Key,當此方法處理後,任到達最大內存設置,將無法再進行寫入操作
7、_rejected_connections_per_sec:每秒拒絕連接數
8、_total_commands_processed_per_sec:每秒執行命令數
9、_total_connections_received_per_sec:每秒新建連接數
10、aof_current_rewrite_time_sec:aof重寫操作的持續時間
11、aof_delayed_fsync:延遲FSYNC計數器
12、aof_last_bgrewrite_status:AOF重寫的最後操作的狀態
13、aof_last_rewrite_time_sec:aof最後一次寫操作的持續時間
14、aof_rewrite_buffer_length:AOF重寫緩衝區的大小
15、aof_rewrite_scheduled:一旦持續rdb保存完成標識,表示aof重寫操作將完成
16、cluster_enabled :Redis的羣集啓用
17、connected_clients :已連接客戶端的數量(不包括通過從屬服務器連接的客戶端)
18、instantaneous_ops_per_sec:每秒處理的命令數
19、loading_eta_seconds :設置eta的負載完整時間
20、loading_loaded_bytes :已加載的字節數
21、loading_loaded_perc :已加載的相同的值的百分比表示
22、loading_start_time :在加載操作開始的時間戳
23、loading_total_bytes :總文件大小
24、master_host :主服務器的主機名或IP
25、master_last_io_seconds_ago :自上次與主服務器互動的秒數
26、master_link_down_since_seconds :中斷以後連接的秒數
27、master_link_status :連接狀態(up/down)
28、master_port :主服務器的端口號
29、master_sync_in_progress :主機同步到從服務器
30、master_sync_last_io_seconds_ago :主服務器最後一次同步從服務器io傳輸的秒數
31、master_sync_left_bytes :離開之前完成的同步字節數
32、mem_fragmentation_ratio :used_memory_rss 和 used_memory 之間的比率
33、os :Redis 服務器的宿主操作系統
34、rdb_current_bgsave_time_sec :reb保存持續時間
35、rdb_last_bgsave_status :RDB最後保存的狀態
36、rdb_last_bgsave_time_sec :rdb最後保存的持續時間以秒錶示
37、rejected_connections :因爲MaxClients的限制,拒絕的連接數
38、run_id :Redis 服務器的隨機標識符(用於 Sentinel 和集羣)
39、slowlog_len :慢日誌長度
40、tcp_port :TCP/IP 監聽端口
41、used_memory_lua :Lua 引擎所使用的內存大小(以字節爲單位)

配置列:
1、activerehashing:指定是否激活重置哈希,默認爲開啓
2、bind:綁定的主機地址
3、client-output-buffer-limit:
4、daemonize:Redis默認不是以守護進程的方式運行,可以通過該配置項修改,使用yes啓用守護進程
5、databases:設置數據庫的數量,默認數據庫爲0,可以使用SELECT <dbid>命令在連接上指定數據庫id
6、hash-max-ziplist-entries:含義基本等同於hash-max-zipmap-entries兩個和Hash相關的參數,只是作用的對象類型爲List
7、hash-max-ziplist-value:含義基本等同於hash-max-zipmap-value兩個和Hash相關的參數,只是作用的對象類型爲List
8、logfile:日誌記錄方式,默認爲標準輸出,如果配置Redis爲守護進程方式運行,而這裏又配置爲日誌記錄方式爲標準輸出,則日誌將會發送給/dev/null
9、lua-time-limit:一個Lua腳本最長的執行時間爲5000毫秒(5秒),如果爲0或負數表示無限執行時間。
10、masterauth:當master服務設置了密碼保護時,slav服務連接master的密碼
11、maxclients:設置同一時間最大客戶端連接數,默認無限制,Redis可以同時打開的客戶端連接數爲Redis進程可以打開的最大文件描述符數,如果設置 maxclients 0,表示不作限制。當客戶端連接數到達限制時,Redis會關閉新的連接並向客戶端返回max number of clients reached錯誤信息
12、maxmemory:指定Redis最大內存限制,Redis在啓動時會把數據加載到內存中,達到最大內存後,Redis會先嚐試清除已到期或即將到期的Key,當此方法處理 後,仍然到達最大內存設置,將無法再進行寫入操作,但仍然可以進行讀取操作。Redis新的vm機 制,會把Key存放內存,Value會存放在swap區
13、maxmemory-policy:設置驅逐政策(eviction policy)
14、maxmemory-samples:LRU和minimal TTL是近似算法(爲了節省內存),它們會在一個有3個鍵值的樣本中選擇較沒用的那個
15、28、pidfile:當Redis以守護進程方式運行時,Redis默認會把pid寫入/var/run/redis.pid文件,可以通過pidfile指定
16、port:指定Redis監聽端口,默認端口爲6379
17、rdbchecksum:存儲和加載rdb文件時是否校驗
18、rdbcompression:指定存儲至本地數據庫時是否壓縮數據,默認爲yes,Redis採用LZF壓縮,如果爲了節省CPU時間,可以關閉該選項,但會導致數據庫文件變的巨大
19、repl-disable-tcp-nodelay:
20、repl-ping-slave-period:slave發送ping給master的時間間隔,單位是秒
21、repl-timeout:Bulk transfer I/O超時,或ping響應超時,單位是秒,值必須要比repl-ping-slave-period大
22、requirepass:設置Redis連接密碼,如果配置了連接密碼,客戶端在連接Redis時需要通過AUTH <password>命令提供密碼,默認關閉
23、slave-priority:如果master不能再正常工作,那麼會在多個slave中,選擇優先值最小的一個slave提升爲master,優先值爲0表示不能提升爲master
24、slave-read-only:如果爲yes,slave實例只讀,如果爲no,slave實例可讀可寫
25、slave-serve-stale-data:當slave失去與master的連接,或正在拷貝中,如果爲yes,slave會響應客戶端的請求,數據可能不同步甚至沒有數據,如果爲no,slave會返回錯誤"SYNC with master in progress"
26、slaveof:設置當本機爲slav服務時,設置master服務的IP地址及端口,在Redis啓動時,它會自動從master進行數據同步
27、stop-writes-on-bgsave-error:後臺存儲錯誤是否停止寫
28、tcp-keepalive: 驗證tcp的激活狀態
29、unixsocket:連接本地unix系統的socket
30、unixsocketperm:連接本地unix系統的socket
31、watchdog-period:watchdog-period參數,其值單位爲毫秒,運行時間超過指定毫秒的操作將會被記錄下來
32、shard:分片
33、address:ip地址和對應的端口號
34、redis_instance:redis實例
35、redis_master:redis主服務器
36、redis_slave:redis從發服務器
37、alive:存活性

11. 監控參數

  1. memory:數據佔用內存量
  2. cpu_usage_perc:每秒中cpu使用率

      3. clients:每秒中客戶端鏈接數

  1. mem_fragmentation_ratio:內存碎片率
  2. client_lol:client_longest_output_list,當前連接的客戶端當中,最長的輸出列表
  3. client_bib:client_biggest_input_buf,當前連接的客戶端當中,最大輸入緩存
  4. slowlog:慢日誌
  5. cps:每秒中新建連接數
  6. ops:每秒中操作數
  7. rejected_connections_per_sec:拒絕連接數

10、hits_perc:命中率
11、k_db:存儲鍵值總數
12、expired_ecicted_kps:每秒中過期並被逐出的key


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章