金九銀十即將到來,本篇文章給大家整理分享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語言中字符串遇到’ 亚洲乱码日产精品a级毛片久久 | 亚洲国产成人久久精品99| 精品人妻伦九区久久AAA片69| 一本色道久久88加勒比—综合| 久久久国产乱子伦精品作者| 波多野结衣中文字幕久久 | 久久综合亚洲色HEZYO社区| 综合久久精品色| 久久久久久久波多野结衣高潮 | 熟妇人妻久久中文字幕| 久久久久人妻一区精品性色av| 久久久久国产精品熟女影院| 久久无码人妻一区二区三区| 97久久精品无码一区二区| 久久996热精品xxxx| 久久婷婷色综合一区二区| 伊人久久大香线蕉av不卡| 久久99精品国产| 亚洲国产天堂久久久久久| 99久久国产宗和精品1上映| 久久精品国产69国产精品亚洲| 伊人色综合久久天天| 久久天天躁狠狠躁夜夜2020 | 蜜臀av性久久久久蜜臀aⅴ麻豆| 久久精品国产第一区二区三区| 久久免费大片| 久久久久久国产精品免费无码| 久久这里有精品视频| 亚洲国产成人久久精品影视| 国产精品久久久久a影院| 狠狠狠色丁香婷婷综合久久五月| 香蕉久久夜色精品国产尤物| 91精品观看91久久久久久| 久久免费看黄a级毛片| 国产精品va久久久久久久| 久久这里只有精品18| 无码人妻久久一区二区三区| 久久精品亚洲中文字幕无码麻豆 | 久久综合久久综合久久| 国产成人综合久久综合| 97久久精品人人做人人爽|