吐血整理Redis面試題66道

浪裡白條(̿▀̿ ̿Ĺ̯̿̿▀̿ ̿)發表於2020-11-19

1.Redis

Redis 是一個基於記憶體的高效能key-value資料庫。Redis採用單執行緒模式處理請求。這樣做的原因有2個,一個因為採用了非阻塞的非同步事件處理機制,另一個是快取資料都是記憶體操作IO時間不會太長,單執行緒可以避免執行緒上下文切換產生的代價。代價是指應用程式的效能和響應能力。

2.Redis相比memcached有哪些優勢:

memcached所有的值均是簡單的字串,redis作為其替代者,支援更為豐富的資料型別
redis的速度比memcached快很多
redis可以持久化其資料,所以Redis不僅僅可以用作快取,也可以作為NoSQL資料庫。

3.Redis是單執行緒

redis利用佇列技術將併發訪問變為序列訪問,消除了傳統資料庫序列控制的開銷

4.Reids常用5種資料型別

string,list,set,sorted set,hash
1,String: ,Redis 中最常使用的型別,內部的實現通過SDS來儲存的,SDS類似於JAVA的ArrayList,可以通過預分配冗餘空間的方式來減少記憶體的頻繁分配。
應用場景:
快取功能,String字串是最常用的資料型別,不僅僅是Redis,各個語言都是最基本型別,因此利用Redis作為快取,
配合其他資料庫作為儲存層,利用Redis支援高併發的特點,可以大大加快系統的讀寫速度,以及降低後端資料庫的壓力。
存取方式:

// 新增一條資料
 jedis.set("username", "zhangsan");
  jedis.set("age", "18"); 
  // 新增多條資料 引數奇數為 key 引數偶數為 value 
  jedis.mset("address", "bj", "sex", "1");

2,hash: 這個是類似Map的一種結構,這個一般value存放的是結構化的物件。然後每次讀寫快取的時候,就可以操作Hashl裡的某個欄位。
應用場景:
比如商品物件,物件裡面包含了各種屬性。
存取方式:

/* 新增一條資料
* 引數一:redis 的 key
* 引數二:hash 的 key 
* 引數三:hash 的 value*/
jedis.hset("userInfo", "name", "lisi");
// 新增多條資料
Map<String, String> map = new HashMap<>();
map.put("age", "20");
map.put("sex", "1");
jedis.hmset("userInfo", map);

list :使用List的資料結構的有序列表
應用場景:可以做簡單的訊息佇列的功能,或者是粉絲列表,文章的評論列表之類的東西。
用Redis怎麼做訊息佇列?
訊息佇列:Reids的連結串列結構,可以輕鬆的實現阻塞佇列,可以使用左近右出的命令來完成佇列,比如:資料的生產者可以通過Lpush命令從左邊插入資料,多個資料消費者,可以使用BRpop命令阻塞的“搶”列表尾部的資料。
存取方式:

// 左新增(上)
jedis.lpush("students", "Wang Wu", "Li Si");
// 右新增(下) jedis.rpush
jedis.rpush("students", "Zhao Liu");

set: 一般用於全域性去重的功能

// 新增資料 
jedis.sadd("letters", "aaa", "bbb", "ccc", "ddd", "eee");
// 獲取資料
Set<String> letters = jedis.smembers("letters");

sorted set : 他多了一個權重控制Score 集合中的元素能夠按Score進行排序。可以做一些榜單,排行榜操作。

// 新增資料 
jedis.zadd("score", scoreMembers);
// 獲取資料
Set<String> scores = jedis.zrange("score", 0, 4);

高階用法:

Bitmap:
點陣圖是支援bit為來儲存資訊,可以用來實現布隆過濾器(BloomFilter)。
HyperLogLog:
供不精確的去重計數功能,比較適合用來做大規模資料的去重統計。
GeosPatial:
可以用來儲存地理位置,並作為位置距離計算或則根據半徑計算位置等。
pub/sub:
功能是訂閱釋出功能,也可以做簡單的訊息佇列。
Pipeline:
可以批量執行一組指令,一次性返回全部結果,可以減少頻繁的請求應答。
Lua:
Redis支援Lua指令碼來執行一系列的功能。

6.Reids6種淘汰策略:

noeviction: 不刪除策略, 達到最大記憶體限制時, 如果需要更多記憶體, 直接返回錯誤資訊。大多數寫命令都會導致佔用更多的記憶體(有極少數會例外。
**allkeys-lru:**所有key通用; 優先刪除最近最少使用(less recently used ,LRU) 的 key。
**volatile-lru:**只限於設定了 expire 的部分; 優先刪除最近最少使用(less recently used ,LRU) 的 key。
**allkeys-random:**所有key通用; 隨機刪除一部分 key。
volatile-random: 只限於設定了 expire 的部分; 隨機刪除一部分 key。
volatile-ttl: 只限於設定了 expire 的部分; 優先刪除剩餘時間(time to live,TTL) 短的key。

7.Redis的併發競爭問題如何解決?

單程式單執行緒模式,採用佇列模式將併發訪問變為序列訪問。Redis本身沒有鎖的概念,Redis對於多個客戶端連線並不存在競爭,利用setnx實現鎖。

8.Redis是使用c語言開發的。

9.Redis前端啟動命令

./redis-server

10.Reids支援的語言:

java、C、C#、C++、php、Node.js、Go等。

11.Redis 持久化方案:

Rdb 和 Aof

12.Redis 的主從複製

持久化保證了即使redis服務重啟也不會丟失資料,因為redis服務重啟後會將硬碟上持久化的資料恢復到記憶體中,但是當redis伺服器的硬碟損壞了可能會導致資料丟失,如果通過redis的主從複製機制就可以避免這種單點故障,

13.Redis是單執行緒的,但Redis為什麼這麼快?

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

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

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

4、使用多路I/O複用模型,非阻塞IO;這裡“多路”指的是多個網路連線,“複用”指的是複用同一個執行緒

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

14.為什麼Redis是單執行緒的?

Redis是基於記憶體的操作,CPU不是Redis的瓶頸,Redis的瓶頸最有可能是機器記憶體的大小或者網路頻寬。既然單執行緒容易實現,而且CPU不會成為瓶頸,那就順理成章地採用單執行緒的方案了(畢竟採用多執行緒會有很多麻煩!)。

15.Redis info檢視命令:

info memory

16.Redis記憶體模型

used_memory:Redis分配器分配的記憶體總量(單位是位元組),包括使用的虛擬記憶體(即swap);Redis分配器後面會介紹。used_memory_human只是顯示更友好。

used_memory_rss**:**Redis程式佔據作業系統的記憶體(單位是位元組),與top及ps命令看到的值是一致的;除了分配器分配的記憶體之外,used_memory_rss還包括程式執行本身需要的記憶體、記憶體碎片等,但是不包括虛擬記憶體。

mem_fragmentation_ratio**:**記憶體碎片比率,該值是used_memory_rss / used_memory的比值。

mem_allocator**:**Redis使用的記憶體分配器,在編譯時指定;可以是 libc 、jemalloc或者tcmalloc,預設是jemalloc;截圖中使用的便是預設的jemalloc。

17.Redis記憶體劃分

資料
作為資料庫,資料是最主要的部分;這部分佔用的記憶體會統計在used_memory中。

程式本身執行需要的記憶體
Redis主程式本身執行肯定需要佔用記憶體,如程式碼、常量池等等;這部分記憶體大約幾兆,在大多數生產環境中與Redis資料佔用的記憶體相比可以忽略。這部分記憶體不是由jemalloc分配,因此不會統計在used_memory中。

緩衝記憶體
緩衝記憶體包括客戶端緩衝區、複製積壓緩衝區、AOF緩衝區等;其中,客戶端緩衝儲存客戶端連線的輸入輸出緩衝;複製積壓緩衝用於部分複製功能;AOF緩衝區用於在進行AOF重寫時,儲存最近的寫入命令。在瞭解相應功能之前,不需要知道這些緩衝的細節;這部分記憶體由jemalloc分配,因此會統計在used_memory中。

記憶體碎片
記憶體碎片是Redis在分配、回收實體記憶體過程中產生的。例如,如果對資料的更改頻繁,而且資料之間的大小相差很大,可能導致redis釋放的空間在實體記憶體中並沒有釋放,但redis又無法有效利用,這就形成了記憶體碎片。記憶體碎片不會統計在used_memory中。

18.Redis物件有5種型別

無論是哪種型別,Redis都不會直接儲存,而是通過redisObject物件進行儲存。

19.Redis沒有直接使用C字串

(即以空字元’\0’結尾的字元陣列)作為預設的字串表示,而是使用了SDS。SDS是簡單動態字串(Simple Dynamic String)的縮寫。

20.Reidis的SDS在C字串的基礎上加入了free和len欄位

21.Reids主從複製

複製是高可用Redis的基礎,哨兵和叢集都是在複製基礎上實現高可用的。複製主要實現了資料的多機備份,以及對於讀操作的負載均衡和簡單的故障恢復。缺陷:故障恢復無法自動化;寫操作無法負載均衡;儲存能力受到單機的限制。

22.Redis哨兵

在複製的基礎上,哨兵實現了自動化的故障恢復。缺陷:寫操作無法負載均衡;儲存能力受到單機的限制。

23.Reids持久化觸發條件

RDB持久化的觸發分為手動觸發和自動觸發兩種。

24.Redis 開啟AOF

Redis伺服器預設開啟RDB,關閉AOF;要開啟AOF,需要在配置檔案中配置:

appendonly yes

25.AOF常用配置總結

下面是AOF常用的配置項,以及預設值;前面介紹過的這裡不再詳細介紹。

appendonly no:是否開啟AOF
appendfilename “appendonly.aof”:AOF檔名
dir ./:RDB檔案和AOF檔案所在目錄
appendfsync everysec:fsync持久化策略
no-appendfsync-on-rewrite no:AOF重寫期間是否禁止fsync;如果開啟該選項,可以減輕檔案重寫時CPU和硬碟的負載(尤其是硬碟),但是可能會丟失AOF重寫期間的資料;需要在負載和安全性之間進行平衡
auto-aof-rewrite-percentage 100:檔案重寫觸發條件之一
auto-aof-rewrite-min-size 64mb:檔案重寫觸發提交之一
aof-load-truncated yes:如果AOF檔案結尾損壞,Redis啟動時是否仍載入AOF檔案

26.RDB和AOF的優缺點

RDB持久化

優點:RDB檔案緊湊,體積小,網路傳輸快,適合全量複製;恢復速度比AOF快很多。當然,與AOF相比,RDB最重要的優點之一是對效能的影響相對較小。

缺點:RDB檔案的致命缺點在於其資料快照的持久化方式決定了必然做不到實時持久化,而在資料越來越重要的今天,資料的大量丟失很多時候是無法接受的,因此AOF持久化成為主流。此外,RDB檔案需要滿足特定格式,相容性差(如老版本的Redis不相容新版本的RDB檔案)。

AOF持久化

與RDB持久化相對應,AOF的優點在於支援秒級持久化、相容性好,缺點是檔案大、恢復速度慢、對效能影響大。

27.持久化策略選擇

(1)如果Redis中的資料完全丟棄也沒有關係(如Redis完全用作DB層資料的cache),那麼無論是單機,還是主從架構,都可以不進行任何持久化。

(2)在單機環境下(對於個人開發者,這種情況可能比較常見),如果可以接受十幾分鍾或更多的資料丟失,選擇RDB對Redis的效能更加有利;如果只能接受秒級別的資料丟失,應該選擇AOF。

(3)但在多數情況下,我們都會配置主從環境,slave的存在既可以實現資料的熱備,也可以進行讀寫分離分擔Redis讀請求,以及在master宕掉後繼續提供服務。

28.redis快取被擊穿處理機制

使用mutex。簡單地來說,就是在快取失效的時候(判斷拿出來的值為空),不是立即去load db,而是先使用快取工具的某些帶成功操作返回值的操作(比如Redis的SETNX或者Memcache的ADD)去set一個mutex key,當操作返回成功時,再進行load db的操作並回設快取;否則,就重試整個get快取的方法

29.Redis還提供的高階工具

像慢查詢分析、效能測試、Pipeline、事務、Lua自定義命令、Bitmaps、HyperLogLog、釋出/訂閱、Geo等個性化功能。

30.Redis常用管理命令

dbsize 返回當前資料庫 key 的數量。
info 返回當前 redis 伺服器狀態和一些統計資訊。
monitor 實時監聽並返回redis伺服器接收到的所有請求資訊。
shutdown 把資料同步儲存到磁碟上,並關閉redis服務。
config get parameter 獲取一個 redis 配置引數資訊。(個別引數可能無法獲取)
config set parameter value 設定一個 redis 配置引數資訊。(個別引數可能無法獲取)
config resetstat 重置 info 命令的統計資訊。(重置包括:keyspace 命中數、
keyspace 錯誤數、 處理命令數,接收連線數、過期 key 數)
debug object key 獲取一個 key 的除錯資訊。
debug segfault 製造一次伺服器當機。
flushdb 刪除當前資料庫中所有 key,此方法不會失敗。小心慎用
flushall 刪除全部資料庫中所有 key,此方法不會失敗。小心慎用

31.Reids工具命令

#redis-server:Redis 伺服器的 daemon 啟動程式
#redis-cli:Redis 命令列操作工具。當然,你也可以用 telnet 根據其純文字協議來操作
#redis-benchmark:Redis 效能測試工具,測試 Redis 在你的系統及你的配置下的讀寫效能
$redis-benchmark -n 100000 –c 50
#模擬同時由 50 個客戶端傳送 100000 個 SETs/GETs 查詢
#redis-check-aof:更新日誌檢查
#redis-check-dump:本地資料庫檢查

32.為什麼需要持久化?

由於Redis是一種記憶體型資料庫,即伺服器在執行時,系統為其分配了一部分記憶體儲存資料,一旦伺服器掛了,或者突然當機了,那麼資料庫裡面的資料將會丟失,為了使伺服器即使突然關機也能儲存資料,必須通過持久化的方式將資料從記憶體儲存到磁碟中。

33.判斷key是否存在

exists key +key名字

34.刪除key

del key1 key2 …

35.快取和資料庫間資料一致性問題

分散式環境下(單機就不用說了)非常容易出現快取和資料庫間的資料一致性問題,針對這一點的話,只能說,如果你的專案對快取的要求是強一致性的,那麼請不要使用快取。我們只能採取合適的策略來降低快取和資料庫間資料不一致的概率,而無法保證兩者間的強一致性。合適的策略包括 合適的快取更新策略,更新資料庫後要及時更新快取、快取失敗時增加重試機制,例如MQ模式的訊息佇列。

36.布隆過濾器

bloomfilter就類似於一個hash set,用於快速判某個元素是否存在於集合中,其典型的應用場景就是快速判斷一個key是否存在於某容器,不存在就直接返回。布隆過濾器的關鍵就在於hash演算法和容器大小

37.快取雪崩問題

存在同一時間內大量鍵過期(失效),接著來的一大波請求瞬間都落在了資料庫中導致連線異常。

解決方案:

1、也是像解決快取穿透一樣加鎖排隊。

2、建立備份快取,快取A和快取B,A設定超時時間,B不設值超時時間,先從A讀快取,A沒有讀B,並且更新A快取和B快取;

38.快取併發問題

這裡的併發指的是多個redis的client同時set key引起的併發問題。比較有效的解決方案就是把redis.set操作放在佇列中使其序列化,必須的一個一個執行,具體的程式碼就不上了,當然加鎖也是可以的,至於為什麼不用redis中的事務,留給各位看官自己思考探究。

39.Redis分散式

redis支援主從的模式。原則:Master會將資料同步到slave,而slave不會將資料同步到master。Slave啟動時會連線master來同步資料。

這是一個典型的分散式讀寫分離模型。我們可以利用master來插入資料,slave提供檢索服務。這樣可以有效減少單個機器的併發訪問數量

40.讀寫分離模型

通過增加Slave DB的數量,讀的效能可以線性增長。為了避免Master DB的單點故障,叢集一般都會採用兩臺Master DB做雙機熱備,所以整個叢集的讀和寫的可用性都非常高。讀寫分離架構的缺陷在於,不管是Master還是Slave,每個節點都必須儲存完整的資料,如果在資料量很大的情況下,叢集的擴充套件能力還是受限於單個節點的儲存能力,而且對於Write-intensive型別的應用,讀寫分離架構並不適合。

41.資料分片模型

為了解決讀寫分離模型的缺陷,可以將資料分片模型應用進來。

可以將每個節點看成都是獨立的master,然後通過業務實現資料分片。

結合上面兩種模型,可以將每個master設計成由一個master和多個slave組成的模型。

42. redis常見效能問題和解決方案:

Master最好不要做任何持久化工作,如RDB記憶體快照和AOF日誌檔案

如果資料比較重要,某個Slave開啟AOF備份資料,策略設定為每秒同步一次

為了主從複製的速度和連線的穩定性,Master和Slave最好在同一個區域網內

儘量避免在壓力很大的主庫上增加從庫

43.redis通訊協議

RESP 是redis客戶端和服務端之前使用的一種通訊協議;RESP 的特點:實現簡單、快速解析、可讀性好

44.Redis分散式鎖實現

先拿setnx來爭搶鎖,搶到之後,再用expire給鎖加一個過期時間防止鎖忘記了釋放。**如果在setnx之後執行expire之前程式意外crash或者要重啟維護了,那會怎麼樣?**set指令有非常複雜的引數,這個應該是可以同時把setnx和expire合成一條指令來用的!

45.Redis做非同步佇列

一般使用list結構作為佇列,rpush生產訊息,lpop消費訊息。當lpop沒有訊息的時候,要適當sleep一會再重試。缺點:在消費者下線的情況下,生產的訊息會丟失,得使用專業的訊息佇列如rabbitmq等。**能不能生產一次消費多次呢?**使用pub/sub主題訂閱者模式,可以實現1:N的訊息佇列。

46.Redis中海量資料的正確操作方式

利用SCAN系列命令(SCAN、SSCAN、HSCAN、ZSCAN)完成資料迭代。

47.SCAN系列命令注意事項

SCAN的引數沒有key,因為其迭代物件是DB內資料;
返回值都是陣列,第一個值都是下一次迭代遊標;
時間複雜度:每次請求都是O(1),完成所有迭代需要O(N),N是元素數量;
可用版本:version >= 2.8.0;

48.Redis 管道 Pipeline

在某些場景下我們在一次操作中可能需要執行多個命令,而如果我們只是一個命令一個命令去執行則會浪費很多網路消耗時間,如果將命令一次性傳輸到 Redis中去再執行,則會減少很多開銷時間。但是需要注意的是 pipeline中的命令並不是原子性執行的,也就是說管道中的命令到達 Redis伺服器的時候可能會被其他的命令穿插

49.事務不支援回滾

50.手寫一個 LRU 演算法

class LRUCache<K, V> extends LinkedHashMap<K, V> {
private final int CACHE_SIZE;

/**
 * 傳遞進來最多能快取多少資料
 *
 * @param cacheSize 快取大小
 */
public LRUCache(int cacheSize) {
    // true 表示讓 linkedHashMap 按照訪問順序來進行排序,最近訪問的放在頭部,最老訪問的放在尾部。
    super((int) Math.ceil(cacheSize / 0.75) + 1, 0.75f, true);
    CACHE_SIZE = cacheSize;
}

@Override
protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {
    // 當 map中的資料量大於指定的快取個數的時候,就自動刪除最老的資料。
    return size() > CACHE_SIZE;
}

}

51.多節點 Redis 分散式鎖:Redlock 演算法

獲取當前時間(start)。

依次向 N 個 Redis節點請求鎖。請求鎖的方式與從單節點 Redis獲取鎖的方式一致。為了保證在某個 Redis節點不可用時該演算法能夠繼續執行,獲取鎖的操作都需要設定超時時間,需要保證該超時時間遠小於鎖的有效時間。這樣才能保證客戶端在向某個 Redis節點獲取鎖失敗之後,可以立刻嘗試下一個節點。

計算獲取鎖的過程總共消耗多長時間(consumeTime = end - start)。如果客戶端從大多數 Redis節點(>= N/2 + 1) 成功獲取鎖,並且獲取鎖總時長沒有超過鎖的有效時間,這種情況下,客戶端會認為獲取鎖成功,否則,獲取鎖失敗。

如果最終獲取鎖成功,鎖的有效時間應該重新設定為鎖最初的有效時間減去 consumeTime。

如果最終獲取鎖失敗,客戶端應該立刻向所有 Redis節點發起釋放鎖的請求。

52.Redis 中設定過期時間主要通過以下四種方式

expire key seconds:設定 key 在 n 秒後過期;
pexpire key milliseconds:設定 key 在 n 毫秒後過期;
expireat key timestamp:設定 key 在某個時間戳(精確到秒)之後過期;
pexpireat key millisecondsTimestamp:設定 key 在某個時間戳(精確到毫秒)之後過期;

53.Reids三種不同刪除策略

定時刪除:在設定鍵的過期時間的同時,建立一個定時任務,當鍵達到過期時間時,立即執行對鍵的刪除操作

惰性刪除:放任鍵過期不管,但在每次從鍵空間獲取鍵時,都檢查取得的鍵是否過期,如果過期的話,就刪除該鍵,如果沒有過期,就返回該鍵

定期刪除:每隔一點時間,程式就對資料庫進行一次檢查,刪除裡面的過期鍵,至於要刪除多少過期鍵,以及要檢查多少個資料庫,則由演算法決定。

54.定時刪除

**優點:**對記憶體友好,定時刪除策略可以保證過期鍵會盡可能快地被刪除,並釋放國期間所佔用的記憶體
**缺點:**對cpu時間不友好,在過期鍵比較多時,刪除任務會佔用很大一部分cpu時間,在記憶體不緊張但cpu時間緊張的情況下,將cpu時間用在刪除和當前任務無關的過期鍵上,影響伺服器的響應時間和吞吐量

55.定期刪除

由於定時刪除會佔用太多cpu時間,影響伺服器的響應時間和吞吐量以及惰性刪除浪費太多記憶體,有記憶體洩露的危險,所以出現一種整合和折中這兩種策略的定期刪除策略。

定期刪除策略每隔一段時間執行一次刪除過期鍵操作,並通過限制刪除操作執行的時長和頻率來減少刪除操作對CPU時間的影響。
定時刪除策略有效地減少了因為過期鍵帶來的記憶體浪費。

56.惰性刪除

**優點:**對cpu時間友好,在每次從鍵空間獲取鍵時進行過期鍵檢查並是否刪除,刪除目標也僅限當前處理的鍵,這個策略不會在其他無關的刪除任務上花費任何cpu時間。
**缺點:**對記憶體不友好,過期鍵過期也可能不會被刪除,導致所佔的記憶體也不會釋放。甚至可能會出現記憶體洩露的現象,當存在很多過期鍵,而這些過期鍵又沒有被訪問到,這會可能導致它們會一直儲存在記憶體中,造成記憶體洩露。

57.Reids 管理工具:Redis Manager 2.0

github地址

58.Redis常見的幾種快取策略

Cache-Aside
Read-Through
Write-Through
Write-Behind

59.Redis Module 實現布隆過濾器

Redis module 是Redis 4.0 以後支援的新的特性,這裡很多國外牛逼的大學和機構提供了很多牛逼的Module 只要編譯引入到Redis 中就能輕鬆的實現我們某些需求的功能。在Redis 官方Module 中有一些我們常見的一些模組,我們在這裡就做一個簡單的使用。

neural-redis 主要是神經網路的機器學,整合到redis 可以做一些機器訓練感興趣的可以嘗試
RedisSearch 主要支援一些富文字的的搜尋
RedisBloom 支援分散式環境下的Bloom 過濾器

60.對於大量的請求怎麼樣處理?

redis是一個單執行緒程式,也就說同一時刻它只能處理一個客戶端請求; redis是通過IO多路複用(select,epoll,kqueue,依據不同的平臺,採取不同的實現)來處理多個客戶端請求的

61.為什麼Redis的操作是原子性的,怎麼保證原子性的?

Redis的操作之所以是原子性的,是因為Redis是單執行緒的。

62. 一個字串型別的值能儲存最大容量是多少?

512M

63. Redis 叢集方案應該怎麼做?都有哪些方案?

1,codis,目前用的最多的叢集方案,基本和 twemproxy 一致的效果,但它支援在 節點數量改變情況下,舊節點資料可恢復到新 hash 節點
2,redis cluster3.0 自帶的叢集,特點在於他的分散式演算法不是一致性 hash,而是 hash 槽的概念,以及自身支援節點設定從節點

64.MySQL裡有2000w資料,redis中只存20w的資料,如何保證redis中的資料都是熱點資料?

redis記憶體資料集大小上升到一定大小的時候,就會施行資料淘汰策略。

65. Redis支援的Java客戶端都有哪些?官方推薦用哪個?

Redisson、Jedis、lettuce等等,官方推薦使用Redisson。

66.Redis 到底是怎麼實現“附近的人”

使用方式
GEOADD key longitude latitude member [longitude latitude member …]
將給定的位置物件(緯度、經度、名字)新增到指定的key。其中,key為集合名稱,member為該經緯度所對應的物件。在實際運用中,當所需儲存的物件數量過多時,可通過設定多key(如一個省一個key)的方式對物件集合變相做sharding,避免單集合數量過多。

成功插入後的返回值:

(integer) N
其中N為成功插入的個數。

相關文章