天天看點

redis list操作_詳解 Redis 面試題(一)

redis list操作_詳解 Redis 面試題(一)

什麼是Redis

Redis(Remote Dictionary Server) 是一個使用 C 語言編寫的,開源的(BSD許可)高性能非關系型(NoSQL)的鍵值對資料庫。

Redis 可以存儲鍵和五種不同類型的值之間的映射。鍵的類型隻能為字元串,值支援五種資料類型:字元串、清單、集合、散清單、有序集合。

與傳統資料庫不同的是 Redis 的資料是存在記憶體中的,是以讀寫速度非常快,是以 redis 被廣泛應用于緩存方向,每秒可以處理超過 10萬次讀寫操作,是已知性能最快的Key-Value DB。另外,Redis 也經常用來做分布式鎖。除此之外,Redis 支援事務 、持久化、LUA腳本、LRU驅動事件、多種叢集方案。

Redis有哪些優缺點

優點

  • 讀寫性能優異, Redis能讀的速度是110000次/s,寫的速度是81000次/s。
  • 支援資料持久化,支援AOF和RDB兩種持久化方式。
  • 支援事務,Redis的所有操作都是原子性的,同時Redis還支援對幾個操作合并後的原子性執行。
  • 資料結構豐富,除了支援string類型的value外還支援hash、set、zset、list等資料結構。
  • 支援主從複制,主機會自動将資料同步到從機,可以進行讀寫分離。

缺點

  • 資料庫容量受到實體記憶體的限制,不能用作海量資料的高性能讀寫,是以Redis适合的場景主要局限在較小資料量的高性能操作和運算上。
  • Redis 不具備自動容錯和恢複功能,主機從機的當機都會導緻前端部分讀寫請求失敗,需要等待機器重新開機或者手動切換前端的IP才能恢複。
  • 主機當機,當機前有部分資料未能及時同步到從機,切換IP後還會引入資料不一緻的問題,降低了系統的可用性。
  • Redis 較難支援線上擴容,在叢集容量達到上限時線上擴容會變得很複雜。為避免這一問題,運維人員在系統上線時必須確定有足夠的空間,這對資源造成了很大的浪費。

為什麼要用 Redis /為什麼要用緩存

主要從“高性能”和“高并發”這兩點來看待這個問題。

高性能:

假如使用者第一次通路資料庫中的某些資料。這個過程會比較慢,因為是從硬碟上讀取的。将該使用者通路的資料存在數緩存中,這樣下一次再通路這些資料的時候就可以直接從緩存中擷取了。操作緩存就是直接操作記憶體,是以速度相當快。如果資料庫中的對應資料改變的之後,同步改變緩存中相應的資料即可!

redis list操作_詳解 Redis 面試題(一)

高并發:

直接操作緩存能夠承受的請求是遠遠大于直接通路資料庫的,是以我們可以考慮把資料庫中的部分資料轉移到緩存中去,這樣使用者的一部分請求會直接到緩存這裡而不用經過資料庫。

redis list操作_詳解 Redis 面試題(一)

為什麼要用 Redis 而不用 map/guava 做緩存?

緩存分為本地緩存和分布式緩存。以 Java 為例,使用自帶的 map 或者 guava 實作的是本地緩存,最主要的特點是輕量以及快速,生命周期随着 jvm 的銷毀而結束,并且在多執行個體的情況下,每個執行個體都需要各自儲存一份緩存,緩存不具有一緻性。

使用 redis 或 memcached 之類的稱為分布式緩存,在多執行個體的情況下,各執行個體共用一份緩存資料,緩存具有一緻性。缺點是需要保持 redis 或 memcached服務的高可用,整個程式架構上較為複雜。

Redis為什麼這麼快

1、完全基于記憶體,絕大部分請求是純粹的記憶體操作,非常快速。資料存在記憶體中,類似于 HashMap,HashMap 的優勢就是查找和操作的時間複雜度都是O(1);

2、資料結構簡單,對資料操作也簡單,Redis 中的資料結構是專門進行設計的;

3、采用單線程,避免了不必要的上下文切換和競争條件,也不存在多程序或者多線程導緻的切換而消耗 CPU,不用去考慮各種鎖的問題,不存在加鎖釋放鎖操作,沒有因為可能出現死鎖而導緻的性能消耗;

4、使用多路 I/O 複用模型,非阻塞 IO;

5、使用底層模型不同,它們之間底層實作方式以及與用戶端之間通信的應用協定不一樣,Redis 直接自己建構了 VM 機制 ,因為一般的系統調用系統函數的話,會浪費一定的時間去移動和請求;

資料類型

Redis有哪些資料類型

Redis主要有5種資料類型,包括String,List,Set,Zset,Hash,滿足大部分的使用要求

資料類型 可以存儲的值 操作 應用場景
STRING 字元串、整數或者浮點數

對整個字元串或者字元串的其中一部分執行操作

對整數和浮點數執行自增或者自減操作

做簡單的鍵值對緩存
LIST 清單

從兩端壓入或者彈出元素

對單個或者多個元素進行修剪,

隻保留一個範圍内的元素

存儲一些清單型的資料結構,類似粉絲清單、文章的評論清單之類的資料
SET 無序集合

添加、擷取、移除單個元素

檢查一個元素是否存在于集合中

計算交集、并集、差集

從集合裡面随機擷取元素

交集、并集、差集的操作,比如交集,可以把兩個人的粉絲清單整一個交集
HASH 包含鍵值對的無序散清單

添加、擷取、移除單個鍵值對

擷取所有鍵值對

檢查某個鍵是否存在

結構化的資料,比如一個對象
ZSET 有序集合

添加、擷取、删除元素

根據分值範圍或者成員來擷取元素

計算一個鍵的排名

去重但可以排序,如擷取排名前幾名的使用者

Redis的應用場景

總結一

計數器

可以對 String 進行自增自減運算,進而實作計數器功能。Redis 這種記憶體型資料庫的讀寫性能非常高,很适合存儲頻繁讀寫的計數量。

緩存

将熱點資料放到記憶體中,設定記憶體的最大使用量以及淘汰政策來保證緩存的命中率。

會話緩存

可以使用 Redis 來統一存儲多台應用伺服器的會話資訊。當應用伺服器不再存儲使用者的會話資訊,也就不再具有狀态,一個使用者可以請求任意一個應用伺服器,進而更容易實作高可用性以及可伸縮性。

全頁緩存(FPC)

除基本的會話token之外,Redis還提供很簡便的FPC平台。以Magento為例,Magento提供一個插件來使用Redis作為全頁緩存後端。此外,對WordPress的使用者來說,Pantheon有一個非常好的插件 wp-redis,這個插件能幫助你以最快速度加載你曾浏覽過的頁面。

查找表

例如 DNS 記錄就很适合使用 Redis 進行存儲。查找表和緩存類似,也是利用了 Redis 快速的查找特性。但是查找表的内容不能失效,而緩存的内容可以失效,因為緩存不作為可靠的資料來源。

消息隊列(釋出/訂閱功能)

List 是一個雙向連結清單,可以通過 lpush 和 rpop 寫入和讀取消息。不過最好使用 Kafka、RabbitMQ 等消息中間件。

分布式鎖實作

在分布式場景下,無法使用單機環境下的鎖來對多個節點上的程序進行同步。可以使用 Redis 自帶的 SETNX 指令實作分布式鎖,除此之外,還可以使用官方提供的 RedLock 分布式鎖實作。

其它

Set 可以實作交集、并集等操作,進而實作共同好友等功能。ZSet 可以實作有序性操作,進而實作排行榜等功能。

總結二

Redis相比其他緩存,有一個非常大的優勢,就是支援多種資料類型。

資料類型說明string字元串,最簡單的k-v存儲hashhash格式,value為field和value,适合ID-Detail這樣的場景。list簡單的list,順序清單,支援首位或者末尾插入資料set無序list,查找速度快,适合交集、并集、差集處理sorted set有序的set

其實,通過上面的資料類型的特性,基本就能想到合适的應用場景了。

string——适合最簡單的k-v存儲,類似于memcached的存儲結構,短信驗證碼,配置資訊等,就用這種類型來存儲。

hash——一般key為ID或者唯一标示,value對應的就是詳情了。如商品詳情,個人資訊詳情,新聞詳情等。

list——因為list是有序的,比較适合存儲一些有序且資料相對固定的資料。如省市區表、字典表等。因為list是有序的,适合根據寫入的時間來排序,如:最新的***,消息隊列等。

set——可以簡單的了解為ID-List的模式,如微網誌中一個人有哪些好友,set最牛的地方在于,可以對兩個set提供交集、并集、差集操作。例如:查找兩個人共同的好友等。

Sorted Set——是set的增強版本,增加了一個score參數,自動會根據score的值進行排序。比較适合類似于top 10等不根據插入的時間來排序的資料。

如上所述,雖然Redis不像關系資料庫那麼複雜的資料結構,但是,也能适合很多場景,比一般的緩存資料結構要多。了解每種資料結構适合的業務場景,不僅有利于提升開發效率,也能有效利用Redis的性能。

來源:https://blog.csdn.net/ThinkWon/article/details/103522351 - END - 本人的專欄已上線,歡迎訂閱

redis list操作_詳解 Redis 面試題(一)
redis list操作_詳解 Redis 面試題(一)
redis list操作_詳解 Redis 面試題(一)

有收獲就點個「在看」吧 ▼