REDIShtml
中文文檔http://www.redis.net.cn/tutorial/3501.htmllinux
安裝包下載:http://download.redis.io/releases/程序員
1、概述redis
Redis 是一個開源的(BSD許可BSD開源協議是一個給予使用者很大自由的協議),內存中的數據結構存儲,用做數據庫,緩存和消息代理。他支持的數據結構如字符串、哈希、列表、集合、有序集合、位圖、hyperloglogs等數據庫類型。內置複製、lua腳本、lru收回、事物以及不一樣級別磁盤持久化功能,同時經過redis Sentinel 提供高可用,經過redis Cluster提供自動分區算法
Redis是一個開源的使用ANSI C語言編寫、遵照BSD協議、支持網絡、可基於內存亦可持久化的日誌型、Key-Value數據庫,並提供多種語言的API。它一般被稱爲數據結構服務器,由於值(value)能夠是 字符串(String), 哈希(Map), 列表(list), 集合(sets) 和 有序集合(sorted sets)等類型。數據庫
2、三大特色以及優點vim
1、性能極高—redis能讀的速度是110000次/s ,寫的速度是81000次/s 。數組
2、具備豐富的數據類型—redis支持二進制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 數據類型操做。緩存
3、原子—redis的全部操做都是原子性的,同時redis還支持幾個操做全並候的原子性執行。安全
所謂原子操做是指不會被線程調度機制打斷的操做;這種操做一旦開始,就一直運行到結束,中間不會有任何context switch (上下文切換)
4、豐富的特性—redis還支持publish/subscribe,通知key過時等等特性
3、Redis與其餘key-value存儲有的不一樣
Redis有着更爲複雜的數據結構而且提供對他們的原子性操做,redis數據庫類型都是基於基本數據結構的同時對程序員透明,無需進行額外的抽象。
Redis運行在內存中可是能夠持久化到磁盤,因此在對不一樣數據集進行告訴讀寫時須要權衡內存,應爲數據量不能大於硬件內存,在內存中數據庫的另外一個優勢是,相比在磁盤上相同的複雜數據結構,在內存中操做起來很是簡單,這樣redis能夠作不少內部複雜性很強的事情。同時,在磁盤格式方面他們是緊湊的以追加的方式產生的,由於他們並不須要進行隨機的訪問。
4、redis和memcached的區別
1、redis能夠用來作storage(存儲)而memcached只能做爲緩存(cache)
2、存儲的數據有「結構」對於memcached來講,存儲的數據只有1一種類型字符串。
而redis則能夠存儲字符串,鏈表,哈希結構,集合,有序集合
5、安裝部署
關閉防火牆,selinux ,(爲了安全考慮能夠設置開啓防火牆,並設置只能那些ip能夠訪問redis服務器)
yum install -y gcc tcl wget 安裝C語言編輯器
下載地址:http://www.redis.net.cn/download/,下載最新文檔版本。
wget http://download.redis.io/releases/redis-2.8.17.tar.gz 把安裝包pull下來 tar zxvf redis-3.0.6.tar.gz cd redis-3.0.6 make 編譯成爲二進制文件(不須要./configure) make PREFIX=/usr/local/redis install 安裝到/usr/local/redis
cd /usr/local/redis/bin
./redis-benchmark // 用於進行redis性能測試的工具 ./redis-check-dump //用於修復出問題的dump.rdb文件 ./redis-cli //redis的客戶端 ./redis-server //redis的服務端 ./redis-check-aof //用於修復出問題的AOF文件
vim redis.conf 參數配置 (在這裏我只修改了標紅的地方)
一、 redis默認不是以守護進程的方式運行,能夠經過該配置項修改,使用yes啓動守護進程(改成yes守護進程)
daemonize no
二、 當redis以守護進程方式運行時,redis默認會把pid寫入/var/run/redis.pid文件,能夠經過pidfile指定
pidfile /var/run/redis.pid
3、指定redis監聽端口,默認端口爲6379
port 6379
4、綁定的主機地址(若是須要外網訪問的話不開啓此值)
bind 127.0.0.1
5、當客戶端閒置多長時間後關閉鏈接,若是指定爲0,表示關閉該功能。
timeout 300
6、指定日誌記錄級別,redis總共支持四個級別:debug、verbose、notice、warning,默認爲verbose
loglevel verbose
7、日誌記錄方式,默認爲標準輸出,若是配置redis爲守護進程方式運行,而這裏又配置爲日誌記錄方式爲標準輸出,則日誌將會發送給/dev/null
logfile stdout
8、設置數據庫的數量,默認數據庫爲0,可使用select <bind> 命令在連接上指定數據庫id
database 16
9、指定在多長時間內,有多少次更新操做,就將數據同步到數據文件,能夠多個條件配合
save <seconds> <changes>
redis默認配置文件中提供了三個條件:
save 900 1
save 300 10
save 60 10000
分別表示900秒(15分鐘)內有一次更改,300秒(5分鐘)內有10個更改以及60秒內有10000個更改。
10、指定存儲至本地數據庫時是否壓縮數據,默認爲yes,redis採用LZF壓縮。若是爲了節省CPU時間,能夠關閉該選項,但會致使數據庫文件變得巨大
rdbcompression yes
11、指定本地數據庫文件名,默認值爲dump.rdb
dbfilename dump.rdb
12、指定本地數據庫存放目錄
dir ./
13、設置當本機爲slave服務時,設置master服務的ip地址及端口,在redis啓動時,他會自動從master進行數據同步
slaveof <masterip> <masterport>
14、當master服務設置了密碼保護時,slave服務鏈接master的密碼
masterauth <master--password>
15、設置redis鏈接密碼,若是配置了鏈接密碼,客戶端在連接redis時須要經過AUTH<password> 命令提供密碼,默認關閉(打開註釋)
requirepass foobared
16、設置同一時間最大客戶端連接數,默認無限制,redis能夠同時打開的客戶端連接數位redis進程能夠打開的最大文件秒數符數,若是設置maxclients 0,表示不作限制,當客戶端連接數到達限制時,redis會關閉新的連接冰箱客戶端返回max number of clients reached 錯誤信息
maxclients 128
17、指定redis最大內存限制,redis在啓動時會把數據加載到內存中,達到最大內存後,Redis會先嚐試清除已到期或即將到期的key,當此方法處理後,仍然到達最大內存設置,將沒法再進行寫入操做,但仍然能夠進行讀取操做。
Redis新的VM機制,會把key存放到內存中,Value會存放在swap分區
maxmemory <bytes>
18、指定是否在每次更新操做後進行日誌記錄,redis在默認狀況下是異步的把數據寫入磁盤,若是不開啓,可能會在斷電時致使一段時間內的數據丟失。由於redis本省同步數據文件是按上面的save條件同步的,因此有的數據會在一段時間內只存在內存中,默認爲no
appendonly no
19、指定更新日誌文件名,默認爲appendonly.aof
appendfilename appendonly.aof
20、指定更新日誌條件,共有三個可選值:no:表示等操做系統進行數據緩存同步到磁盤(快) always:表示每次更新操做後手動調用fsync()將數據寫入磁盤(慢,安全) everysec:表示每秒同步一次(折衷,默認值)
appendfsync everysec
21、指定是否啓用虛擬內存機制,默認爲no,VM機制將數據分頁存放,由redis將訪問量較少的頁即冷數據swap到磁盤上,訪問多的頁面有磁盤自動換出到內存中
vm-enabled no
22、虛擬內存文件路徑,默認值爲/tmp/redis.swap,不可多個Redis實例共享
vm-swap-file /tmp/redis.swap
23、將全部大於vm-max-memory的數據存入虛擬內存中,不管vm-max-memory設置多小,全部索引數據都是內存存儲的(redis的索引數據就是keys),也就是說,vm-max-memory設置爲0的時候,實際上是全部value都存在於磁盤中。默認值爲0
vm-max-memory
24、redis swap 文件分紅了不少的page,一個對象能夠保存多個page上面,但一個page上不能被多個對象共享,vm-page-size是要根據存儲的數據大小來設定,page大小最好設置爲32或者64bytes;若是存儲很大大對象,則可使用更大的page,若是不 肯定,就使用默認值
vm-page-size 32
25、設置swap文件中的page數量,在磁盤上每一個pages將消耗1byte內存
vm-pages 134217728
26、設置訪問swap文件的線程數,最好不要超過機器的核數,若是設置爲0,那麼對swap文件的操做都是串行的,可能會形成比較長時間的延遲。默認值4
vm-max-threads 4
28、指定在超過必定數量或者最大的袁術超過某一臨界時,採用一種特殊的哈希算法
hash-max-zipmap-entries 64
hash-max-zipmap-value 512
29、指定是否激活哈希,默認爲開啓
activerehashing yes
30、指定包含其餘的配置文件,能夠在同一主機上多個redis實例之間使用同一份配置文件,而同時各個實例又擁有本身的配置文件
include /path/to/local.conf
啓動redis的方式
To run Redis with the default configuration just type: % cd src % ./redis-server If you want to provide your redis.conf, you have to run it using an additional parameter (the path of the configuration file): % cd src % ./redis-server /path/to/redis.conf It is possible to alter the Redis configuration passing parameters directly as options using the command line. Examples: % ./redis-server --port 9999 --slaveof 127.0.0.1 6379 % ./redis-server /etc/redis/6379.conf --loglevel debug
測試
% ./redis-cli redis> ping PONG redis> set foo bar OK redis> get foo "bar" redis> incr mycounter (integer) 1 redis> incr mycounter (integer) 2 redis>
登錄客戶端 (此命令鏈接本地的redis服務)
./redis-cli 127.0.0.1:9999> ping #執行ping命令檢測redis服務是否啓動 PONG
遠程鏈接redis服務執行的命令
./redis-cli -h host -p port -a passwd
redis修改持久化路徑和日誌路徑
複製代碼 代碼以下:
vim redis.conf logfile /data/redis_cache/logs/redis.log #日誌路徑 dir /data/redis_cache #持久化路徑,修改後 記得要把dump.rdb持久化文件拷貝到/data/redis_cache下
先殺掉redis,拷貝dump.rdb,啓動
清redis緩存
複製代碼 代碼以下:
./redis-cli #進入 dbsize flushall #執行 exit
刪除redis當前數據庫中的全部Key
複製代碼 代碼以下:
flushdb
刪除redis全部數據庫中的key
複製代碼 代碼以下:
flushall
6、redis數據結構---用法
Redis是一種高級的key:value存儲系統,其中value支持五中數據類型
一、字符串(strings) 二、字符串列表(lists) 三、字符串集合(sets) 四、有序字符串集合(sorted sets) 五、哈希(hashes)
關於key的幾點
一、key不要太長,儘可能不要超過1024字節,這不只消耗內存,並且會下降查找的效率; 二、key也不要過短,過短的話,key的可讀性會下降; 三、在一個項目中,key最好使用同一的命名模式。例如:user:root:passwd
Redis—key 基本語法命令:http://www.redis.net.cn/tutorial/3507.html
格式: command key_name set key的名字 key的值 -------建立 del key的名字 -------刪除 dump key -------序列化給定key,並返回被序列化的值 exists key -------檢查一個key是否存在 expire key -------爲給定key設置一個過時時間 expireat key timestamp ------- EXPIREAT 的做用和 EXPIRE 相似,都用於爲 key 設置過時時間。 不一樣在於 EXPIREAT 命令接受的時間參數是 UNIX 時間戳(unix timestamp)。 pexpire key milliseconds -------設置key的過時時間億以毫秒計算 pexpireat key milliseconds ----設置key過時時間的時間戳(unix timestamp)以毫秒計算 keys pattern --------查找全部符合給定模式(pattern)的key move key db --------將當前數據庫的key移動到給定數據庫db當中。 persist key --------移除key的過時時間,key將持久保持 pttl key --------以毫秒爲單位返回能夠的剩餘過時時間 ttl key --------以毫秒爲單位,返回給定key的剩餘生存時間(ttl,time to live) rename key newkey --------修改key的名稱 renamenx key newkey --------當newkey不存在時,將key更名爲newkey type key --------返回key所存儲的值的類型。
1)Redis數據結構---strings(字符串)命令:http://www.redis.net.cn/tutorial/3508.html
Strings類型是一個很基礎的數據類型,也就是任何存儲系統都必備的數據類型。(很是的相似於memcache) 例1: set name zsh get name 例2:讓數值加一 192.168.2.40:6379> set name 213 OK 192.168.2.40:6379> get name "213" 192.168.2.40:6379> incr name (integer) 214 192.168.2.40:6379> get name "214" Incr指令自己就具備原子性的操做,因此咱們徹底能夠利用redis的incr、incrby、decr、decrby等指令來實現原子計數的效果,例如在某種場景下有三個客戶端同時讀取了name的值爲2,而後對其同時進行了加1操做,name最後name的值必定是5,。很多網站都利用redis的這個特性來實現業務上的統計計數需求。
2)redis數據結構—list (字符串列表列表)命令:http://www.redis.net.cn/tutorial/3510.html
Redis中的list在底層實現上並非數組。而是鏈表,也就是說對於一個具備上百萬個元素的list來講,在頭部和尾部插入一個新的元素,好比用LPUSH在10個元素的lists頭部插入新元素,和在上千萬元素的lists頭部插入新元素的速度應該是相同的 List弊端:鏈表型list的元素定位會比較慢,而數組型lists的元素定位就會快不少。 Lists中指定一個範圍來提取元素 例1: 192.168.2.40:6379> LPUSH mylist 1 新建一個list叫作mylist,並在列表頭部插入元素1 (integer) 1 返回當前mylist中的元素個數 192.168.2.40:6379> RPUSH mylist 2 在mylist右側插入元素2 (integer) 2 192.168.2.40:6379> LPUSH mylist 0 在mylist左側插入元素0 (integer) 3 192.168.2.40:6379> LRANGE mylist 0 -1 列出mylist中從編號0到倒數第一個元素 1) "0" 2) "1" 3) "2" List的應用範圍: 一、咱們能夠利用lists來實現一個消息隊列,並且能夠確保前後順序,沒必要想MySQL那樣還須要經過opder by 二、利用lrange還能夠很方便的實現分頁功能 三、在博客系統中每篇博文的評論也能夠存入一個單獨的list中。
3)redis數據結構—sets(字符串集合)有序集合命令:http://www.redis.net.cn/tutorial/3512.html
Redis的集合是一種無序的集合,集合中的元素沒有前後順序,能夠添加新元素、刪除已有元素、取交集、取並集,取差集等。 例: 192.168.2.40:6379> sadd mytest one 新建立一個集合,向新集合中添加一個新的元素one (integer) 1 192.168.2.40:6379> sadd mytest two 添加元素two (integer) 1 192.168.2.40:6379> smembers mytest 列出集合中的全部元素(列出的元素沒有前後順序) 1) "two" 2) "one" 192.168.2.40:6379> SISMEMBER mytest one 查看one元素是否在mytest中 (integer) 1 192.168.2.40:6379> SISMEMBER mytest three 查看three元素是否在mytest中 (integer) 0 192.168.2.40:6379> SADD yourtest 1 建立新的集合加入元素1 (integer) 1 192.168.2.40:6379> SADD yourtest 2 (integer) 1 192.168.2.40:6379> SMEMBERS yourtest 列出集合的元素 1) "1" 2) "2" 192.168.2.40:6379> SUNION mytest yourtest 對兩個元素集合求並集 1) "one" 2) "two" 3) "2" 4) "1" 這個集合能夠看作QQ列表的名字,每一個名字下對應不少值
4)redis數據結構—sorted sets(有序集合)詳細sorted:http://www.redis.net.cn/tutorial/3512.html
有序集合中的每一個元素都關聯一個序號(score),有序集合的成員是惟一的但分數score卻能夠重複 集合是經過哈希表實現的,因此添加刪除查找的複雜度都是0/1 ,集合中最大的成員數位 有序集合相關的操做指令:zrange,zadd,zrevrange,zrangebyscore 232 - 1 (4294967295, 每一個集合可存儲40多億個成員)。 例: 192.168.2.40:6379> ZADD mytest 1 baidu.com 新增一個有序集合mytest,並加入一個元素baidu.com賦予序號1 (integer) 1 192.168.2.40:6379> ZADD mytest 3 google.com 添加元素google.com賦予它的序號是3 (integer) 1 192.168.2.40:6379> ZADD mytest 2 360.com 添加元素google.com賦予它的序號是3 (integer) 1 192.168.2.40:6379> ZRANGE mytest 0 -1 列出全部的元素, 1) "baidu.com" 2) "360.com" 3) "google.com"
5)redis數據結構—哈希(hash)詳細的hash命令:http://www.redis.net.cn/tutorial/3509.html
哈希結構是redis-2.0.0版本以後纔有的數據結構 Hashes存的是字符串和字符串直接的映射,好比一個用戶須要存儲其全名、姓氏、年齡等等。 Redis中的每一個hash能夠存儲232-1鍵值對(40多億) 例: 192.168.2.40:6379> HMSET user:zsh username antirez password 123456 age 34 創建哈希,並賦值 OK 192.168.2.40:6379> HGETALL user:zsh 列出哈希的內容 1) "username" 2) "antirez" 3) "password" 4) "123456" 5) "age" 6) "34" 192.168.2.40:6379> HSET user:zsh password 654321 更改哈希算法裏邊密碼的值 (integer) 0 192.168.2.40:6379> HGETALL user:zsh 在此列出,發現值已經更改 1) "username" 2) "antirez" 3) "password" 4) "654321" 5) "age" 6) "34"
6)redis的事物
Redis事物能夠一次性執行多個命令,而且帶有兩個重要的保證: 一、事物是一個單獨的隔離操做:事物中的全部命令都會序列化、按順序地執行。事物在執行的過程當中,不會被其餘客戶端發送來的命令請求所打斷。 二、事物是一個原子性操做:事物中的命令要麼所有被執行,要麼所有不執行。 事物的三個階段 開始事物----à命令入隊---à執行事物 他先以multi開始一個事物,將多個命令入隊到事物中,最後exec命令觸發 ,執行命令的全部操做 例: 192.168.2.40:6379> MULTI OK 192.168.2.40:6379> set name zsh QUEUED 192.168.2.40:6379> get name QUEUED 192.168.2.40:6379> SADD tag "C++" "aaa" "bbb" QUEUED 192.168.2.40:6379> exec 1) OK 2) "zsh" 3) (integer) 3 192.168.2.40:6379> SMEMBERS tag 1) "C++" 2) "bbb" 3) "aaa" DISCARD 取消事物 MULTI 開啓一個事物 Exec 執行事物 Unmatch 取消watch命令全部key的監視 Watch key 監視一個或多個key,若是在事物執行以前這個(或這些)key被其餘命令所改動,那麼事物將被
7)redis—eval腳本
基本語法:eval script numkeys key [key …..] arg [arg ……] Script : 參數是一段lua 5.1腳本程序。腳本沒必要(也不該該定義爲一個lua函數) Numkeys:用於指定鍵名參數的個數 命令: 一、EVAL script numkeys key [key ...] arg [arg ...] 執行 Lua 腳本。 二、EVALSHA sha1 numkeys key [key ...] arg [arg ...] 執行 Lua 腳本。 三、SCRIPT EXISTS script [script ...] 查看指定的腳本是否已經被保存在緩存當中。 四、SCRIPT FLUSH 從腳本緩存中移除全部腳本。 五、SCRIPT KILL 殺死當前正在運行的 Lua 腳本。 六、SCRIPT LOAD script 將腳本 script 添加到腳本緩存中,但並不當即執行這個腳本。
8)redis服務器統計信息
Info列出redis服務器的詳細信息 命令: 一、BGREWRITEAOF 異步執行一個 AOF(AppendOnly File) 文件重寫操做 二、BGSAVE 在後臺異步保存當前數據庫的數據到磁盤 三、CLIENT KILL [ip:port] [ID client-id] 關閉客戶端鏈接 四、CLIENT LIST 獲取鏈接到服務器的客戶端鏈接列表 五、CLIENT GETNAME 獲取鏈接的名稱 六、CLIENT PAUSE timeout 在指定時間內終止運行來自客戶端的命令 七、CLIENT SETNAME connection-name 設置當前鏈接的名稱 八、CLUSTER SLOTS 獲取集羣節點的映射數組 九、COMMAND 獲取 Redis 命令詳情數組 十、COMMAND COUNT 獲取 Redis 命令總數 十一、COMMAND GETKEYS 獲取給定命令的全部鍵 十二、TIME 返回當前服務器時間 1三、COMMAND INFO command-name [command-name ...] 獲取指定 Redis 命令描述的數組 1四、CONFIG GET parameter 獲取指定配置參數的值 1五、CONFIG REWRITE 對啓動 Redis 服務器時所指定的 redis.conf 配置文件進行改寫 1六、CONFIG SET parameter value 修改 redis 配置參數,無需重啓 1七、CONFIG RESETSTAT 重置 INFO 命令中的某些統計數據 1八、DBSIZE 返回當前數據庫的 key 的數量 1九、DEBUG OBJECT key 獲取 key 的調試信息 20、DEBUG SEGFAULT 讓 Redis 服務崩潰 2一、FLUSHALL 刪除全部數據庫的全部key 2二、FLUSHDB 刪除當前數據庫的全部key 2三、INFO [section] 獲取 Redis 服務器的各類信息和統計數值 2四、LASTSAVE 返回最近一次 Redis 成功將數據保存到磁盤上的時間,以 UNIX 時間戳格式表示 2五、MONITOR 實時打印出 Redis 服務器接收到的命令,調試用 2六、ROLE 返回主從實例所屬的角色 2七、SAVE 保存數據到硬盤 2八、BGSAVE 異步保存數據到硬盤 2八、SHUTDOWN [NOSAVE] [SAVE] 異步保存數據到硬盤,並關閉服務器 2九、SLAVEOF host port 將當前服務器轉變爲指定服務器的從屬服務器(slave server) 30、SLOWLOG subcommand [argument] 管理 redis 的慢日誌 3一、SYNC 用於複製功能(replication)的內部命令
9)redis 的數據備份與恢復
一、啓動redis ./redis-server ../redis.conf 啓動 ./redis-cli -a aabbcc -h 192.168.2.40 -p 6379 登錄 二、查看已經存在的key 192.168.2.40:6379> keys * 1) "name" 2) "zsh" 3) "age" 4) "phone" 三、 數據備份 192.168.2.40:6379> SAVE 將數據寫入到dump.rdb中 OK 192.168.2.40:6379> CONFIG GET dir 獲取備份目錄 1) "dir" 2) "/usr/local/redis/back" 四、中止redis服務 五、拷貝dump.rdb文件到/usr/local/redis/back下 六、重啓redis服務
主從數據備份:
備份很簡單,只須要把RDB,AOF的文件複製備份起來就能夠了 #redisA: A上生成測試數據 redis 127.0.0.1:6379> set name test 7.0.0.1:6379> set age 17 OK redis 127.0.0.1:6379> keys * 1) "age" redis 127.0.0.1:6379> bgsave Background saving started #redisB: B上沒有數據 redis 127.0.0.1:6380> keys * (empty list or set) #複製A的文件到B(rdb和aof文件) cp redis/* redis2/ #修改權限 chown -R redis.redis * #重啓B 還原 redis 127.0.0.1:6380> keys * 1) 「age」
10)redis安全
設置redis.conf中的requirepass參數,指定訪問redis客戶端的密碼