redis相對memcache來說,支援了更多的資料型別,在使用場景上面無疑是更加的便捷
string: 可以儲存任何形式的字串,內部實現結構有int,sds(****** dynamisc string),當值為整型時,使用int結構存放,非整型時使用sds儲存
list: 當list的節點小於配置: hash-max-ziplist-entries 或者elem_value字串的長度小於 hash-max-ziplist-value,採用ziplist儲存,以便節約記憶體, 當大於時採用雙向鍊錶儲存 ,list兩端的查詢複雜度為o(1),中間為o(n)
map:新建的hash型別也使用ziplist儲存value,儲存資料過多時,轉而使用hast table。
sortset:如果新建的sortset包含value數大於配置或者value長度大於配置值,則直接使用hash table和skip list儲存value,skip list實現對value的排序;否則直接使用skip list儲存value。
set :value 值為int時採用intset儲存,當值的個數大於配置時,採用hash table
簡易事務的支援
redis提供的事務更像是一組命令的批處理,和關係型資料庫最大的區別在於不會回滾.
使用方法:
reids.mulit; 開始事務
redis.set(key,value);
redis.set(key1,value1);
redis.exec;
pipeline:批量提交多組命令,減少網路請求壓力
我們知道,redis是基於單執行緒的, 對於批量操作多個key這種場景來說,每次請求無疑會增加網路請求耗時,所以redis提供了這種命令用來提供個批量寫入這種場景使用,不保證乙個管道裡的命令全部成功.
lua:指令碼.詳見後續文件
兩種方式
aof: 三種策略 ,效能依次從低到高
always 總是寫入
everysec 每秒儲存
no 禁用同步策略,只追加命令,何時落盤,由作業系統保證(大多數liunx系統,每30s進行一次fsync,將快取區的資料落入磁碟)
兩種方式的區別
rdb實際上是fork出乙個子程序,通過子程序來寫入臨時檔案,當臨時檔案完成後通過寫複製模式的原子性替換舊的檔案
aof實際上是追加命令,通過類似於日誌的方式記錄每一條寫的命令(包含新增,修改,刪除),儲存的檔案格式相對簡單,便於檢視,解析。
兩種方式的優缺點
rdb的優點:
使用rdb做持久化的時候,整個redis只會有乙份資料檔案,對於檔案備份來說,可以很輕易的備份任意時間點的資料。
效能高,是已知redis持久化方式中效能最高的一種。
災備恢復最快,當資料集過大時,rdb的恢復效率更高,這是相對於aof來說,rdb的檔案相對較小。
rdb的缺點:
持久化的力度過粗,如果在這一次fork還為完成的時候機器宕機,那麼上一次持久化之後的資料都會丟失。
rdb的機制在fork子程序執行持久化的時候,會阻塞主線程,在資料集過大的情況下會導致服務終端幾百毫秒甚至幾秒。
aof的優點:
1.更完整的持久化機制,這種方式給我們提供了三種策略,其中 always是同步持久化,也就是說資料變更會立即落入磁碟。
2. aof是通過追加的方式來實現持久化,因此當伺服器宕機的時候,也不會損壞已經追加完成的資料,最多丟失當前寫入的那條資料.如果在寫入中途宕機,導致檔案損壞,在下一次啟動前可以通過redis-check-aof來解決檔案問題。
3. aof的儲存文字格式更清晰,更易於理解,當意外flush db 的時候,在服務還沒有rewrite之前,我們可以通過該檔案手動修改命令,讓該命令失效。
aof的缺點:
1.持久化檔案相對於rdb來說更大,恢復資料起來慢於rdb。
2.效能上低於rdb,只有在禁用同步策略的時候和rdb效能持平。
兩種場景的選擇:看業務場景的需要,是需要犧牲一些效能換取更高的資料一致性,還是需要更高的效能降低點資料一致性.
redis基本知識
sds字串的優點 杜絕緩衝區溢位 在c語言中,新增字串都會假設儲存的長度能足夠的容納新增的字串,然而新增長度一旦超過了儲存的長度,就會存在緩衝區溢位,使得新增的字串被擷取,導致新增字串內容丟失。減少修改字串時帶來的記憶體重分配次數 c語言中,字串本身並不記錄自身的長度,而字串的底層實現總是乙個n 1...
Redis基本知識
redis 是什麼?redis remote dictionary server 即遠端字典服務 使用ansi c語言編寫 支援網路 可基於記憶體亦可持久化的日誌型 key value資料庫,並提供多種語言的api。免費,開源,是當下最熱門的 nosql 技術之一。redis 可以做什麼?redis...
redis基本知識
redis預設有16個資料庫 預設使用第0個 使用select切換資料庫 dbsize檢視大小 keys 檢視資料庫所有的key flushdb清除當前資料庫 flushall清除全部資料庫 redis是單執行緒的基於記憶體操作 核心 redis是將所有的資料庫全部放在記憶體中,所以使用單執行緒去操...