Redis

REmote DIctionary Server(Redis)是一個(gè)有Salvatore Sanfilippo寫的key-value存儲(chǔ)系統(tǒng)。

Redis是一個(gè)開源的使用ANSI C語言編寫、村收BSD協(xié)議、支持網(wǎng)絡(luò)、可基于內(nèi)存亦可持久化的日志型、key-value數(shù)據(jù)庫,并提供多種語言的API。

他通常被稱為數(shù)據(jù)結(jié)構(gòu)服務(wù)器,因?yàn)橹担╲alue)可以是字符串(String),哈希(Map),列表(list),集合(sets)和有序集合(sorted sets)等類型

Redis簡(jiǎn)介

Redis是完全開源免費(fèi)的,遵守BSD協(xié)議,是一個(gè)高性能的key-value數(shù)據(jù)庫

Redis與其他key-value緩存產(chǎn)品有以下三個(gè)特點(diǎn):

  • Redis支持?jǐn)?shù)據(jù)的持久化,可以將內(nèi)存中的數(shù)據(jù)保存在磁盤中,啟動(dòng)的時(shí)候可以再次加載進(jìn)行使用
  • Redis不僅僅支持簡(jiǎn)單的key-value數(shù)據(jù)了行,同時(shí)還提供list、set、zset、hash等數(shù)據(jù)結(jié)構(gòu)的存儲(chǔ)。
  • Redis支持?jǐn)?shù)據(jù)的備份,即master-slave模式的數(shù)據(jù)備份。
Redis優(yōu)勢(shì)
  • 性能極高,Redis能讀的速度是110000次/s,寫的速度是81000次/s。
  • 豐富的數(shù)據(jù)類型,Redis支持二進(jìn)制安利的Strings、Lists、Hashes、Sets及Ordered Sets數(shù)據(jù)類型操作。
  • 原子,Redis的所有操作都是原子性的,同時(shí)Redis還支持對(duì)幾個(gè)操作權(quán)柄后的原子性執(zhí)行。
  • 豐富的特性,Redis還支持publish/subscribe,通知,key國(guó)企等等特性
Redis與其他key-value存儲(chǔ)有什么不同?
  • Redis有著更為復(fù)雜的數(shù)據(jù)結(jié)構(gòu)并且提供對(duì)他們的原子性操作,這是一個(gè)不同于其他數(shù)據(jù)庫的進(jìn)化路徑,Redis的數(shù)據(jù)類型都是基于基本數(shù)據(jù)結(jié)構(gòu)的同時(shí)對(duì)程序員透明,無需進(jìn)行額外的抽象。
  • Redis運(yùn)行在內(nèi)存中是可以持久化到磁盤,所以在對(duì)不同數(shù)據(jù)集進(jìn)行高速讀寫時(shí)需要權(quán)衡內(nèi)存,因?yàn)閿?shù)據(jù)量不能大于硬件內(nèi)存。在內(nèi)存數(shù)據(jù)庫方面的另一個(gè)優(yōu)點(diǎn)是,相比在磁盤上相同的復(fù)雜數(shù)據(jù)結(jié)構(gòu)沒在內(nèi)存中操作起來更簡(jiǎn)單,這樣Redis可以做很多內(nèi)部復(fù)雜性很強(qiáng)的事情,同時(shí)在磁盤格式方面他們第緊湊的伊吹家的方式產(chǎn)生的,因?yàn)樗鞑⒉恍枰M(jìn)行隨機(jī)訪問。
什么是BSD協(xié)議?

BSD開源協(xié)議是一個(gè)給于使用者很大自由的協(xié)議??梢宰杂傻氖褂?,修改源代碼,也可以將修改后的代碼作為開源或者專有軟件再發(fā)布。當(dāng)你發(fā)布使用了BSD協(xié)議的代碼,或者以BSD協(xié)議代碼為基礎(chǔ)做二次開發(fā)自己的產(chǎn)品時(shí),需要滿足三個(gè)條件:

  • 如果再發(fā)布的產(chǎn)品中包含源代碼,則在源代碼中必須帶有原來代碼中的BSD協(xié)議。
  • 如果再發(fā)布的只是二進(jìn)制類庫/軟件,則需要在類庫/軟件的文檔和版權(quán)聲明中包含原來代碼中的BSD協(xié)議。
  • 不可以用開源代碼的作者/機(jī)構(gòu)名字和原來產(chǎn)品的名字做市場(chǎng)推廣。

BSD代碼鼓勵(lì)代碼共享,但需要尊重代碼作者的著作權(quán)。BSD由于允許使用者修改和重新發(fā)布代碼,也允許使用或在BSD代碼上開發(fā)商業(yè)軟件發(fā)布和銷 售,因此是對(duì)商業(yè)集成很友好的協(xié)議。

很多的公司企業(yè)在選用開源產(chǎn)品的時(shí)候都首選BSD協(xié)議,因?yàn)榭梢酝耆刂七@些第三方的代碼,在必要的時(shí)候可以修改或者 二次開發(fā)。

什么是原子性,什么是原子性操作?

舉個(gè)例子:
A想要從自己的帳戶中轉(zhuǎn)1000塊錢到B的帳戶里。那個(gè)從A開始轉(zhuǎn)帳,到轉(zhuǎn)帳結(jié)束的這一個(gè)過程,稱之為一個(gè)事務(wù)。在這個(gè)事務(wù)里,要做如下操作:

  1. 從A的帳戶中減去1000塊錢。如果A的帳戶原來有3000塊錢,現(xiàn)在就變成2000塊錢了。
  2. 在B的帳戶里加1000塊錢。如果B的帳戶如果原來有2000塊錢,現(xiàn)在則變成3000塊錢了。
    如果在A的帳戶已經(jīng)減去了1000塊錢的時(shí)候,忽然發(fā)生了意外,比如停電什么的,導(dǎo)致轉(zhuǎn)帳事務(wù)意外終止了,而此時(shí)B的帳戶里還沒有增加1000塊錢。那么,我們稱這個(gè)操作失敗了,要進(jìn)行回滾。回滾就是回到事務(wù)開始之前的狀態(tài),也就是回到A的帳戶還沒減1000塊的狀態(tài),B的帳戶的原來的狀態(tài)。此時(shí)A的帳戶仍然有3000塊,B的帳戶仍然有2000塊。
    我們把這種要么一起成功(A帳戶成功減少1000,同時(shí)B帳戶成功增加1000),要么一起失?。ˋ帳戶回到原來狀態(tài),B帳戶也回到原來狀態(tài))的操作叫原子性操作。
    如果把一個(gè)事務(wù)可看作是一個(gè)程序,它要么完整的被執(zhí)行,要么完全不執(zhí)行。這種特性就叫原子性。

Redis安裝

Ubuntu下安裝

在Ubuntu系統(tǒng)安裝Redis可以使用以下命令:

sudo apt-get update
sudo apt-get install redis-server
啟動(dòng)Redis
redis-server
查看redis是否啟動(dòng)
redis-cli
以上命令將打開以下終端:
redis 127.0.0.1:6379>
127.0.0.1是本機(jī)IP,6379是redis服務(wù)端口,現(xiàn)在我們輸入PING命令
redis 127.0.0.1:6379> ping

以上說明我們已經(jīng)成功安裝了redis

Redis配置

Redis的配置文件位于Redis安裝目錄下,文件名為redis.conf。
可以通過CONFIG命令查看或設(shè)置配置項(xiàng)

語法

Redis CONFIG命令格式如下:

redis 127.0.0.1:6379> config get config_setting_name
(empty list or set)
實(shí)例
redis 127.0.0.1:6379> config get loglevel
(empty list or set)
使用*號(hào)獲取所有配置
redis 127.0.0.1:6379> config get *
 1) "dir"
 2) "/var/lib/redis"
 3) "dbfilename"
 4) "dump.rdb"
 5) "requirepass"
 6) (nil)
 7) "masterauth"
 8) (nil)
 9) "maxmemory"
10) "0"
11) "maxmemory-policy"
12) "volatile-lru"
13) "maxmemory-samples"
14) "3"
15) "timeout"
16) "300"
17) "appendonly"
18) "no"
19) "no-appendfsync-on-rewrite"
20) "no"
21) "appendfsync"
22) "everysec"
23) "save"
24) "900 1 300 10 60 10000"
25) "slave-serve-stale-data"
26) "yes"
27) "hash-max-zipmap-entries"
28) "512"
29) "hash-max-zipmap-value"
30) "64"
31) "list-max-ziplist-entries"
32) "512"
33) "list-max-ziplist-value"
34) "64"
35) "set-max-intset-entries"
36) "512"
37) "slowlog-log-slower-than"
38) "10000"
39) "slowlog-max-len"
40) "64"

編輯配置

你可以通過修改redis.conf文件或使用CONFIG set命令來修改配置

語法

config set 命令基本語法:

redis 127.0.0.1:6379> CONFIG SET CONFIG_SETTING_NAME NEW_CONFIG_VALUE
實(shí)例
redis 127.0.0.1:6379> CONFIG SET loglevel "notice"
OK
redis 127.0.0.1:6379> CONFIG GET loglevel

1) "loglevel"
2) "notice"
參數(shù)說明

redis.conf配置項(xiàng)說明如下:

  • Redis默認(rèn)不是以守護(hù)進(jìn)程方式運(yùn)行,可以通過該配置項(xiàng)修改,使用yes啟用守護(hù)進(jìn)程

    daemonize no
  • 當(dāng)Redis以守護(hù)進(jìn)程方式運(yùn)行時(shí),Redis默認(rèn)會(huì)把pid寫入/var/run/redis.pid文件,可以通過pidfile指定

    pidfile /var/run/redis.pid
  • 指定Redis監(jiān)聽端口,默認(rèn)端口為6379,作者在自己的一篇博文中解釋了為什么選用6379作為默認(rèn)端口,因?yàn)?379在手機(jī)按鍵上MERZ對(duì)應(yīng)的號(hào)碼,而MERZ取自意大利歌女Alessia Merz的名字

    port 6379
  • 綁定的主機(jī)地址

    bind 127.0.0.1
  • 當(dāng) 客戶端閑置多長(zhǎng)時(shí)間后關(guān)閉連接,如果指定為0,表示關(guān)閉該功能

    timeout 300
  • 指定日志記錄級(jí)別,Redis總共支持四個(gè)級(jí)別:debug、verbose、notice、warning,默認(rèn)為verbose

    loglevel verbose
  • 日志記錄方式,默認(rèn)為標(biāo)準(zhǔn)輸出,如果配置Redis為守護(hù)進(jìn)程方式運(yùn)行,而這里又配置為日志記錄方式為標(biāo)準(zhǔn)輸出,則日志將會(huì)發(fā)送給/dev/null

    logfile stdout
  • 設(shè)置數(shù)據(jù)庫的數(shù)量,默認(rèn)數(shù)據(jù)庫為0,可以使用SELECT <dbid>命令在連接上指定數(shù)據(jù)庫id

    databases 16
  • 指定在多長(zhǎng)時(shí)間內(nèi),有多少次更新操作,就將數(shù)據(jù)同步到數(shù)據(jù)文件,可以多個(gè)條件配合

    save <seconds> <changes>
    Redis默認(rèn)配置文件中提供了三個(gè)條件:
    save 900 1
    save 300 10
    save 60 10000

    分別表示900秒(15分鐘)內(nèi)有1個(gè)更改,300秒(5分鐘)內(nèi)有10個(gè)更改以及60秒內(nèi)有10000個(gè)更改。

  • 指定存儲(chǔ)至本地?cái)?shù)據(jù)庫時(shí)是否壓縮數(shù)據(jù),默認(rèn)為yes,Redis采用LZF壓縮,如果為了節(jié)省CPU時(shí)間,可以關(guān)閉該選項(xiàng),但會(huì)導(dǎo)致數(shù)據(jù)庫文件變的巨大

    rdbcompression yes
  • 指定本地?cái)?shù)據(jù)庫文件名,默認(rèn)值為dump.rdb

    dbfilename dump.rdb
  • 指定本地?cái)?shù)據(jù)庫存放目錄

    dir ./
  • 設(shè)置當(dāng)本機(jī)為slav服務(wù)時(shí),設(shè)置master服務(wù)的IP地址及端口,在Redis啟動(dòng)時(shí),它會(huì)自動(dòng)從master進(jìn)行數(shù)據(jù)同步

    slaveof <masterip> <masterport>
  • 當(dāng)master服務(wù)設(shè)置了密碼保護(hù)時(shí),slav服務(wù)連接master的密碼

    masterauth <master-password>
  • 設(shè)置Redis連接密碼,如果配置了連接密碼,客戶端在連接Redis時(shí)需要通過AUTH <password>命令提供密碼,默認(rèn)關(guān)閉

    requirepass foobared
  • 設(shè)置同一時(shí)間最大客戶端連接數(shù),默認(rèn)無限制,Redis可以同時(shí)打開的客戶端連接數(shù)為Redis進(jìn)程可以打開的最大文件描述符數(shù),如果設(shè)置 maxclients 0,表示不作限制。當(dāng)客戶端連接數(shù)到達(dá)限制時(shí),Redis會(huì)關(guān)閉新的連接并向客戶端返回max number of clients reached錯(cuò)誤信息

    maxclients 128
  • 指定Redis最大內(nèi)存限制,Redis在啟動(dòng)時(shí)會(huì)把數(shù)據(jù)加載到內(nèi)存中,達(dá)到最大內(nèi)存后,Redis會(huì)先嘗試清除已到期或即將到期的Key,當(dāng)此方法處理 后,仍然到達(dá)最大內(nèi)存設(shè)置,將無法再進(jìn)行寫入操作,但仍然可以進(jìn)行讀取操作。Redis新的vm機(jī)制,會(huì)把Key存放內(nèi)存,Value會(huì)存放在swap區(qū)

    maxmemory <bytes>
  • 指定是否在每次更新操作后進(jìn)行日志記錄,Redis在默認(rèn)情況下是異步的把數(shù)據(jù)寫入磁盤,如果不開啟,可能會(huì)在斷電時(shí)導(dǎo)致一段時(shí)間內(nèi)的數(shù)據(jù)丟失。因?yàn)?redis本身同步數(shù)據(jù)文件是按上面save條件來同步的,所以有的數(shù)據(jù)會(huì)在一段時(shí)間內(nèi)只存在于內(nèi)存中。默認(rèn)為no

    appendonly no
  • 指定更新日志文件名,默認(rèn)為appendonly.aof

    appendfilename appendonly.aof
  • 指定更新日志條件,共有3個(gè)可選值:

    no:表示等操作系統(tǒng)進(jìn)行數(shù)據(jù)緩存同步到磁盤(快)
    always:表示每次更新操作后手動(dòng)調(diào)用fsync()將數(shù)據(jù)寫到磁盤(慢,安全)
    everysec:表示每秒同步一次(折衷,默認(rèn)值)
    appendfsync everysec
  • 指定是否啟用虛擬內(nèi)存機(jī)制,默認(rèn)值為no,簡(jiǎn)單的介紹一下,VM機(jī)制將數(shù)據(jù)分頁存放,由Redis將訪問量較少的頁即冷數(shù)據(jù)swap到磁盤上,訪問多的頁面由磁盤自動(dòng)換出到內(nèi)存中(在后面的文章我會(huì)仔細(xì)分析Redis的VM機(jī)制)

    vm-enabled no
  • 虛擬內(nèi)存文件路徑,默認(rèn)值為/tmp/redis.swap,不可多個(gè)Redis實(shí)例共享

    vm-swap-file /tmp/redis.swap
  1. 將所有大于vm-max-memory的數(shù)據(jù)存入虛擬內(nèi)存,無論vm-max-memory設(shè)置多小,所有索引數(shù)據(jù)都是內(nèi)存存儲(chǔ)的(Redis的索引數(shù)據(jù) 就是keys),也就是說,當(dāng)vm-max-memory設(shè)置為0的時(shí)候,其實(shí)是所有value都存在于磁盤。默認(rèn)值為0
    vm-max-memory 0
  • Redis swap文件分成了很多的page,一個(gè)對(duì)象可以保存在多個(gè)page上面,但一個(gè)page上不能被多個(gè)對(duì)象共享,vm-page-size是要根據(jù)存儲(chǔ)的 數(shù)據(jù)大小來設(shè)定的,作者建議如果存儲(chǔ)很多小對(duì)象,page大小最好設(shè)置為32或者64bytes;如果存儲(chǔ)很大大對(duì)象,則可以使用更大的page,如果不 確定,就使用默認(rèn)值
    vm-page-size 32
  • 設(shè)置swap文件中的page數(shù)量,由于頁表(一種表示頁面空閑或使用的bitmap)是在放在內(nèi)存中的,,在磁盤上每8個(gè)pages將消耗1byte的內(nèi)存。
    vm-pages 134217728
  • 設(shè)置訪問swap文件的線程數(shù),最好不要超過機(jī)器的核數(shù),如果設(shè)置為0,那么所有對(duì)swap文件的操作都是串行的,可能會(huì)造成比較長(zhǎng)時(shí)間的延遲。默認(rèn)值為4
    vm-max-threads 4
  • 設(shè)置在向客戶端應(yīng)答時(shí),是否把較小的包合并為一個(gè)包發(fā)送,默認(rèn)為開啟
    glueoutputbuf yes
  • 指定在超過一定的數(shù)量或者最大的元素超過某一臨界值時(shí),采用一種特殊的哈希算法
    hash-max-zipmap-entries 64
    hash-max-zipmap-value 512
  • 指定是否激活重置哈希,默認(rèn)為開啟(后面在介紹Redis的哈希算法時(shí)具體介紹)
    activerehashing yes
  • 指定包含其它的配置文件,可以在同一主機(jī)上多個(gè)Redis實(shí)例之間使用同一份配置文件,而同時(shí)各個(gè)實(shí)例又擁有自己的特定配置文件
    include /path/to/local.conf

什么是守護(hù)進(jìn)程?

守護(hù)進(jìn)程(Daemon Process),也就是通常說的 Daemon 進(jìn)程(精靈進(jìn)程),是 Linux 中的后臺(tái)服務(wù)進(jìn)程。它是一個(gè)生存期較長(zhǎng)的進(jìn)程,通常獨(dú)立于控制終端并且周期性地執(zhí)行某種任務(wù)或等待處理某些發(fā)生的事件。
守護(hù)進(jìn)程是個(gè)特殊的孤兒進(jìn)程,這種進(jìn)程脫離終端,為什么要脫離終端呢?之所以脫離于終端是為了避免進(jìn)程被任何終端所產(chǎn)生的信息所打斷,其在執(zhí)行過程中的信息也不在任何終端上顯示。由于在 linux 中,每一個(gè)系統(tǒng)與用戶進(jìn)行交流的界面稱為終端,每一個(gè)從此終端開始運(yùn)行的進(jìn)程都會(huì)依附于這個(gè)終端,這個(gè)終端就稱為這些進(jìn)程的控制終端,當(dāng)控制終端被關(guān)閉時(shí),相應(yīng)的進(jìn)程都會(huì)自動(dòng)關(guān)閉。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 轉(zhuǎn)載地址:http://gnucto.blog.51cto.com/3391516/998509 Redis與Me...
    Ddaidai閱讀 21,548評(píng)論 0 82
  • 安全性 設(shè)置客戶端連接后進(jìn)行任何其他指令前需要使用的密碼。 警告:因?yàn)閞edis 速度相當(dāng)快,所以在一臺(tái)比較好的服...
    OzanShareing閱讀 1,946評(píng)論 1 7
  • Redis簡(jiǎn)介 Redis 是完全開源免費(fèi)的,遵守BSD協(xié)議,是一個(gè)高性能的key-value數(shù)據(jù)庫。Redis ...
    drfung閱讀 1,033評(píng)論 0 10
  • 本文將從Redis的基本特性入手,通過講述Redis的數(shù)據(jù)結(jié)構(gòu)和主要命令對(duì)Redis的基本能力進(jìn)行直觀介紹。之后概...
    kelgon閱讀 61,659評(píng)論 23 625
  • 奧斯卡頒獎(jiǎng)禮上的大烏龍實(shí)在是醉了。這心情大起大落,我覺得我可能會(huì)當(dāng)場(chǎng)崩潰。所謂沒希望沒失望,事事如此,做悲觀的打算...
    呶呶的簡(jiǎn)書閱讀 171評(píng)論 0 0

友情鏈接更多精彩內(nèi)容