金九銀十即將到來,本篇文章給大家整理分享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語言中字符串遇到’ 亚洲乱码精品久久久久..| 久久精品一区二区| 国内精品久久久久久久久电影网 | 久久亚洲AV成人出白浆无码国产| 一本色综合网久久| 国产一区二区三区久久| 国产—久久香蕉国产线看观看| 久久精品二区| 久久久噜噜噜www成人网| 国产精品美女久久久网AV| 精品久久久久久无码不卡| 国产精品美女久久久久| 久久精品国产清自在天天线| 狠狠综合久久AV一区二区三区| 成人午夜精品久久久久久久小说 | 国产综合成人久久大片91| 日产精品久久久一区二区| 开心久久婷婷综合中文字幕| 九九精品99久久久香蕉| 无码国内精品久久综合88| 品成人欧美大片久久国产欧美...| 中文字幕人妻色偷偷久久| 久久亚洲高清综合| 欧美亚洲另类久久综合| 国产精品美女久久久m| 久久综合综合久久综合| 狠狠综合久久AV一区二区三区| 久久精品国产亚洲AV不卡| 国产—久久香蕉国产线看观看 | 国产精品岛国久久久久| 久久人人爽人人爽人人片av麻烦| 久久人人爽人人爽AV片| 久久国产视屏| 女同久久| 久久亚洲AV无码精品色午夜| 伊人伊成久久人综合网777| 亚洲人成网站999久久久综合| 久久夜色精品国产| 日韩人妻无码一区二区三区久久99 | 亚洲国产精品成人久久| 天天爽天天狠久久久综合麻豆|