自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Python面試官問(wèn)Redis的相關(guān)問(wèn)題,看完這篇文章就夠了

數(shù)據(jù)庫(kù) 其他數(shù)據(jù)庫(kù) 后端 Redis
最近寫(xiě)了一篇自己搭建redis集群并在自己項(xiàng)目中使用的文章,今天早上看別人寫(xiě)的面經(jīng)發(fā)現(xiàn)redis在面試中還是比較常問(wèn)的(我是python方向)。所以查閱官方文檔以及他人造好的輪子,總結(jié)了一些redis面試和學(xué)習(xí)中你必須掌握的問(wèn)題。事無(wú)巨細(xì),不可能囊括到所有內(nèi)容,盡量把比較常見(jiàn)的寫(xiě)出來(lái)。

 最近寫(xiě)了一篇自己搭建redis集群并在自己項(xiàng)目中使用的文章,今天早上看別人寫(xiě)的面經(jīng)發(fā)現(xiàn)redis在面試中還是比較常問(wèn)的(我是python方向)。所以查閱官方文檔以及他人造好的輪子,總結(jié)了一些redis面試和學(xué)習(xí)中你必須掌握的問(wèn)題。事無(wú)巨細(xì),不可能囊括到所有內(nèi)容,盡量把比較常見(jiàn)的寫(xiě)出來(lái)。

[[226862]]

什么是Redis?

安裝Redis Redis的代碼遵循ANSI-C編寫(xiě),可以在所有POSIX系統(tǒng)(如Linux, *BSD, Mac OS X, Solaris等)上安裝運(yùn)行。而且Redis并不依賴任何非標(biāo)準(zhǔn)庫(kù),也沒(méi)有編譯參數(shù)必需添加。redis的安裝出奇的簡(jiǎn)單,這可能也是他風(fēng)靡的一個(gè)原因,讓人很容易上手.Redis 是一個(gè)使用 C 語(yǔ)言寫(xiě)成的,開(kāi)源的 key-value 數(shù)據(jù)庫(kù)。。和Memcached類似,它支持存儲(chǔ)的value類型相對(duì)更多,包括string(字符串)、list(鏈表)、set(集合)、zset(sorted set --有序集合)和hash(哈希類型)。這些數(shù)據(jù)類型都支持push/pop、add/remove及取交集并集和差集及更豐富的操作,而且這些操作都是原子性的。在此基礎(chǔ)上,redis支持各種不同方式的排序。與memcached一樣,為了保證效率,數(shù)據(jù)都是緩存在內(nèi)存中。區(qū)別的是redis會(huì)周期性的把更新的數(shù)據(jù)寫(xiě)入磁盤(pán)或者把修改操作寫(xiě)入追加的記錄文件,并且在此基礎(chǔ)上實(shí)現(xiàn)了master-slave(主從)同步。目前,Vmware在資助著redis項(xiàng)目的開(kāi)發(fā)和維護(hù)。

Redis與Memcached的區(qū)別與比較

1 、Redis不僅僅支持簡(jiǎn)單的k/v類型的數(shù)據(jù),同時(shí)還提供list,set,zset,hash等數(shù)據(jù)結(jié)構(gòu)的存儲(chǔ)。memcache支持簡(jiǎn)單的數(shù)據(jù)類型,String。

2 、Redis支持?jǐn)?shù)據(jù)的備份,即master-slave模式的數(shù)據(jù)備份。

3 、Redis支持?jǐn)?shù)據(jù)的持久化,可以將內(nèi)存中的數(shù)據(jù)保持在磁盤(pán)中,重啟的時(shí)候可以再次加載進(jìn)行使用,而Memecache把數(shù)據(jù)全部存在內(nèi)存之中

4、 redis的速度比memcached快很多

5、Memcached是多線程,非阻塞IO復(fù)用的網(wǎng)絡(luò)模型;Redis使用單線程的IO復(fù)用模型。

Python面試官問(wèn)Redis的相關(guān)問(wèn)題,看完這篇文章就夠了

如果想要更詳細(xì)了解的話,可以查看慕課網(wǎng)上的這篇手記(非常推薦) :《腳踏兩只船的困惑 - Memcached與Redis》:www.imooc.com/article/235…

Redis與Memcached的選擇

***策略: 使用Redis的String類型做的事,都可以用Memcached替換,以此換取更好的性能提升; 除此以外,優(yōu)先考慮Redis;

使用redis有哪些好處?

(1) 速度快,因?yàn)閿?shù)據(jù)存在內(nèi)存中,類似于HashMap,HashMap的優(yōu)勢(shì)就是查找和操作的時(shí)間復(fù)雜度都是O(1)

(2)支持豐富數(shù)據(jù)類型,支持string,list,set,sorted set,hash

(3) 支持事務(wù),操作都是原子性,所謂的原子性就是對(duì)數(shù)據(jù)的更改要么全部執(zhí)行,要么全部不執(zhí)行

(4) 豐富的特性:可用于緩存,消息,按key設(shè)置過(guò)期時(shí)間,過(guò)期后將會(huì)自動(dòng)刪除

Redis常見(jiàn)數(shù)據(jù)結(jié)構(gòu)使用場(chǎng)景

1. String

常用命令: set,get,decr,incr,mget 等。

String數(shù)據(jù)結(jié)構(gòu)是簡(jiǎn)單的key-value類型,value其實(shí)不僅可以是String,也可以是數(shù)字。常規(guī)key-value緩存應(yīng)用;常規(guī)計(jì)數(shù):微博數(shù),粉絲數(shù)等。

2.Hash

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

Hash是一個(gè)string類型的field和value的映射表,hash特別適合用于存儲(chǔ)對(duì)象。 比如我們可以Hash數(shù)據(jù)結(jié)構(gòu)來(lái)存儲(chǔ)用戶信息,商品信息等等。

舉個(gè)例子: 最近做的一個(gè)電商網(wǎng)站項(xiàng)目的首頁(yè)就使用了redis的hash數(shù)據(jù)結(jié)構(gòu)進(jìn)行緩存,因?yàn)橐粋€(gè)網(wǎng)站的首頁(yè)訪問(wèn)量是***的,所以通常網(wǎng)站的首頁(yè)可以通過(guò)redis緩存來(lái)提高性能和并發(fā)量。我用jedis客戶端來(lái)連接和操作我搭建的redis集群或者單機(jī)redis,利用jedis可以很容易的對(duì)redis進(jìn)行相關(guān)操作,總的來(lái)說(shuō)從搭一個(gè)簡(jiǎn)單的集群到實(shí)現(xiàn)redis作為緩存的整個(gè)步驟不難。感興趣的可以看我昨天寫(xiě)的這篇文章:

《一文輕松搞懂redis集群原理及搭建與使用》: juejin.im/post/5ad54d…

3.List

常用命令: lpush,rpush,lpop,rpop,lrange等

list就是鏈表,Redis list的應(yīng)用場(chǎng)景非常多,也是Redis最重要的數(shù)據(jù)結(jié)構(gòu)之一,比如微博的關(guān)注列表,粉絲列表,***消息排行等功能都可以用Redis的list結(jié)構(gòu)來(lái)實(shí)現(xiàn)。

Redis list的實(shí)現(xiàn)為一個(gè)雙向鏈表,即可以支持反向查找和遍歷,更方便操作,不過(guò)帶來(lái)了部分額外的內(nèi)存開(kāi)銷。

4.Set

常用命令:sadd,spop,smembers,sunion 等

set對(duì)外提供的功能與list類似是一個(gè)列表的功能,特殊之處在于set是可以自動(dòng)排重的。當(dāng)你需要存儲(chǔ)一個(gè)列表數(shù)據(jù),又不希望出現(xiàn)重復(fù)數(shù)據(jù)時(shí),set是一個(gè)很好的選擇,并且set提供了判斷某個(gè)成員是否在一個(gè)set集合內(nèi)的重要接口,這個(gè)也是list所不能提供的。

在微博應(yīng)用中,可以將一個(gè)用戶所有的關(guān)注人存在一個(gè)集合中,將其所有粉絲存在一個(gè)集合。Redis可以非常方便的實(shí)現(xiàn)如共同關(guān)注、共同喜好、二度好友等功能。

5.Sorted Set

常用命令: zadd,zrange,zrem,zcard等

和set相比,sorted set增加了一個(gè)權(quán)重參數(shù)score,使得集合中的元素能夠按score進(jìn)行有序排列。

舉例: 在直播系統(tǒng)中,實(shí)時(shí)排行信息包含直播間在線用戶列表,各種禮物排行榜,彈幕消息(可以理解為按消息維度的消息排行榜)等信息,適合使用Redis中的SortedSet結(jié)構(gòu)進(jìn)行存儲(chǔ)。

MySQL里有2000w數(shù)據(jù),Redis中只存20w的數(shù)據(jù),如何保證Redis中的數(shù)據(jù)都是熱點(diǎn)數(shù)據(jù)(redis有哪些數(shù)據(jù)淘汰策略???)

相關(guān)知識(shí):redis 內(nèi)存數(shù)據(jù)集大小上升到一定大小的時(shí)候,就會(huì)施行數(shù)據(jù)淘汰策略(回收策略)。redis 提供 6種數(shù)據(jù)淘汰策略:

  1. volatile-lru:從已設(shè)置過(guò)期時(shí)間的數(shù)據(jù)集(server.db[i].expires)中挑選最近最少使用的數(shù)據(jù)淘汰

  2. volatile-ttl:從已設(shè)置過(guò)期時(shí)間的數(shù)據(jù)集(server.db[i].expires)中挑選將要過(guò)期的數(shù)據(jù)淘汰

  3. volatile-random:從已設(shè)置過(guò)期時(shí)間的數(shù)據(jù)集(server.db[i].expires)中任意選擇數(shù)據(jù)淘汰

  4. allkeys-lru:從數(shù)據(jù)集(server.db[i].dict)中挑選最近最少使用的數(shù)據(jù)淘汰

  5. allkeys-random:從數(shù)據(jù)集(server.db[i].dict)中任意選擇數(shù)據(jù)淘汰

  6. no-enviction(驅(qū)逐):禁止驅(qū)逐數(shù)據(jù)

Redis的并發(fā)競(jìng)爭(zhēng)問(wèn)題如何解決?

Redis為單進(jìn)程單線程模式,采用隊(duì)列模式將并發(fā)訪問(wèn)變?yōu)榇性L問(wèn)。Redis本身沒(méi)有鎖的概念,Redis對(duì)于多個(gè)客戶端連接并不存在競(jìng)爭(zhēng),但是在Jedis客戶端對(duì)Redis進(jìn)行并發(fā)訪問(wèn)時(shí)會(huì)發(fā)生連接超時(shí)、數(shù)據(jù)轉(zhuǎn)換錯(cuò)誤、阻塞、客戶端關(guān)閉連接等問(wèn)題,這些問(wèn)題均是由于客戶端連接混亂造成。對(duì)此有2種解決方法:

1.客戶端角度,為保證每個(gè)客戶端間正常有序與Redis進(jìn)行通信,對(duì)連接進(jìn)行池化,同時(shí)對(duì)客戶端讀寫(xiě)Redis操作采用內(nèi)部鎖synchronized。 

2.服務(wù)器角度,利用setnx實(shí)現(xiàn)鎖。

注:對(duì)于***種,需要應(yīng)用程序自己處理資源的同步,可以使用的方法比較通俗,可以使用synchronized也可以使用lock;第二種需要用到Redis的setnx命令,但是需要注意一些問(wèn)題。

Redis數(shù)據(jù)結(jié)構(gòu)

redis 的作者antirez曾稱其為一個(gè)數(shù)據(jù)結(jié)構(gòu)服務(wù)器(data structures server),這是一個(gè)非常準(zhǔn)確的表述,redis的所有功能就是將數(shù)據(jù)以其固有的幾種結(jié)構(gòu)保存,并提供給用戶操作這幾種結(jié)構(gòu)的接口。我們可以想象我們?cè)诟鞣N語(yǔ)言中的那些固有數(shù)據(jù)類型及其操作。

redis目前提供四種數(shù)據(jù)類型:string,list,set及zset(sorted set)和Hash。

  • string是最簡(jiǎn)單的類型,你可以理解成與Memcached一模一個(gè)的類型,一個(gè)key對(duì)應(yīng)一個(gè)value,其上支持的操作與Memcached的操作類似。但它的功能更豐富。

  • list是一個(gè)鏈表結(jié)構(gòu),主要功能是push、pop、獲取一個(gè)范圍的所有值等等。操作中key理解為鏈表的名字。

  • set是集合,和我們數(shù)學(xué)中的集合概念相似,對(duì)集合的操作有添加刪除元素,有對(duì)多個(gè)集合求交并差等操作。操作中key理解為集合的名字。

  • zset是set的一個(gè)升級(jí)版本,他在set的基礎(chǔ)上增加了一個(gè)順序?qū)傩?,這一屬性在添加修改元素的時(shí)候可以指定,每次指定后,zset會(huì)自動(dòng)重新按新的值調(diào)整順序。可以理解了有兩列的mysql表,一列存value,一列存順序。操作中key理解為zset的名字。

  • Hash數(shù)據(jù)類型允許用戶用Redis存儲(chǔ)對(duì)象類型,Hash數(shù)據(jù)類型的一個(gè)重要優(yōu)點(diǎn)是,當(dāng)你存儲(chǔ)的數(shù)據(jù)對(duì)象只有很少幾個(gè)key值時(shí),數(shù)據(jù)存儲(chǔ)的內(nèi)存消耗會(huì)很小.更多關(guān)于Hash數(shù)據(jù)類型的說(shuō)明請(qǐng)見(jiàn):http://code.google.com/p/redis/wiki/Hashes

Redis數(shù)據(jù)存儲(chǔ)

redis的存儲(chǔ)分為內(nèi)存存儲(chǔ)、磁盤(pán)存儲(chǔ)和log文件三部分,配置文件中有三個(gè)參數(shù)對(duì)其進(jìn)行配置。

save seconds updates,save配置,指出在多長(zhǎng)時(shí)間內(nèi),有多少次更新操作,就將數(shù)據(jù)同步到數(shù)據(jù)文件。這個(gè)可以多個(gè)條件配合,比如默認(rèn)配置文件中的設(shè)置,就設(shè)置了三個(gè)條件。

appendonly yes/no ,appendonly配置,指出是否在每次更新操作后進(jìn)行日志記錄,如果不開(kāi)啟,可能會(huì)在斷電時(shí)導(dǎo)致一段時(shí)間內(nèi)的數(shù)據(jù)丟失。因?yàn)閞edis本身同步數(shù)據(jù)文件是按上面的save條件來(lái)同步的,所以有的數(shù)據(jù)會(huì)在一段時(shí)間內(nèi)只存在于內(nèi)存中。

appendfsync no/always/everysec ,appendfsync配置,no表示等操作系統(tǒng)進(jìn)行數(shù)據(jù)緩存同步到磁盤(pán),always表示每次更新操作后手動(dòng)調(diào)用fsync()將數(shù)據(jù)寫(xiě)到磁盤(pán),everysec表示每秒同步一次。

責(zé)任編輯:龐桂玉 來(lái)源: 今日頭條
相關(guān)推薦

2022-05-27 08:18:00

HashMapHash哈希表

2017-03-07 15:35:26

Android適配 界面

2017-03-10 21:04:04

Android適配

2019-07-10 15:15:23

JVM虛擬機(jī)Java

2025-03-28 08:53:51

2019-10-31 09:48:53

MySQL數(shù)據(jù)庫(kù)事務(wù)

2020-01-15 08:06:28

HTTP超文本傳輸協(xié)議網(wǎng)絡(luò)協(xié)議

2020-03-14 09:17:55

HTTPS網(wǎng)絡(luò)協(xié)議HTTP

2017-03-30 22:41:55

虛擬化操作系統(tǒng)軟件

2020-05-15 11:14:58

操作系統(tǒng)面試官運(yùn)行

2017-09-08 11:10:35

前端面試Http協(xié)議

2019-10-10 11:20:22

MySQL索引數(shù)據(jù)庫(kù)

2024-03-26 00:00:06

RedisZSet排行榜

2017-12-12 12:53:09

2021-11-10 07:47:48

Traefik邊緣網(wǎng)關(guān)

2020-04-07 01:04:18

SessionCookieToken

2020-04-15 12:24:55

Exception Error Java

2020-11-02 08:12:52

finalJava開(kāi)發(fā)

2019-08-01 11:04:10

Linux磁盤(pán)I

2019-09-25 09:17:43

物聯(lián)網(wǎng)技術(shù)信息安全
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)