redis入門學習筆記


1.redis簡介


在我們日常的Java Web開發中,無不都是使用數據庫來進行數據的存儲,由於一般的系統任務中通常不會存在高併發的情況,所以這樣看起來並沒有什麼問題


可是一旦涉及大數據量的需求,比如一些商品搶購的情景,或者是主頁訪問量瞬間較大的時候,單一使用數據庫來保存數據的系統會因爲面向磁盤,磁盤讀/寫速度比較慢的問題而存在嚴重的性能弊端,一瞬間成千上萬的請求到來,需要系統在極短的時間內完成成千上萬次的讀/寫操作,這個時候往往不是數據庫能夠承受的,極其容易造成數據庫系統癱瘓,最終導致服務宕機的嚴重生產問題。
  
爲了克服上述的問題,Java Web項目通常會引入NoSQL技術,這是一種基於內存的數據庫,並且提供一定的持久化功能。


Redis和MongoDB是當前使用最廣泛的NoSQL,而就Redis技術而言,它的性能十分優越,可以支持每秒十幾萬此的讀/寫操作,其性能遠超數據庫,並且還支持集羣、分佈式、主從同步等配置,原則上可以無限擴展,讓更多的數據存儲在內存中,更讓人欣慰的是它還支持一定的事務能力,這保證了高併發的場景下數據的安全和一致性。


Redis 在 Java Web 中的應用
Redis 在 Java Web 主要有兩個應用場景:存儲緩存用的數據;需要高速讀/寫的場合使用它快速讀/寫;
  
在日常對數據庫的訪問中,讀操作的次數遠超寫操作,比例大概在 1:9 到 3:7,所以需要讀的可能性是比寫的可能大得多的。當我們使用SQL語句去數據庫進行讀寫操作時,數據庫就會去磁盤把對應的數據索引取回來,這是一個相對較慢的過程。


如果我們把數據放在 Redis 中,也就是直接放在內存之中,讓服務端直接去讀取內存中的數據,那麼這樣速度明顯就會快上不少,並且會極大減小數據庫的壓力,但是使用內存進行數據存儲開銷也是比較大的,限於成本的原因,一般我們只是使用 Redis 存儲一些常用和主要的數據,比如用戶登錄的信息等。


在如今的互聯網中,越來越多的存在高併發的情況,比如天貓雙11、搶紅包、搶演唱會門票等,這些場合都是在某一個瞬間或者是某一個短暫的時刻有成千上萬的請求到達服務器,如果單純的使用數據庫來進行處理,就算不崩,也會很慢的,輕則造成用戶體驗極差用戶量流失,重則數據庫癱瘓,服務宕機,而這樣的場合都是不允許的!
  
2.redis的下載安裝


網站:https://github.com/microsoftarchive/redis/tags
  
3.redis的基本操作


String類型:
存儲結構:
redis自身是一個Map,其中所有的數據都是採用key:value的形式存儲(key  value)
String類型說的是右邊的value類型是string類型
基本操作:
  添加/修改數據:set key value 
  獲取數據:get  key
  刪除數據:del  key
  添加/修改多個數據:mset key1 value1 key2 value2
  獲取多個數據:mget key1 key2 ...
  獲取數據字符個數:strlen key
  追加信息到原始信息的尾部:append key value
擴展操作:
  (業務場景:分表時保證主鍵唯一)
  設置數值增加指定範圍incr key
  增加指定大小incrby key increment
  設置數值減少指定範圍decr key
  減少指定大小decrby key increment
  (業務場景:限時投票)
  設置數據具有指定的生命週期setex key seconds value
注意:
  a.單數據操作比多數據操作在一定程度上效率更高
  b.string在redis內部默認是一個字符串,當遇到增減類型incr,decr時會轉成數值類型進行計算
  c.redis所有操作都是原子性的,採用單線程處理所有業務,命令是一個一個執行的。因此無需考慮併發帶來的影響
  d.按數值進行操作的數據,如果原始數據不能轉成數值,或超過了redis數值類型上限,將會報錯
string類型的應用場景:
  a.微博關注量(在redis中以用戶主鍵和屬性作爲key)  
  user:id:123:fans        1232
  user:id:123    {id:123,name:吳京,fans:121321}


hash類型:
  思考:string類型在取值的時候很方便,但是在更新的時候會顯得笨重。
  存儲結構:一個存儲空間保存多個鍵值對數據
  例如:key  field1 value1  field1 value2
基本操作:
  增加修改數據hset key field value
  獲取hget key field/hgetall key
  刪除數據hdel key field
  添加/修改多個數據hmset key field1 value1 field2 value2
  獲取多個數據hmget key field1 field2
  獲取hash表中字段的數量hlen key
  獲取哈希表中是否存在指定的字段hexists key field(如果存在field值返回1,不存在返回0)
擴展操作:
  獲取哈希表中所有的字段名或字段值hkeys key/hvals key
  設置指定字段增加範圍hincrby key increment
  有field不讓修改,沒有加上hsetnx key field value
注意事項:
  a.hash類型的value只能存字符串,不允許存其他類型的值
  b.每個hash可以存儲2^32-1個鍵值對
  c.hash類型十分貼近對象的數據存儲形式,可以靈活的增刪改查對象屬性,但hash設計的初衷不是爲了存儲大量對象的,因此不可將hash作爲對象列表使用
應用場景:
  電商購物車設計與實現
  購物車商品  商品id:field
  商品數量   value
  購物車全部商品   hlen獲取總量
  以用戶id作爲key,商品編號作爲field,數量作爲爲value進行存儲
  商品搶購(雙11,某商家推出A產品100搶購數量,B產品50,C產品10)
     以商家id作爲key
     參與搶購商品的id作爲field
     商品數量作爲value
     以降值的方式控制數量
思考:string和hash都可以存儲對象,分別的優缺點?(String偏向整體性,hash偏向靈活性) 


list類型
數據存儲需求:存儲多個數據,並對存儲空間進行順序的區分
存儲結構:一個存儲空間保存多個數據,並且可通過順序獲取空間內容,底層使用的是雙向鏈表結構
基本操作:
  增加修改數據:lpush key value1[value2](左進)/rpush key value1[value2](右進)
  獲取數據:lrange key start
  根據下表獲取元素:lindex key index
  獲取長度:llen
  獲取並移除數據:lpop key/rpop key
擴展操作: 
  規定時間內獲取並移除數據:blpop key timeout/brpop key timeout(阻塞數據獲取)
業務場景:
  微信 朋友圈點贊,順序顯示點贊好友信息
  ==》key 朋友圈id    value 點贊人
  中間有人取消點贊
  ==》 lrem key count value   刪除指定value的數量count
  企業運營過程中,系統將產生大量的運營數據,如果有多態服務器,如何保證信息按統一順序輸出?
  ==》將多態服務器的信息日誌,保存到redis中
注意事項:
  a.list中保存的數據都是String類型的,數據總容量有限,最多2^32-1個元素
  b.list具有索引的概念,操作數據時通常以隊列的形式進行進出操作
  c.獲取全部數據操作結束索引設置爲-1
    
set類型
思考:存儲大量的數據,在查詢方面提供更高效的效率?
存儲結構:與hash存儲結構完全相同,僅存鍵值,不存value,並且鍵值不允許重複
基本操作:
  添加數據:sadd key member1[menmber2]
  獲取數據:smembers key
  刪除數據:srem key member1[menmber2]
  獲取集合數據總量:scard key
  判斷是否包含指定數據:sismember key member1
擴展操作:
  隨機獲取集合中指定數量的數據:srandmember key[count]
  隨機獲取集合中的某個數據並將該數據移除集合:spop key
  兩個集合的交,並,差集:sinter key1[key2]/sunion key1[key2]/sdiff key1[key2]
  兩個集合的交,並,差集存儲到指定集合:sinterstore  key1[key2]/sunionstore key1[key2]/sdiffstore key1[key2]
業務場景:
  1.今日頭條在使用時會讓用戶設置愛好內容,但是後期爲了增加用戶的活躍度,必須讓用戶對其他信息也產生興趣,如何向用戶隨機推送其他信息呢?
  ==》系統分析各個分類中最新或者最熱的信息,保存到set集合中,然後隨機挑選其中的部分信息,配合用戶關注的信息分類展示全部信息
  2.陌陌爲了促進用戶交流,如何快速爲用戶積累跟過的好友?qq推薦共同的好友?
  3.黑白名單
  信息類網站追求高訪問量,通過爬蟲快速獲取信息,轉成商業辛納希出售,例如:第三方購票軟件(獲取餘票信息),電商刷好評(獲取用戶信息)
  黑名單:屏蔽此類信息
  白名單:可訪問用戶羣體
  ==》將用戶信息與黑名單的用戶信息比對,在黑名單中不允許訪問,不再放行
注意事項: 
  set類型不允許數據重複
  set雖然與hash結構相同,但是無法啓用hash存貯值的空間
     

 


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