金九銀十即將到來,本篇文章給大家整理分享20道redis經典面試題,希望對大家有所幫助!
1. 什么是redis?它主要用來什么的?
Redis,英文全稱是Remote Dictionary Server(遠程字典服務),是一個開源的使用ANSI C語言編寫、支持網絡、可基于內存亦可持久化的日志型、Key-Value數據庫,并提供多種語言的API。【相關推薦:redis】
與MySQL數據庫不同的是,Redis的數據是存在內存中的。它的讀寫速度非常快,每秒可以處理超過10萬次讀寫操作。因此redis被廣泛應用于緩存,另外,Redis也經常用來做分布式鎖。除此之外,Redis支持事務、持久化、LUA 腳本、LRU 驅動事件、多種集群方案。
2.說說Redis的基本數據結構類型
大多數小伙伴都知道,Redis有以下這五種基本類型:
- String(字符串)
- Hash(哈希)
- List(列表)
- Set(集合)
- zset(有序集合)
它還有三種特殊的數據結構類型
- Geospatial
- Hyperloglog
- Bitmap
2.1 Redis 的五種基本數據類型
String(字符串)
- 簡介:String是Redis最基礎的數據結構類型,它是二進制安全的,可以存儲圖片或者序列化的對象,值最大存儲為512M
- 簡單使用舉例: set key value、get key等
- 應用場景:共享session、分布式鎖,計數器、限流。
- 內部編碼有3種,int(8字節長整型)/embstr(小于等于39字節字符串)/raw(大于39個字節字符串)
C語言的字符串是char[]實現的,而Redis使用SDS(simple dynamic string) 封裝,sds源碼如下:
struct?sdshdr{ ??unsigned?int?len;?//?標記buf的長度 ??unsigned?int?free;?//標記buf中未使用的元素個數 ??char?buf[];?//?存放元素的坑 }
SDS 結構圖如下:
Redis為什么選擇SDS結構,而C語言原生的 char[]不香嗎?
舉例其中一點,SDS中,O(1)時間復雜度,就可以獲取字符串長度;而C 字符串,需要遍歷整個字符串,時間復雜度為O(n)
Hash(哈希)
- 簡介:在Redis中,哈希類型是指v(值)本身又是一個鍵值對(k-v)結構
- 簡單使用舉例:hset key field value 、hget key field
- 內部編碼:ziplist(壓縮列表) 、hashtable(哈希表)
- 應用場景:緩存用戶信息等。
- 注意點:如果開發使用hgetall,哈希元素比較多的話,可能導致Redis阻塞,可以使用hscan。而如果只是獲取部分field,建議使用hmget。
字符串和哈希類型對比如下圖:
List(列表)
- 簡介:列表(list)類型是用來存儲多個有序的字符串,一個列表最多可以存儲2^32-1個元素。
- 簡單實用舉例: lpush ?key ?value [value …] 、lrange key start end
- 內部編碼:ziplist(壓縮列表)、linkedlist(鏈表)
- 應用場景: 消息隊列,文章列表,
一圖看懂list類型的插入與彈出:
list應用場景參考以下:
- lpush+lpop=Stack(棧)
- lpush+rpop=Queue(隊列)
- lpsh+ltrim=Capped Collection(有限集合)
- lpush+brpop=Message Queue(消息隊列)
Set(集合)
- 簡介:集合(set)類型也是用來保存多個的字符串元素,但是不允許重復元素
- 簡單使用舉例:sadd key element [element …]、smembers key
- 內部編碼:intset(整數集合)、hashtable(哈希表)
- 注意點:smembers和lrange、hgetall都屬于比較重的命令,如果元素過多存在阻塞Redis的可能性,可以使用sscan來完成。
- 應用場景: 用戶標簽,生成隨機數抽獎、社交需求。
有序集合(zset)
- 簡介:已排序的字符串集合,同時元素不能重復
- 簡單格式舉例:zadd key score member [score member …],zrank key member
- 底層內部編碼:ziplist(壓縮列表)、skiplist(跳躍表)
- 應用場景:排行榜,社交需求(如用戶點贊)。
2.2 Redis 的三種特殊數據類型
- Geo:Redis3.2推出的,地理位置定位,用于存儲地理位置信息,并對存儲的信息進行操作。
- HyperLogLog:用來做基數統計算法的數據結構,如統計網站的UV。
- Bitmaps :用一個比特位來映射某個元素的狀態,在Redis中,它的底層是基于字符串類型實現的,可以把bitmaps成作一個以比特位為單位的數組
3. Redis為什么這么快?
3.1 基于內存存儲實現
我們都知道內存讀寫是比在磁盤快很多的,Redis基于內存存儲實現的數據庫,相對于數據存在磁盤的MySQL數據庫,省去磁盤I/O的消耗。
3.2 高效的數據結構
我們知道,Mysql索引為了提高效率,選擇了B+樹的數據結構。其實合理的數據結構,就是可以讓你的應用/程序更快。先看下Redis的數據結構&內部編碼圖:
SDS簡單動態字符串
- 字符串長度處理:Redis獲取字符串長度,時間復雜度為O(1),而C語言中,需要從頭開始遍歷,復雜度為O(n);
- 空間預分配:字符串修改越頻繁的話,內存分配越頻繁,就會消耗性能,而SDS修改和空間擴充,會額外分配未使用的空間,減少性能損耗。
- 惰性空間釋放:SDS 縮短時,不是回收多余的內存空間,而是free記錄下多余的空間,后續有變更,直接使用free中記錄的空間,減少分配。
- 二進制安全:Redis可以存儲一些二進制數據,在C語言中字符串遇到’ 久久国产精品77777| 久久高清一级毛片| 久久久久99精品成人片欧美 | 99久久综合国产精品免费| 亚洲日韩欧美一区久久久久我| 久久亚洲精品成人无码网站| 久久久久久久久久久久中文字幕| 2020最新久久久视精品爱| 欧美久久久久久| 9191精品国产免费久久| 欧美大香线蕉线伊人久久| 久久精品国产一区二区电影| 日韩精品久久无码人妻中文字幕| 久久强奷乱码老熟女网站| 精品久久久久久亚洲精品| 亚洲国产精品一区二区三区久久| 久久青青草原亚洲av无码app| 亚洲国产成人久久精品99| 青草影院天堂男人久久| 久久精品国产亚洲AV大全| 久久亚洲欧洲国产综合| 久久综合狠狠综合久久激情 | 亚洲人成伊人成综合网久久久 | 色婷婷综合久久久久中文 | 97香蕉久久夜色精品国产| 四虎国产精品免费久久5151| 日本欧美久久久久免费播放网 | 中文字幕人妻色偷偷久久| 香蕉99久久国产综合精品宅男自| 青青青国产精品国产精品久久久久| 一本久久a久久精品亚洲| 波多野结衣久久| 久久九九兔免费精品6| 久久人人爽人人人人片av| 亚洲人成电影网站久久| 亚洲伊人久久综合中文成人网| 久久久久一级精品亚洲国产成人综合AV区| 狠狠干狠狠久久| 91秦先生久久久久久久| 久久99精品国产99久久6| 久久国产精品偷99|