Redis的一般理解

一.redis簡介

  • redis就是一個非關係型數據庫,數據存在內存中,讀寫速度非常快
  • 另外redis經常用來做分佈式鎖(redis爲單進程單線程模式,採用隊列模式將併發訪問變成串行訪問,多個客戶端讀redis的連接不存在競爭關係)
  • redis提供了多種數據類型來支持不同業務場景
  • redis支持事務、持久化、LUA腳本、LRU驅動事件

二.爲什麼要用redis作爲緩存

  • 高性能:用戶通過訪問緩存也即內存的速度比訪問數據即硬盤的速度要快的多
  • 高併發:直接操作緩存能夠承受的請求是遠遠大於直接訪問數據庫的,可以把一部分數據庫的數據轉移到緩存中去

三.redis緩存對比map/guava緩存

  1. redis緩存被稱爲分佈式緩存,可以用幾十G做緩存,Map是本地緩存,JVM最多幾個G
  2. Redis 的緩存可以持久化,Map 是內存對象,程序一重啓數據就沒了
  3. Redis 有豐富的 API,Map 就簡單太多了
  4. 多實例的情況下,各實例共用一份緩存數據 ,map則不是

四.redis的線程模型

redis 內部使用文件事件處理器 file event handler,這個文件事件處理器是單線程的,所以 redis 才叫做單線程的模型。它採用 IO 多路複用機制同時監聽多個 socket,根據 socket 上的事件來選擇對應的事件處理器進行處理。

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-qh0VqZlP-1581770667701)(redis%E6%8C%87%E5%AF%BC.assets/9ea86eb5-000a-4281-b948-7b567bd6f1d8-1581764822343.png)]

文件事件處理器的結構包含 4 個部分 :

  • 多個 socket
  • IO 多路複用程序
  • 文件事件分派器
  • 事件處理器(連接應答處理器、命令請求處理器、命令回覆處理器)

多個 socket 可能會併發產生不同的操作,每個操作對應不同的文件事件,但是 IO 多路複用程序會監聽多個 socket,會將 socket 產生的事件放入隊列中排隊,事件分派器每次從隊列中取出一個事件,把該事件交給對應的事件處理器進行處理。

五.redis與memcached區別

  1. redis支持更豐富的數據類型( List,Set,Zset,Hash, String )memcached只支持String
  2. redis支持數據的持久化:其中兩種持久化策略分別是:RDB快照和AOF日誌,即可以把內存中的數據保存在磁盤裏,重啓的時候可以再次加載進內存使用,但是mencached只能把數據全部存在內存中
  3. Memcached是多線程,非阻塞IO複用的網絡模型;Redis使用單線程的多路 IO 複用模型。

六.redis常用數據結構以及場景

  • String

  • img

    應用場景:
    1. 保存單個字符串或者JSON字符串,因爲String類型是安全的,所以可以把一個圖片文件的內容保存。

      2.常規計數,微博數,粉絲數,因爲incr的原子性,如果同一時間有多個用戶讀取了某一個key的值,然後對其進行加1,最後結果也一定是正確的。

    語法:
    set key value //設置指定key的value值
    get key     	//取得key的value值
    getrange key start end	//返回key對應value字符串的子串(start ,end都包括)
    mget key1 key2	//獲取一個或多個key的值
    setex key seconds value	//設置key值並且設置過期時間,單位是秒
    setlen key 	//返回key所存儲值的長度
    incr key	//把key存儲的值加1
    incrby key increment  //把key存儲的值加上給定increment
    decr key   //把key存儲的值減1
    decrby key decrement  //把key存儲的值減去decrement
    append key value  //如果key已經存在並且是一個字符,那麼把value追加到key值之後
    
  • Hash

  • [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-MugBKgV3-1581770667703)(redis%E6%8C%87%E5%AF%BC.assets/7bd202a7-93d4-4f3a-a878-af68ae25539a.png)]

    應用場景:

    存儲對象,爲什麼不用String 的JSON去存儲呢?因爲讀取的時候涉及到序列化和反序列化,這個不屬於原子性操作,高併發的時候可能造成錯誤。

    語法:
    hdel key field1 field2	//刪除一個或者多個哈希表字段
    hexists key field	//查看哈希表key中指定的字段是否存在
    hget key field		//獲取哈希表指定字段的值
    hgetall key		//獲取哈希表指定key所有的字段和值
    hincrby key field increment		//爲哈希表key中指定字段的值加上增量increment
    hkeys key			//獲取哈希表key中所有字段
    hlen key			//獲取哈希表key中字段的數量
    hmget key			//獲取哈希表所有給定字段的值
    hmset key field1 value1 field2 value2		//同時將多個filed-value設置到哈希表key中
    
    
  • List

  • img
  • 應用場景:

    微博的關注列表,粉絲列表,消息列表

    語法:
    blpop key1 key2 timeout		//移出並獲取列表的第一個元素,如果列表中沒有元素會阻塞到超時或者發現可彈出元素爲止
    brpop key1 key2 timout 		//移出並獲取列表的最後一個元素,如果列表中沒有元素會阻塞到超時或者發現可彈出元素爲止
    lindex key index			//通過index獲取列表的元素
    llen key					//獲取列表的長度
    lpop key					//移出並獲得列表的第一個元素
    lpush key value1 value2     //將一個或多個value插入到列表頭部
    lrange key start end		//獲取列表指定範圍的值
    lset key index value		//通過索引設置列表元素的值
    
    
  • set:

  • [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-ySFvW4bc-1581770667704)(redis%E6%8C%87%E5%AF%BC.assets/cd5fbcff-3f35-43a6-8ffa-082a93ce0f0e.png)]

  • 應用場景:

    共同關注、共同粉絲、共同喜好

    sismember s1 a :查看s1集合中a是否存在,用來驗證用戶的

    srandmember s1 3:隨機輸出s1中3個成員,用來抽獎

    語法:
    sadd key  member1 member2		//向集合添加一個或者多個元素
    scard key					//獲取集合的成員數
    sdiff  key1 key2 		//返回給定所有集合的差集
    sinter key1 key2		//返回給定給定集合的交集
    sismember key member	//查看member是否是key的成員
    smembers key			//返回key中所有的成員
    srandmember key count	//返回集合key中一個或者多個成員
    sunion key1 key2		//返回所有給定集合的並集
    
  • ZSet

    img

    應用場景:

    直播間在線用戶列表,各種禮物排行榜,彈幕消息

    語法:
    zadd key score1 member1 score member2	//向有序集合添加一個或者多個成員,或者更新已存在成員的分數
    zcard key 			//獲取有序集合的成員數
    zcount key min max		//計算在有序集合中指定區間的成員數
    zincrby key increment member 		//有序集合對指定成員的分數上加上increment
    zrank key member		//返回指定成員的索引
    zrem key member1 member2		//移除集合中成員1和成員2
    zscore key member 			//返回指定成員的分數值
    

七.redis設置鍵過期事件的必要性

  • 安全性 :短信驗證碼
  • 可用性:定期隨機刪除或者惰性刪除

八.redis持久化機制

  1. RDB(快照持久化)

可以將快照複製到其他服務器從而創建具有相同數據的服務器副本(Redis主從結構,主要用來提高Redis性能),還可以將快照留在原地以便重啓服務器的時候使用。

2.AOF( 只追加文件 持久化)

AOF持久化 的實時性更好,因此已成爲主流的持久化方案。

九.redis事務

1.什麼是Redis事務:

​ redis事務指一次可以執行多個命令(按順序去執行,執行過程中不允許其他命令插入,也不允許加塞)

2.常用命令:

MULTI:標記一個事務塊的開始
EXEC:執行事務塊內的所有命令
DISCARD:取消事務,放棄執行事務塊內的命令
WATCH:監視一個key,如果執行這個事務之前被其他命令所改動,那麼這個事務就不會執行

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-GpQsBLEe-1581770667705)(redis%E6%8C%87%E5%AF%BC.assets/image-20200215151316808.png)]

3.一個事務從開始到執行會經歷以下階段:

開始事務-------》命令入隊-------------》執行事務

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-CdtRGVgT-1581770667705)(redis%E6%8C%87%E5%AF%BC.assets/image-20200215140825596.png)]

4.事務的錯誤處理:

1.如果出現錯誤事務,那麼出現錯誤的命名不會執行,其他的事務還是會繼續執行的,但是不會回滾。類似於去商店買東西,買了一些,發現有一個過期的商品,這個時候不會把所有的商品都丟棄

2.如果隊列中的某個命令出現了報告錯誤,那麼執行整個隊列都會取消。

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-Id3zdFg1-1581770667706)(redis%E6%8C%87%E5%AF%BC.assets/image-20200215144446229.png)]

5.事務的應用場景:

秒殺

十.緩存雪崩和緩存穿透

1.什麼是緩存雪崩

緩存同一時間大面積的失效,所以,後面的請求都會落到數據庫上,造成數據庫短時間內承受大量請求而崩掉。

2.什麼是緩存穿透

大量請求的 key 根本不存在於緩存中,導致請求直接到了數據庫上,根本沒有經過緩存這一層。

十一.Redis其他命令

keys * :取出所有的key

exists key:是否存在指定的key,如果滿足返回1,否則返回0

expire key time:設置key的過期時間,默認單位是秒

del key:刪除某個key

rename key key2:對key進行重命名

type key:返回key的類型

ttl key:查看key是否過期,-1代表永久有效,-2代表失效

kill -9 pid:對查詢的pid強制關閉

select 8:選擇第八個數據庫

十二.一個簡單的論壇系統分析

該系統的功能如下:

  • 可以發佈文章
  • 可以對文章進行點贊
  • 可以按文章的發佈時間和點贊數進行排名

文章信息:

文章包括標題,作者和點贊數,因此在redis用hash來存儲這種數據

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-nAKe8OKU-1581770667707)(redis%E6%8C%87%E5%AF%BC.assets/7c54de21-e2ff-402e-bc42-4037de1c1592.png)]

點贊功能:

當有用戶進行點贊時,應對問斬的votes進行加1,還必須記錄此用戶已經對該文章進行了點贊,因此可以建立已投票用戶集合來進行標記,同時爲了節約內存,規定當文章發佈滿一週之後,就不可以進行投票,因此已投票結合就會被刪除,我們可以設置一個過期時間

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-KQZgAxf5-1581770667707)(redis%E6%8C%87%E5%AF%BC.assets/485fdf34-ccf8-4185-97c6-17374ee719a0.png)]

對文章進行排序:

爲了對發佈時間和點贊數進行排序,我們需要建立一個文章發佈時間的有序集合和點贊數的有序集合

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-lc1dF1Cr-1581770667708)(redis%E6%8C%87%E5%AF%BC.assets/f7d170a3-e446-4a64-ac2d-cb95028f81a8.png)]

參考資料

[https://cyc2018.github.io/CS-Notes/#/notes/Redis?id=%e5%8d%81%e5%9b%9b%e3%80%81%e4%b8%80%e4%b8%aa%e7%ae%80%e5%8d%95%e7%9a%84%e8%ae%ba%e5%9d%9b%e7%b3%bb%e7%bb%9f%e5%88%86%e6%9e%90](https://cyc2018.github.io/CS-Notes/#/notes/Redis?id=%e5%8d%81%e5%9b%9b%e3%80%81%e4%b8%80%e4%b8%aa%e7%ae%80%e5%8d%95%e7%9a%84%e8%ae%ba%e5%9d%9b%e7%b3%bb%e7%bb%9f%e5%88%86%e6%9e%90)

https://www.runoob.com/

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