Redis 入門介紹

1、什么是Redis季眷?

Redis是一個(gè)高可用的key-value內(nèi)存數(shù)據(jù)庫(kù)。value可以支持多種類型卷胯。包括字符串(string)子刮、鏈表(list)、集合(set)窑睁、有序集合(zset sorted set)和哈希(hash)挺峡。類似于java中的HashMap也是key-value,value可以存放多種數(shù)據(jù)結(jié)構(gòu)葵孤。

Redis是內(nèi)存數(shù)據(jù)庫(kù),并且是key-value類型橱赠,沒有復(fù)雜的關(guān)系尤仍。所以讀取與存入比mysql這種傳統(tǒng)的關(guān)系型數(shù)據(jù)庫(kù)快。

相比于memcached內(nèi)存數(shù)據(jù)庫(kù)狭姨,它可以通過(guò)RDB或AOF的方式將內(nèi)存數(shù)據(jù)存入磁盤空間吓著,達(dá)到數(shù)據(jù)的持久化。并且Redis也可以通過(guò)主從復(fù)制送挑,哨兵,集群等方式實(shí)現(xiàn)高可用暖眼。

2惕耕、Redis數(shù)據(jù)庫(kù)

2.1 Redis數(shù)據(jù)庫(kù)

Redis默認(rèn)有16個(gè)數(shù)據(jù)庫(kù)。

redisServer結(jié)構(gòu)中保存著一個(gè)redisDb數(shù)組诫肠,int dbnum 保存著數(shù)據(jù)庫(kù)數(shù)量司澎。dbnum默認(rèn)是16。

struct redisServer{
    // 一個(gè)數(shù)組栋豫,保存著服務(wù)器中的所有數(shù)據(jù)庫(kù)
    redisDb *db ;
   //服務(wù)器的數(shù)據(jù)庫(kù)數(shù)量
    int  dbnum ;
}

每個(gè)數(shù)據(jù)庫(kù)對(duì)應(yīng)一個(gè)redisDb結(jié)構(gòu)挤安,redisDb結(jié)構(gòu)中的dict字典(鍵空間)保存了改數(shù)據(jù)庫(kù)的所有的鍵值對(duì) 。

struct redisDb{
    // 數(shù)據(jù)庫(kù)鍵空間丧鸯,保存著數(shù)據(jù)庫(kù)中的所有鍵值對(duì)
    dict *dict ;
}

切換數(shù)據(jù)庫(kù)select 1
當(dāng)客戶端切換到1號(hào)數(shù)據(jù)庫(kù)時(shí)蛤铜,數(shù)據(jù)結(jié)構(gòu)示意圖:

image.png

切換數(shù)據(jù)庫(kù)select 2
當(dāng)客戶端切換到2號(hào)數(shù)據(jù)庫(kù)時(shí),數(shù)據(jù)結(jié)構(gòu)示意圖:

image.png

2.2 數(shù)據(jù)庫(kù)建空間示意圖

  • alphabet 是一個(gè)列表鍵丛肢,鍵的名字是字符串'alphabet'围肥,鍵的值是一個(gè)包含三個(gè)元素的列表對(duì)象。
  • book是一個(gè)哈希表鍵蜂怎,鍵的名字是字符串'book'穆刻,鍵的值是一個(gè)包含三個(gè)元素的哈希表對(duì)象。
  • message是一個(gè)字符串鍵杠步,鍵的名字是字符串'message'氢伟,鍵的值是一個(gè)字符串對(duì)象'hello world'


    image.png

2.3 數(shù)據(jù)庫(kù)操作

執(zhí)行命令set date "2013.12.1"
添加一個(gè)新鍵值對(duì)到數(shù)據(jù)庫(kù),就是將鍵值對(duì)添加到對(duì)應(yīng)數(shù)據(jù)庫(kù)(redisDb)的字典(dict)中

date

刪除book鍵del book

del

更新message鍵set message "blah blah"

set

取值alphabet lrange alphabet 0 -1

lrange

清空數(shù)據(jù)庫(kù)flushdb
針對(duì)數(shù)據(jù)庫(kù)本身的redis命令幽歼,基本上都是針對(duì)redisDb的字典(dict)進(jìn)行操作朵锣。

2.4 鍵生存時(shí)間及過(guò)期策略

設(shè)置鍵過(guò)期時(shí)間,可以以秒或者毫秒精度

命令 描述
expire <key> <ttl> 設(shè)置鍵key的生存時(shí)間為ttl 秒
pexpire <key> <ttl> 設(shè)置鍵key的生存時(shí)間為ttl 毫秒
expireat <key> <timestamp> 設(shè)置鍵key的過(guò)期時(shí)間為timestamp所指定的秒數(shù)時(shí)間戳
pexpireat <key> <timestamp> 設(shè)置鍵key的過(guò)期時(shí)間為timestamp所指定的毫秒數(shù)時(shí)間戳

expire test 5 :設(shè)置key test過(guò)期時(shí)間為5秒以后
pexpire test 6000 :設(shè)置key test過(guò)期時(shí)間為6000毫秒以后
expireat test 1377333100 :設(shè)置key test過(guò)期時(shí)間為1377333100
pexpireat test 1377333100000 :設(shè)置key test過(guò)期時(shí)間為1377333100000

實(shí)際上expire试躏,pexpire 猪勇,expireat 三個(gè)命令都是使用pexpireat 命令實(shí)現(xiàn)的,redis會(huì)將其他類型的過(guò)期時(shí)間最終都轉(zhuǎn)化為毫秒時(shí)間戳保存颠蕴。

過(guò)期時(shí)間的保存

redisDb結(jié)構(gòu)的expires字典保存了數(shù)據(jù)庫(kù)中的所有鍵的過(guò)期時(shí)間泣刹,稱為過(guò)期字典助析。
過(guò)期字典的key為指針,指向鍵空間的某個(gè)鍵對(duì)象椅您。
過(guò)期字典的value為long long 整數(shù)外冀,保存著過(guò)期時(shí)間戳-毫秒精度的unix時(shí)間戳。

struct redisDb{
     //過(guò)期字典掀泳,保存著鍵的過(guò)期時(shí)間
    dict *expires ;
}
expires

為了展示方面雪隧,圖示中的鍵空間與過(guò)期字典會(huì)出現(xiàn)兩次alphabet及book對(duì)象,實(shí)際中员舵,鍵空間的key與過(guò)期字典的key指向的是同一個(gè)鍵對(duì)象脑沿,不會(huì)出現(xiàn)重復(fù)對(duì)象。

過(guò)期鍵的刪除策略
刪除策略 描述 優(yōu)點(diǎn) 缺點(diǎn)
定時(shí)刪除 設(shè)置鍵的過(guò)期時(shí)马僻,創(chuàng)建一個(gè)定時(shí)器(timer),讓定時(shí)器在鍵的過(guò)期時(shí)間來(lái)臨時(shí)庄拇,立即執(zhí)行對(duì)鍵的刪除操作 及時(shí)刪除過(guò)期鍵,釋放內(nèi)存 過(guò)期鍵數(shù)量較大時(shí)韭邓,會(huì)創(chuàng)建大量定時(shí)器措近,占用相當(dāng)一部分cpu時(shí)間,不采用
惰性刪除 放任過(guò)期鍵不管女淑,當(dāng)獲取鍵時(shí)瞭郑,判斷是否過(guò)期,過(guò)期的話鸭你,就刪除掉屈张,未過(guò)期,返回該鍵 不用創(chuàng)建定時(shí)器袱巨,不占用cpu時(shí)間 過(guò)期鍵會(huì)占用大量?jī)?nèi)存袜茧,導(dǎo)致數(shù)據(jù)積壓
定期刪除 每隔一段時(shí)間,程序?qū)?shù)據(jù)庫(kù)進(jìn)行一次檢查瓣窄,刪除過(guò)期鍵笛厦,至于刪除多少過(guò)期鍵,檢查多少個(gè)數(shù)據(jù)庫(kù)俺夕,有算法決定 是前兩種策略的折中方案裳凸,既能比較及時(shí)釋放內(nèi)存,又能不占用大量cpu時(shí)間 難點(diǎn)在于確定操作執(zhí)行的時(shí)長(zhǎng)和頻率劝贸,既不能讓刪除操作執(zhí)行太頻繁而占用cpu時(shí)間姨谷,又不能執(zhí)行太少,浪費(fèi)內(nèi)存
Redis服務(wù)器使用了惰性刪除及定期刪除兩種策略映九。

惰性刪除:所有讀寫Redis命令在執(zhí)行之前都會(huì)調(diào)用expireIfNeeded函數(shù)對(duì)輸入鍵進(jìn)行檢查梦湘。expireIfNeeded就像一個(gè)過(guò)濾器,將過(guò)期鍵刪除。


expireIfNeeded

定期刪除:redis的周期性函數(shù)serverCron會(huì)在規(guī)定時(shí)間內(nèi)多次遍歷各個(gè)數(shù)據(jù)庫(kù)捌议,從數(shù)據(jù)庫(kù)的expires字典中隨機(jī)檢查一部分鍵的過(guò)期時(shí)間哼拔,并刪除其中的過(guò)期鍵。

RDB對(duì)過(guò)期鍵的處理

生成RDB文件
savebgsave命令只會(huì)對(duì)未過(guò)期的鍵進(jìn)行保存操作瓣颅,保存至rdb文件倦逐。

載入RDB文件
如果服務(wù)器以主服務(wù)器模式運(yùn)行,那么載入RDB文件時(shí)宫补,不會(huì)將過(guò)期鍵導(dǎo)入檬姥。
如果服務(wù)器以從服務(wù)器模式運(yùn)行,那么載入RDB文件時(shí)粉怕,會(huì)將過(guò)期鍵導(dǎo)入健民,等主服務(wù)器同步數(shù)據(jù)時(shí),再刪除掉過(guò)期數(shù)據(jù)贫贝。

AOF對(duì)過(guò)期鍵的處理

AOF文件寫入
當(dāng)服務(wù)器以AOF持久化模式運(yùn)行時(shí)荞雏,對(duì)于未被刪除的過(guò)期數(shù)據(jù),AOF不會(huì)因?yàn)檫^(guò)期鍵產(chǎn)生任何影響平酿。
對(duì)于已被刪除的數(shù)據(jù),程序會(huì)像AOF追加(append)一條DEL命令悦陋,來(lái)顯示地記錄該鍵已被刪除蜈彼。

AOF重寫
在執(zhí)行AOF重寫的過(guò)程中,程序會(huì)對(duì)數(shù)據(jù)庫(kù)中的鍵進(jìn)行檢查俺驶,已過(guò)期的鍵不會(huì)被保存至重寫后的AOF文件中幸逆。

復(fù)制對(duì)過(guò)期鍵的處理

當(dāng)服務(wù)器運(yùn)行在復(fù)制模式下,從服務(wù)器的過(guò)期刪除動(dòng)作由主服務(wù)器控制暮现。
主服務(wù)器在刪除一個(gè)過(guò)期鍵時(shí)还绘,會(huì)向從服務(wù)器發(fā)送一個(gè)DEl命令,告知從服務(wù)器刪除過(guò)期鍵
從服務(wù)器執(zhí)行客戶端發(fā)送的命令時(shí)栖袋,即使碰見過(guò)期鍵也不會(huì)將過(guò)期鍵刪除拍顷,而是會(huì)繼續(xù)像處理未過(guò)期鍵一樣進(jìn)行處理。
從服務(wù)只有接收到主服務(wù)器的DEl命令塘幅,才會(huì)刪除過(guò)期鍵昔案。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市电媳,隨后出現(xiàn)的幾起案子踏揣,更是在濱河造成了極大的恐慌,老刑警劉巖匾乓,帶你破解...
    沈念sama閱讀 212,718評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件捞稿,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)娱局,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門彰亥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人铃辖,你說(shuō)我怎么就攤上這事剩愧。” “怎么了娇斩?”我有些...
    開封第一講書人閱讀 158,207評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵仁卷,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我犬第,道長(zhǎng)锦积,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,755評(píng)論 1 284
  • 正文 為了忘掉前任歉嗓,我火速辦了婚禮丰介,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘鉴分。我一直安慰自己哮幢,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,862評(píng)論 6 386
  • 文/花漫 我一把揭開白布志珍。 她就那樣靜靜地躺著橙垢,像睡著了一般。 火紅的嫁衣襯著肌膚如雪伦糯。 梳的紋絲不亂的頭發(fā)上柜某,一...
    開封第一講書人閱讀 50,050評(píng)論 1 291
  • 那天,我揣著相機(jī)與錄音敛纲,去河邊找鬼喂击。 笑死,一個(gè)胖子當(dāng)著我的面吹牛淤翔,可吹牛的內(nèi)容都是我干的翰绊。 我是一名探鬼主播,決...
    沈念sama閱讀 39,136評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼旁壮,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼辞做!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起寡具,我...
    開封第一講書人閱讀 37,882評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤秤茅,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后童叠,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體框喳,經(jīng)...
    沈念sama閱讀 44,330評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡课幕,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,651評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了五垮。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片乍惊。...
    茶點(diǎn)故事閱讀 38,789評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖放仗,靈堂內(nèi)的尸體忽然破棺而出润绎,到底是詐尸還是另有隱情,我是刑警寧澤诞挨,帶...
    沈念sama閱讀 34,477評(píng)論 4 333
  • 正文 年R本政府宣布莉撇,位于F島的核電站,受9級(jí)特大地震影響惶傻,放射性物質(zhì)發(fā)生泄漏棍郎。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,135評(píng)論 3 317
  • 文/蒙蒙 一银室、第九天 我趴在偏房一處隱蔽的房頂上張望涂佃。 院中可真熱鬧,春花似錦蜈敢、人聲如沸辜荠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)伯病。三九已至,卻和暖如春辐宾,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背膨蛮。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工叠纹, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人敞葛。 一個(gè)月前我還...
    沈念sama閱讀 46,598評(píng)論 2 362
  • 正文 我出身青樓誉察,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親惹谐。 傳聞我的和親對(duì)象是個(gè)殘疾皇子持偏,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,697評(píng)論 2 351

推薦閱讀更多精彩內(nèi)容

  • 1.Redis特性 1)速度快:數(shù)據(jù)存放在內(nèi)存上、基于C語(yǔ)言實(shí)現(xiàn)氨肌、單線程架構(gòu)預(yù)防多線程競(jìng)爭(zhēng)問(wèn)題鸿秆;2)基于鍵值對(duì)的數(shù)...
    Sponge1128閱讀 616評(píng)論 0 1
  • Redis是啥 Redis是一個(gè)開源的key-value存儲(chǔ)系統(tǒng),由于擁有豐富的數(shù)據(jù)結(jié)構(gòu)怎囚,又被其作者戲稱為數(shù)據(jù)結(jié)構(gòu)...
    一凡呀閱讀 1,172評(píng)論 0 5
  • 分布式緩存技術(shù)PK:選擇Redis還是Memcached? 經(jīng)平臺(tái)同意授權(quán)轉(zhuǎn)載 作者:田京昆(騰訊后臺(tái)研發(fā)工程師)...
    meng_philip123閱讀 68,920評(píng)論 7 60
  • 一考婴、Redis高可用概述 在介紹Redis高可用之前贩虾,先說(shuō)明一下在Redis的語(yǔ)境中高可用的含義。 我們知道沥阱,在w...
    空語(yǔ)閱讀 1,594評(píng)論 0 2
  • Redis優(yōu)點(diǎn): 少量數(shù)據(jù)存儲(chǔ)缎罢,高速讀寫訪問(wèn)。通過(guò)數(shù)據(jù)全部in-momery 的方式來(lái)保證高速訪問(wèn)考杉,同時(shí)提供數(shù)據(jù)落...
    one_zheng閱讀 547評(píng)論 0 1