redis簡介
- redis:高性能鍵值對nosql數據庫,以單線程方式處理請求(原子性操作),基於內存存取數據。解決海量用戶,高併發情況下數據處理問題。
- 問題描述:關係型數據庫在海量數據,高併發下數據處理的問題
- 1、性能瓶頸:磁盤IO性能低下。
- 2、擴展瓶頸:關係型數據庫數據之間關係複雜,擴展性差,不便於大規模集羣。
- 解決方案:
- 1、內存IO
- 2、去掉數據鍵的複雜性
- redis特性
- 1、數據間無聯繫
- 2、高性能、單線程(操作都是原子性,不必考慮併發帶來的問題)
- 3、多數據類型支持
- string
- list
- hash
- set
- sorted_set
- 4、數據持久化RDB/AOF,防止數據災難
- RDB:數據快照,當前數據保存到文件中。(默認)
- AOF:記錄所有寫命令到文件,再次開啓數據庫時執行一遍寫命令。
- redis應用
- 爲熱點數據加速查詢(主要場景),如熱點商品、熱點新聞、熱點資訊、推廣類等高訪問量信息等
- 任務隊列,如秒殺、搶購、購票排隊等
- 即時信息查詢,如各位排行榜、各類網站訪問統計、公交到站信息、在線人數信息(聊天室、網站)、設
備信號等 - 時效性信息控制,如驗證碼控制、投票控制等
- 分佈式數據共享,如分佈式集羣架構中的 session 分離
- 消息隊列
- 分佈式鎖
- 命令
- 幫助命令
- 單個命令help command
- 組命令help @string(組有string,list,hash…等)
- 清屏命令 clear
- 存取命令說明
- 存相關命令:不存在原信息,則創建, 存在則替換
- 取相關命令:不存在原信息,則返回nil
- set 和mset 使用場景
- 當數據量夠大時,由於redis採用單線程處理,三個單獨的set,效率不如一次mset三個數據,但是一次mset的數據也不能太大,否則單線程就阻塞在這裏了,當數據量過大,可拆分成合適大小處理。
- 幫助命令
使用案例
- 數據庫表id生成 incr
- redis所有操作都是原子性,incr自增操作生成數據庫id
- 支持分表
- 支持數據庫集羣
- 投票(每4小時只能投一票) setex(秒) psetex(毫秒)
- 控制基於時效性的業務對象
- 投完票記錄下投票者的id,存入redis中,設置過期時間爲4小時,再次投票時判斷redis中是否存在,存在(沒過期)即不能再次投票。
- redis用於各種高熱度結構性和非結構性數據
- 場景:明星的微博主頁和我們的微博主頁相比,他們的就是高熱度的。此時他們主頁的相關數據應存放的redis裏,以便快速響應高併發的訪問。
- 數據結構如下:
- user:id:fans
- user:id:focus
- 我們可以如上在redis中分開存放,也可以使用json同時存放,那種效果好視具體情況而定
- user:id:{fans:100,focus:10}
- redis中的數據大部分還是來自數據庫,因此常用如下命名規則
- 表名:主鍵名:主鍵值:字段名
- user :id :100 :name
- hash結構適用於搶購,限購,限量優惠券,激活碼等業務的數據存儲。
- list應用場景
- 微博,微信點贊等,需要按照順序顯示關注的人,點讚的人,需要按照先後順序呈現的數據 ,特別關注,最新發博,分組等。
- set應用場景
- 隨機推薦類信息檢索,例如熱點歌單,熱點新聞推薦,熱點旅遊線路,APP推薦,大V推薦。
- 使用set 的交集,並集,差集等處理共同好友顯示,推薦好友,共同關注的公衆號等數據的處理
- 數據不可重複,交叉數據類型處理
- 同類型數據去重,統計訪問網站的不同用戶,IP
- 網站流量監控方面
- 1、PV:查看了頁面就+1 ----string incr
- 2、UV:不同用戶訪問,只有不同用戶才+1,set
- 3、IP:不同IP才+1,set
- 網站流量監控方面
- 黑白名單
- sorted_set應用場景
- 在set基礎上主要應用點:需要排序/權重/優先級(優先級可由多個級別共同組成)
- 排行榜,投票,有優先級的任務。
各類型注意事項
- string類型注意事項
- 數據操作成功與否和數據操作正常返回之間的差異
- (integer)0:false
- (integer)1:true
- 如上是操作失敗和成功,strlen命令返回1的話代表正常返回,所以0,1代表成功還是失敗還要參照具體執行的命令。
- 未獲取到數據返回nil
- string 類型數據最大存儲量521M
- string類型數字範圍(正負)java.lang.Long.MAX_VALUE
- 數據操作成功與否和數據操作正常返回之間的差異
- hash類型注意事項
- 使用json還是hash結構存儲值
- 上面提到user:id裏的幾個屬性可以分開存,也可以放在一個json字符串裏存,當然也可以放在一個hash結構裏,只不過在於業務的需求,選擇一種合適的方式即可。json存放,如果要修改其中某一個數據有點麻煩,如果數據不需要實時刷新,我們可以定時刷新裏面數據即可。hash存放,可以實時修改裏面某個屬性的值。
- hash結構中屬性的多少時的結構差異
- 存儲少量屬性:使用類數組結構
- 存儲大量屬性:使用hashmap結構
- hash類型的value只能存儲字符串,不允許存儲其它數據類型,不存在嵌套現象。
- hash中最多隻能存儲2的32次方-1個鍵值對
- hash類型十分貼近對象的存儲結構,可方便對屬性進行增加和刪除,但它並非爲對象而生,不能濫用。
- hgetall獲取所有屬性,入股屬性過多會導致效率低下,慎用。
- 使用json還是hash結構存儲值
- list數據類型
- 存儲結構:底層使用雙向鏈表結構,正因爲是雙向列表,所以既可以從左進左出,右進右出,故有如下命令
- lpush
- rpush
- lpop
- rpop
- 獲取數據(0代表第一個,-1代表倒數第一個,-2代表倒數第二個)
- lrange
- lindex
- llen
- list擴展:指定時間內獲取並移除數據
- blpop key1 [key2] timeout
- brpop key1 [key2] timeout
- brpoplpush source destination timeout
- b表示block,阻塞,阻塞期間如果list中有數據或者新存入了數據,就讀取並刪除。
- lrem key count value
- 左邊刪除count個value(list是允許value重複的,故有count表示個數值)
- list類型注意事項(應用於操作先後順序的的業務數據)
- value只能是string,最多隻能存儲2的32次方-1個值
- list實現底層是雙向鏈表(讀取速度稍慢),可左右進出,操作方式可以是隊列或者棧(左進左出---->先進先出)
- -1表示倒數第一個值
- 分頁,第一個在redis中,後續再數據庫中查詢(第一頁看的比較多,後面頁看的較少的時候)
- 存儲結構:底層使用雙向鏈表結構,正因爲是雙向列表,所以既可以從左進左出,右進右出,故有如下命令
- set類型
- 命令
- sadd key member [member…]
- smembers key
- srem key member1 [member2…]
- scard key 獲取集合數據總量
- sismember key member 判斷集合中是否包含指定數據
- 隨機取/隨機取並移除
- srandmember key count 隨機取
- spop key count 隨機取並移除
- 命令
- sorted_set類型(set的基礎上添加了排序,存儲時指定score的值進行排序,注意score並不是指,只用於排序而已)
- 存儲、取、刪除、升序顯示(默認)、降序顯示(zrevrange)、是否顯示score(withscores)
- sorted_set中score值的獲取和修改
- zscore key member
- zincrby key increment member 可應用於投票和排序
redis適用場景
- 創建數據庫表id,支持分表以及數據庫集羣
- 把string類型的數字當做整型處理,incr自增得表id
- 控制熱點事物的時效性,通過數據是否失效控制業務行爲
- 熱點新聞多久失效,SETEX
- 微信投票時效性,SETEX
- 微信投票,規定每四個小時只能,記錄投票用戶id,設置過期時間爲四小時。
- 高頻,熱點信息
- 新浪微博明星主頁
- 頭條熱點新聞
- 百度頭條新聞,熱點新聞排行榜