Redis單執行緒原因 資料型別及分布式鎖

2021-10-22 14:22:57 字數 1903 閱讀 3941

redis是c語言開發的乙個開源的高效能鍵值對(key-value)的記憶體資料庫。redis作為乙個記憶體資料庫具有以下特點:

官方提供的資料每秒查詢的次數(qps)可以達到10w+。

redis完全是基於記憶體的操作,cpu不是redis的瓶頸,(瓶頸可能是機器記憶體的大小或者網路頻寬),而且單執行緒容易實現,所以採用單執行緒的方式。

redis 內部使用乙個 redisobject 物件來表示所有的 key 和 value。

redisobject 最主要的資訊如圖所示:type 表示乙個 value 物件具體是何種資料型別,encoding 是不同資料型別在 redis 內部的儲存方式。

string是 redis 最基本的型別,可以理解成與 memcached一模一樣的型別,乙個 key 對應乙個 value。value 不僅是 string,也可以是數字。

string 型別是二進位制安全的,意思是 redis 的 string 型別可以包含任何資料,比如 jpg 或者序列化的物件。

string 型別的值最大能儲存 512m。

hash是乙個鍵值(key-value)的集合。redis 的 hash 是乙個 string 的 key 和 value 的對映表,hash 特別適合儲存物件

常用命令:hget,hset,hgetall 等。

list列表是簡單的字串列表,按照插入順序排序。可以新增乙個元素到列表的頭部(左邊)或者尾部(右邊)

常用命令:lpush、rpush、lpop、rpop、lrange(獲取列表片段)等。

應用場景:list 應用場景非常多,也是 redis 最重要的資料結構之一,比如 twitter 的關注列表,粉絲列表都可以用 list 結構來實現。

資料結構:list 就是鍊錶,可以用來當訊息佇列用。redis 提供了 list 的 push 和 pop 操作,還提供了操作某一段的 api,可以直接查詢或者刪除某一段的元素。

實現方式:redis list 的是實現是乙個雙向鍊錶,既可以支援反向查詢和遍歷,更方便操作,不過帶來了額外的記憶體開銷。

set是 string 型別的無序集合。集合是通過hashtable實現的。set 中的元素是沒有順序的,而且是沒有重複的。

常用命令:sdd、spop、smembers、sunion 等。

應用場景:redis set 對外提供的功能和 list 一樣是乙個列表,特殊之處在於 set 是自動去重的,而且 set 提供了判斷某個成員是否在乙個 set 集合中。

zset 和 set 一樣是 string 型別元素的集合,且不允許重複的元素。常用命令:zadd、zrange、zrem、zcard 等。

使用場景:sorted set 可以通過使用者額外提供乙個優先順序(score)的引數來為成員排序,並且是插入有序的,即自動排序。當你需要乙個有序的並且不重複的集合列表,那麼可以選擇 sorted set 結構。和 set 相比,sorted set關聯了乙個 double 型別權重的引數 score,使得集合中的元素能夠按照 score 進行有序排列,redis 正是通過分數來為集合中的成員進行從小到大的排序。

實現方式:redis sorted set 的內部使用 hashmap 和跳躍表(skiplist)來保證資料的儲存和有序,hashmap 裡放的是成員到 score 的對映。而跳躍表裡存放的是所有的成員,排序依據是 hashmap 裡存的 score,使用跳躍表的結構可以獲得比較高的查詢效率,並且在實現上比較簡單。

分布式鎖的三種實現

Redis使用單執行緒的原因

單執行緒指的是網路請求模組使用了乙個執行緒 所以不需考慮併發安全性 即乙個執行緒處理所有網路請求,其他模組仍用了多個執行緒。1絕大部分請求是純粹的記憶體操作 非常快速 2資料結構簡單,對資料操作也簡單 3採用單執行緒,避免了不必要的上下文切換和競爭條件 4非阻塞io io多路復用 多路 i o 復用...

redis單執行緒的原因和併發快的原因

1 redis是基於記憶體的,記憶體的讀寫速度非常快 2 redis是單執行緒的,省去了很多上下文切換執行緒的時間 3 redis使用多路復用技術,可以處理併發的連線。非阻塞io 內部實現採用epoll,採用了epoll 自己實現的簡單的事件框架。epoll中的讀 寫 關閉 連線都轉化成了事件,然後...

大資料 Redis使用單執行緒速度為何快?

實習面試時,被問到 redis使用單執行緒速度為何快?一下把我問住了,遂回來學習總結一波。因為cpu不是redis的瓶頸。redis的瓶頸最有可能是機器記憶體或者網路頻寬,既然單執行緒容易實現,而且cpu不會成為瓶頸,那就順理成章地採用單執行緒的方案了。注 redis 單執行緒指的是網路請求模組使用...