1.redis簡介
resis 是一個開源(BSD)許可的,內(nèi)存中的數(shù)據(jù)結(jié)構(gòu)存儲系統(tǒng),他可以用作數(shù)據(jù)庫墓猎,緩存和消息中中間件嗅剖。它支持多種類型的數(shù)據(jù)結(jié)構(gòu)烘浦,如字符串(strings),散列(hashes)、列表(lists)、集合(sets)吁断、有序集合(sorted)與范圍查詢趁蕊,bitmaps,hyperloglogs和地理空間(geospatial) 索引半徑查詢仔役。Redis內(nèi)置了復(fù)制(replication)掷伙、LUA腳本。LRU驅(qū)動事件又兵,事務(wù)任柜,和不同級別的磁盤持久化。Redis同樣支持主從復(fù)制沛厨,并且第一次同步是快速的非阻塞式的同步宙地。
2.redis的優(yōu)勢
- 性能極高 – Redis能讀的速度是110000次/s,寫的速度是81000次/s 。
- 豐富的數(shù)據(jù)類型 – Redis支持二進制案例的 Strings, Lists, Hashes, Sets
及 Ordered Sets 數(shù)據(jù)類型操作逆皮。 - 原子 – Redis的所有操作都是原子性的宅粥,意思就是要么成功執(zhí)行要么失敗
完全不執(zhí)行。單個操作是原子性的电谣。多個操作也支持事務(wù)粹胯,即原子性,
通過MULTI和EXEC指令包起來辰企。 - 豐富的特性 – Redis還支持 publish/subscribe, 通知, key 過期等等特性。
3.Redis與其他key-value存儲有什么不同况鸣?
- Redis有著更為復(fù)雜的數(shù)據(jù)結(jié)構(gòu)并且提供對他們的原子性操作牢贸,這是一個不同于其他數(shù)據(jù)庫的進化路徑。Redis的數(shù)據(jù)類型都是基于基本數(shù)據(jù)結(jié)構(gòu)的同時對程序員透明镐捧,無需進行額外的抽象
- Redis運行在內(nèi)存中但是可以持久化到磁盤潜索,所以在對不同數(shù)據(jù)集進行高速讀寫時需要權(quán)衡內(nèi)存,因為數(shù)據(jù)量不能大于硬件內(nèi)存懂酱。在內(nèi)存數(shù)據(jù)庫方面的另一個優(yōu)點是竹习,相比在磁盤上相同的復(fù)雜的數(shù)據(jù)結(jié)構(gòu),在內(nèi)存中操作起來非常簡單列牺,這樣Redis可以做很多內(nèi)部復(fù)雜性很強的事情整陌。同時,在磁盤格式方面他們是緊湊的以追加的方式產(chǎn)生的瞎领,因為他們并不需要進行隨機訪問泌辫。
4.什么是原子性,什么是原子性操作?
舉個例子:
A想要從自己的帳戶中轉(zhuǎn)1000塊錢到B的帳戶里九默。那個從A開始轉(zhuǎn)帳震放,到轉(zhuǎn)帳結(jié)束的這一個過程,稱之為一個事務(wù)驼修。在這個事務(wù)里殿遂,要做如下操作
- 從A的帳戶中減去1000塊錢诈铛。如果A的帳戶原來有3000塊錢,現(xiàn)在就變成2000塊錢了墨礁。
- 在B的帳戶里加1000塊錢幢竹。如果B的帳戶如果原來有2000塊錢,現(xiàn)在則變成3000塊錢了饵溅。
如果在A的帳戶已經(jīng)減去了1000塊錢的時候妨退,忽然發(fā)生了意外,比如停電什么的蜕企,導(dǎo)致轉(zhuǎn)帳事務(wù)意外終止了咬荷,而此時B的帳戶里還沒有增加1000塊錢。那么轻掩,我們稱這個操作失敗了幸乒,要進行回滾〈侥粒回滾就是回到事務(wù)開始之前的狀態(tài)罕扎,也就是回到A的帳戶還沒減1000塊的狀態(tài),B的帳戶的原來的狀態(tài)丐重。此時A的帳戶仍然有3000塊腔召,B的帳戶仍然有2000塊。
我們把這種要么一起成功(A帳戶成功減少1000扮惦,同時B帳戶成功增加1000)臀蛛,要么一起失敗(A帳戶回到原來狀態(tài)崖蜜,B帳戶也回到原來狀態(tài))的操作叫原子性操作浊仆。
如果把一個事務(wù)可看作是一個程序,它要么完整的被執(zhí)行,要么完全不執(zhí)行。這種特性就叫原子性豫领。
5.Redis安裝
1.Window 下安裝
[https://github.com/MSOpenTech/redis/releases]
Redis 支持 32 位和 64 位抡柿。這個需要根據(jù)你系統(tǒng)平臺的實際情況選擇,這里我們下載 Redis-x64-xxx.zip壓縮包到 C 盤等恐,解壓后洲劣,將文件夾重新命名為 redis。
打開一個 cmd 窗口 使用cd命令切換目錄到 C:\redis 運行
redis-server.exe redis.windows.conf 鼠锈。
如果想方便的話闪檬,可以把 redis 的路徑加到系統(tǒng)的環(huán)境變量里,這樣就省得再輸路徑了购笆,后面的那個 redis.windows.conf 可以省略粗悯,如果省略,會啟用默認的同欠。輸入之后样傍,會顯示如下界面:
然后:打開新的命令行窗口横缔,原來的不要關(guān)閉,嘗試進行下面操作
設(shè)置鍵值對 set myKey abc
取出鍵值對 get myKey
C:\Users\Xingxing>redis-cli
127.0.0.1:6379> set mykey abc
OK
127.0.0.1:6379> get mykey
"abc"
2.linux -ubuntu下面安裝
- 在 Ubuntu 系統(tǒng)安裝 Redis 可以使用以下命令:
$sudo apt-get update
$sudo apt-get install redis-server
- 啟動 Redis
$ redis-server
- 查看 redis 是否啟動衫哥?
$ redis-cli
- 以上命令將打開以下終端:
redis 127.0.0.1:6379>
- 127.0.0.1 是本機 IP 茎刚,6379 是 redis 服務(wù)端口。現(xiàn)在我們輸入 PING 命令撤逢。
redis 127.0.0.1:6379> ping
PONG
以上說明我們已經(jīng)成功安裝了redis膛锭。
5.Redis 配置
Redis 的配置文件位于 Redis 安裝目錄下,文件名為 redis.conf蚊荣。
你可以通過 CONFIG 命令查看或設(shè)置配置項初狰。
1.Redis CONFIG 命令格式如下:
redis 127.0.0.1:6379> CONFIG GET CONFIG_SETTING_NAME
實例
CONFIG GET loglevel
1) "loglevel"
2) "notice"
使用 * 號獲取所有配置項
CONFIG GET *
編輯配置
你可以通過修改 redis.conf 文件或使用 CONFIG set 命令來修改配置。
CONFIG SET CONFIG_SETTING_NAME NEW_CONFIG_VALUE
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 配置項說明如下:
1. Redis默認不是以守護進程的方式運行互例,可以通過該配置項修改奢入,使用yes啟用守護進程
daemonize no
2. 當Redis以守護進程方式運行時,Redis默認會把pid寫入/var/run/redis.pid文件媳叨,可以通過pidfile指定
pidfile /var/run/redis.pid
3. 指定Redis監(jiān)聽端口腥光,默認端口為6379,作者在自己的一篇博文中解釋了為什么選用6379作為默認端口糊秆,因為6379在手機按鍵上MERZ對應(yīng)的號碼武福,而MERZ取自意大利歌女Alessia Merz的名字
port 6379
4. 綁定的主機地址
bind 127.0.0.1
5.當 客戶端閑置多長時間后關(guān)閉連接,如果指定為0痘番,表示關(guān)閉該功能
timeout 300
6. 指定日志記錄級別艘儒,Redis總共支持四個級別:debug、verbose夫偶、notice、warning觉增,默認為verbose
loglevel verbose
7. 日志記錄方式兵拢,默認為標準輸出,如果配置Redis為守護進程方式運行逾礁,而這里又配置為日志記錄方式為標準輸出说铃,則日志將會發(fā)送給/dev/null
logfile stdout
8. 設(shè)置數(shù)據(jù)庫的數(shù)量,默認數(shù)據(jù)庫為0嘹履,可以使用SELECT <dbid>命令在連接上指定數(shù)據(jù)庫id
databases 16
9. 指定在多長時間內(nèi)腻扇,有多少次更新操作,就將數(shù)據(jù)同步到數(shù)據(jù)文件砾嫉,可以多個條件配合
save <seconds> <changes>
Redis默認配置文件中提供了三個條件:
save 900 1
save 300 10
save 60 10000
分別表示900秒(15分鐘)內(nèi)有1個更改幼苛,300秒(5分鐘)內(nèi)有10個更改以及60秒內(nèi)有10000個更改。
10. 指定存儲至本地數(shù)據(jù)庫時是否壓縮數(shù)據(jù)焕刮,默認為yes舶沿,Redis采用LZF壓縮墙杯,如果為了節(jié)省CPU時間,可以關(guān)閉該選項括荡,但會導(dǎo)致數(shù)據(jù)庫文件變的巨大
rdbcompression yes
11. 指定本地數(shù)據(jù)庫文件名高镐,默認值為dump.rdb
dbfilename dump.rdb
12. 指定本地數(shù)據(jù)庫存放目錄
dir ./
13. 設(shè)置當本機為slav服務(wù)時,設(shè)置master服務(wù)的IP地址及端口畸冲,在Redis啟動時嫉髓,它會自動從master進行數(shù)據(jù)同步
slaveof <masterip> <masterport>
14. 當master服務(wù)設(shè)置了密碼保護時,slav服務(wù)連接master的密碼
masterauth <master-password>
15. 設(shè)置Redis連接密碼邑闲,如果配置了連接密碼算行,客戶端在連接Redis時需要通過AUTH <password>命令提供密碼,默認關(guān)閉
requirepass foobared
16. 設(shè)置同一時間最大客戶端連接數(shù)监憎,默認無限制纱意,Redis可以同時打開的客戶端連接數(shù)為Redis進程可以打開的最大文件描述符數(shù),如果設(shè)置 maxclients 0鲸阔,表示不作限制偷霉。當客戶端連接數(shù)到達限制時,Redis會關(guān)閉新的連接并向客戶端返回max number of clients reached錯誤信息
maxclients 128
17. 指定Redis最大內(nèi)存限制褐筛,Redis在啟動時會把數(shù)據(jù)加載到內(nèi)存中类少,達到最大內(nèi)存后,Redis會先嘗試清除已到期或即將到期的Key渔扎,當此方法處理 后硫狞,仍然到達最大內(nèi)存設(shè)置,將無法再進行寫入操作晃痴,但仍然可以進行讀取操作残吩。Redis新的vm機制,會把Key存放內(nèi)存倘核,Value會存放在swap區(qū)
maxmemory <bytes>
18. 指定是否在每次更新操作后進行日志記錄泣侮,Redis在默認情況下是異步的把數(shù)據(jù)寫入磁盤,如果不開啟紧唱,可能會在斷電時導(dǎo)致一段時間內(nèi)的數(shù)據(jù)丟失活尊。因為 redis本身同步數(shù)據(jù)文件是按上面save條件來同步的,所以有的數(shù)據(jù)會在一段時間內(nèi)只存在于內(nèi)存中漏益。默認為no
appendonly no
19. 指定更新日志文件名蛹锰,默認為appendonly.aof
appendfilename appendonly.aof
20. 指定更新日志條件,共有3個可選值:
no:表示等操作系統(tǒng)進行數(shù)據(jù)緩存同步到磁盤(快)
always:表示每次更新操作后手動調(diào)用fsync()將數(shù)據(jù)寫到磁盤(慢绰疤,安全)
everysec:表示每秒同步一次(折衷铜犬,默認值)
appendfsync everysec