目錄
一、什麼是redis
redis是一種鍵值型的非關係型數據庫(NoSql:not only sql),對數據的存取是在內存當中,並且支持將數據持久化到磁盤文件當中。由於性能出色、易於集羣拓展、支持數據的持久化,redis很適合作爲緩存數據庫使用。
二、關於redis的一些基本內容
(一)redis的幾種數據類型
1、字符串String:可以包含任何數據,比如jpg圖片或者序列化的對象,一個鍵最大能存儲512M
2、字典Hash:適合存儲對象,並且可以像數據庫中update一個屬性一樣只修改某一項屬性值
應用場景:存儲、讀取、修改用戶屬性
3、列表List:鏈表(雙向鏈表),增刪快
4、集合Set:是string類型的無序集合。集合是通過hashtable實現的,概念和數學中個的集合基本類似,可以交集,並集,差集等等,set中的元素是沒有順序的。所以添加,刪除,查找的複雜度都是O(1)。
應用場景:在微博中,可以將一個用戶所有的關注人存在一個集合中,將其所有粉絲存在一個集合。Redis還爲集合提供了求交集、並集、差集等操作,可以非常方便的實現如共同關注、共同喜好、二度好友等功能,對上面的所有集合操作,你還可以使用不同的命令選擇將結果返回給客戶端還是存集到一個新的集合中。
5、有序集合SortedSet:將Set中的元素增加一個權重參數score,元素按score有序排列,數據插入集合時,已經進行天然排序。
應用場景:1、排行榜 2、帶權重的消息隊列
(二)redis的事物
1、redis事務可以打包一次執行多個命令, 並且帶有以下兩個重要的保證:
事務是一個單獨的隔離操作:事務中的所有命令都會序列化、按順序地執行。事務在執行的過程中,不會被其他客戶端發送來的命令請求所打斷。
2、需要注意的是,和關係型數據庫不同的是,redis的事物並不支持回滾操作。
原因如下:Redis 命令只會因爲錯誤的語法而失敗(並且這些問題不能在入隊時發現),或是命令用在了錯誤類型的鍵上面:這也就是說,從實用性的角度來說,失敗的命令是由編程錯誤造成的,而這些錯誤應該在開發的過程中被發現,而不應該出現在生產環境中。
(三)redis的持久化
1、RDB持久化
RDB持久化,即是快照方式持久化保存redis的數據。Redis會把數據集dump到dump.rdb文件中,具體的配置可以在redis的.conf文件中查看並修改到,在文件中搜索save,可以看到。具體參數示例:
save 900 1 (在900秒(15分鐘)之後,如果至少有1個key發生變化,則dump內存快照。)
save 300 10 (在300秒(5分鐘)之後,如果至少有10個key發生變化,則dump內存快照)
2、AOF持久化
AOF持久化是指對增量保存redis的數據,就是保存redis的修改內容。具體有三種同步方式
appendfsync always (每次有數據修改發生時都會寫入AOF文件)
appendfsync everysec (每秒鐘同步一次,該策略爲AOF的缺省策略)
appendfsync no (從不同步。高效但是數據不會被持久化)
並且,redis並不是只支持一種持久化方式,而是兩種持久化方式可以結合起來一起使用。我的建議是,AOF使用每秒同步一次的策略,RDB使用“save 300 10 ”參數。
總結,RDB做鏡像全量持久化,aof做增量持久化。因爲bgsave會耗費較長時間,不夠實時,在停機的時候會導致大量丟失數據,所以需要aof來配合使用。在redis實例重啓時,優先使用aof來恢復內存的狀態,如果沒有aof日誌,就會使用rdb文件來恢復。
三、redis作爲緩存要注意的問題
大體上來說,用redis作爲緩存使用會出現的問題,一方面是請求沒有落到緩存裏面,而是大量的數據請求都到了數據庫當中,熟悉關係型數據庫的都知道,其實關係數據庫是很脆弱的,請求量大很容易造成數據庫的崩潰。另一方面是緩存數據和數據庫數據同步的問題了,這又涉及到代碼應該如何處理緩存數據的方法了。還有就是redis搭建集羣,內部的數據同步等一些問題。
1、緩存穿透
概念:查詢一個一定不存在的數據,就會使得緩存中一直沒有數據,請求一直會落到數據庫當中。
解決方式:(1)可以把此鍵對應的數據對象緩存一個空對象放到redis當中,但是要設置一個較短的緩存過期時間,我設置的是60s,防止數據庫有更新了數據但是緩存中又一直還是空值。
(2)使用“布隆”過濾器,把所有可能存在的值都放到一個bitmap中。
2、緩存擊穿
概念:緩存擊穿是指緩存中沒有但數據庫中有的數據(一般是緩存時間到期),這時由於併發用戶特別多,同時讀緩存沒讀到數據,又同時去數據庫去取數據,引起數據庫壓力瞬間增大,造成過大壓力
解決方式:(1)設置熱點數據不過期,或者即使沒有請求,也預先去把一些熱點數據放到緩存當中。
(2)加互斥鎖,減少數據庫訪問。
3、緩存雪崩
概念:緩存雪崩是指緩存中數據大批量到過期時間,而查詢數據量巨大,引起數據庫壓力過大甚至down機。和緩存擊穿不同的是, 緩存擊穿指併發查同一條數據,緩存雪崩是不同數據都過期了,很多數據都查不到從而查數據庫。
解決方式:(1)設置緩存的過期時間隨機,防止同一時間大量數據過期現象。
(2)設置熱點數據不過期
內容如有不當之處,歡迎指正、轉載,轉載註明出處,以上。