redis管道(pipeline)
redis的pipeline(管道)功能在命令行中沒有,但是redis是支持管道的,在java的客戶端(jedis)中是可以使用的。
測試發現:
1:使用管道方式,插入1000條數據耗時37毫秒
Pipeline pipelined = jedis.pipelined();
long start = System.currentTimeMillis();
for (int i = 0; i < 1000; i++) {
pipelined.set("test"+i, "test"+i);
}
pipelined.sync();
System.out.println(System.currentTimeMillis() - start );
2:不使用管道方式,插入1000條數據耗時328毫秒
long
start = System.currentTimeMillis();
for (int i = 0; i < 1000; i++) {
jedis.set("test"+i, "test"+i);
}
System.out.println(System.currentTimeMillis() -start);
redis任務隊列
可以使用list的lpush和rpop實現,左進右出。brpop命令也可以彈出最後一個元素,如果集合爲空,會等待有新元素,
並彈出
brpop 有兩個參數,一個是監聽的list 一個是超時時間,如果集合中沒有元素會等待,但超過超時時間停止等待
brpop list 0 代表永不超時
任務優先級隊列
同時監聽三個list
例 brpoplist1 list2 list3 0 優先級是遞減的
redis持久化(persistence)
redis支持兩種方式的持久化,可以單獨使用或者結合起來使用。
第一種:RDB方式 (默認)
第二種:AOF方式
redis持久化之RDB
rdb方式的持久化是通過快照完成的,當符合一定條件時redsi會自動將內存中的所有數據進行快照並存儲到硬盤上。
默認存儲在redis根目錄的dump.rdb文件中。
rdb是redis默認採用的持久化方式,配置信息在配置文件redis.conf中
save 900 1:表示900秒內至少一個鍵被更改則進行快照。
save 300 10
save 60 10000
手動執行save或者bgsave命令讓redis執行快照。
兩個命令的區別在於,save是由主進程進行快照操作,會阻塞其它請求。bgsave會通過fork子進程進行快照操作。
redis實現快照的過程:
1.redis使用fork函數複製一份當前進程的副本(子進程)
2.父進程繼續接收並處理客戶端發來的命令,而子進程開始將內存中的數據寫入硬盤中的臨時文件
3.當子進程寫入完所有數據後會用該臨時文件替換舊的RDB文件,至此,一次快照操作完成
文件修復命令:redis-check-dump
rdb的優缺點
優點:由於存儲的有數據快照文件,恢復數據很方便。
缺點:會丟失最後一次快照以後更改的所有數據。
redis持久化之AOF
aof方式的持久化是通過日誌文件的方式。默認情況下redis沒有開啓aof,可以通過參數appendonly參數開啓。
appendonly yes
aof文件的保存位置和rdb文件的位置相同,都是dir參數設置的,默認的文件名是appendonly.aof,可以通過
appendfilename參數修改
appendfilename appendonly.aof
aof日誌文件重寫
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
手動執行bgrewriteaof進行重寫
redis寫命令同步的時機
appendfsync always 每次都會執行
appendfsync everysec 默認 每秒執行一次同步操作(推薦)
appendfsync no不主動進行同步,由操作系統來做,30秒一次
文件修復:redis-check-aof
動態切換redis持久方式,從 RDB 切換到 AOF(支持Redis 2.2及以上)
CONFIG SET appendonly yes
CONFIG SET save ""(該命令可選,將save參數置空了,代表不進行RDB方式持久化)
redis優化
精簡鍵名和鍵值
鍵名:儘量精簡,但是也不能單純爲了節約空間而使用不易理解的鍵名。
鍵值:對於鍵值的數量固定的話可以使用0和1這樣的數字來表示,(例如:male/female、right/wrong)
當業務場景不需要數據持久化時,關閉所有的持久化方式可以獲得最佳的性能
內部編碼優化(瞭解)
redis爲每種數據類型都提供了兩種內部編碼方式,在不同的情況下redis會自動調整合適的編碼方式。
SLOWLOG
slowlog-log-slower-than 它決定要對執行時間大於多少微秒(microsecond,1秒 = 1,000,000 微秒)的命令進行記錄
slowlog-max-len 它決定 slowlog 最多能保存多少條日誌
RedisClient -- redis可視化客戶端工具
未完待續。。。