Remote Dictionary Server(遠程數據的服務),是一種NoSQL技術,是一個基於key-value的高速緩存系統,是目前應用面最廣的緩存系統之一。php
Redis:Remote Dictionary Server(遠程數據的服務),是一種NoSQL技術,是一個基於key-value的高速緩存系統,Redis是一個開源的使用ANSI C語言編寫、支持網絡、可基於內存亦可持久化的日誌型、Key-Value數據庫,並提供多種語言的API。相似於Memcache,可是支持更復雜的數據結構List,Set,SortedSet等,而且有持久化[1]的功能。redis
Redis有如下特色:數據庫
通常場景就是數據緩存服務器,與Memcache的角色保持一致;實質上Redis緩存數據庫服務器在提供的緩存的基礎上,同時提供數據持久化(複製),也就是提供數據庫層面的功能。vim
實現機制:操做時,操做的內存容許設置同步到磁盤上。緩存
1.存儲方式:安全
2.數據支持類型:服務器
3.使用底層模型不一樣網絡
4.運行的環境不一樣數據結構
5.對於二者的選擇具體看應用場景架構
1.Redis默認不是以守護進程的方式運行,能夠經過該配置項修改,使用yes啓用守護進程:daemonize no。
2.當Redis以守護進程方式運行時,Redis默認會把pid寫入/var/run/redis.pid文件,能夠經過pidfile制定存儲位置:pidfile /var/run/redis.pid。
3.指定Redis監聽端口,默認端口爲6379.
4.綁定的主機地址:bind 127.0.0.1
5.當客戶端閒置多長時間後關閉鏈接,若是制定爲0,表示關閉該功能。timeout 300。
6.指定日誌記錄級別,Redis總共支持你四個級別debug、verbose、notice、warning、默認是verbose:loglevel verbose。
7.設置數據庫的數量,默認數據庫爲0,可使用SELECT <dbid>命令在鏈接上指定數據庫id:databases 16。
8.指定在多長時間內,有多少次更新數據,就將數據同步到數據文件,能夠多個條件配合:
save <seconds><changes> //Redis 默認配置文件提供了三個條件 save 900 1 save 300 10 save 60 10000
分別表示900秒(15分鐘)內有1個更改,300秒(5分鐘)內有10個更高,60秒內有10000個更改。
9.指定本地數據文件名,默認值爲dump.rdb:dbfilename dump.rdb
10.指定本地數據庫存放目錄:dir ./
11.設置Redis鏈接密碼,若是配置了鏈接密碼,客戶端在鏈接Redis時須要經過AUTH <password>命令提供密碼,默認關閉:requirepass 輸入密碼
12.登陸服務器的狀態:info
備份原理和過程:緩存數據庫服務器 =>緩存數據存儲在內存 =>數據庫存儲在磁盤上 =>執行指令,都是在自動在內存中增長數據,數據備份到指定文件位置 => Redis SAVE 命令用於建立當前數據庫的備份。
save:當即存儲快照(內存數據保存到磁盤中)
bgsave:後臺當即存儲快照(內存數據保存到磁盤中)
Redis的事務處理比較簡單。只能保證client發起的事務中的命令能夠連續的執行,並且不會插入其餘的client命令,當一個client在鏈接中發出multi命令時,這個鏈接就進入一個事務的上下文,該鏈接後續的命令不會執行,而是存放到一個隊列中,當執行exec命令時,redis會順序的執行隊列中的全部命令。若是其中執行出現錯誤,執行正確的不會回滾,不一樣於關係型數據庫的事務。
1.MULTI標記一個事務塊的開始(開啓)。
2.EXEC執行因此事務塊內的命令。
127.0.0.1:6379> multi Ok 127.0.0.1:6379> set user ak QUEUED 127.0.0.1:6379> set school Tsinghua QUEUED 127.0.0.1:6379> set Class Pking QUEUED 127.0.0.1:6379> exec OK OK OK
3.DISCARD取消事務,放棄執行事務塊內的因此命令。
127.0.0.1:6379> multi Ok 127.0.0.1:6379> set user ak QUEUED 127.0.0.1:6379> set school Tsinghua QUEUED 127.0.0.1:6379> discard OK 127.0.0.1:6379> get user (nil)
4.WATCH key [key ...]監視一個(或多個)key,若是在事務執行以前這個(或這些)key被其餘命令所改動,那麼事務將被打斷。
127.0.0.1:6379> watch user Ok 127.0.0.1:6379> watch school ok
5.UNWATCH取消WATCH命令對全部key的監視。
1.設置在客戶端鏈接是須要指定的密碼(因爲redis速度至關的快,一秒鐘能夠150K次的密碼嘗試,因此須要設置一個密碼強度很大的密碼)。
設置密碼的方式有兩種:
(1) 使用config set 命令的requirepass 參數,具體格式爲config set requirepass 「password」。 (2) 配置redis.conf 中設置requirepass屬性,後面爲密碼。
輸入認證的方式也有兩種:
(1) 登陸時能夠 redis-cli -a password
(2)登陸後使用 auth password
//1.設置密碼:首先須要進入Redis的安裝目錄,而後修改配置文件redis.conf。根據grep命令的結果,使用vi編輯器修改「# requirepass foobared」 爲「requirepass aklman」,而後保存退出。 $ grep -n requirepass /etc/redis.conf $ sudo vim /etc/redis.conf //2.重啓redis-server與redis-cli: $ sudo service redis-server restart $ redis-cli > info //沒有權限提示 > auth aklman > info //成功查詢數據 > exit //結果代表第一次info命令失敗,在auth認證以後info命令正常返回。最後退出redis-cli。 //或者這樣登陸: $ redis-cli -a aklman > info
2.ECHO message:打印字符串
3.PING:查看服務是否運行
4.QUIT:關閉當前鏈接
5.SELECT index:切換到指定的數據庫
Redis是一個支持持久化的內存數據庫,Redis須要常常將內存中的數據同步到磁盤來保證持久化。
Redis支持兩種持久化方式:
一、snapshottingRDB(快照),將數據存放到文件裏,默認方式。也就是把內存中的內容,壓縮以後,直接存儲到硬盤中,這種方式在啓動的時候,加載速度很是的快!
是將內存中的數據已快照的方式寫入到二進制文件中,默認文件dump.rdb,能夠經過配置設置自動作快照持久化的方式。可配置Redis在n秒內若是超過m個key被修改就自動保存快照。
save 900 1 #900秒有1個keys改變,就會執行持久化 save 300 10 #300秒有10個keys改變,就會執行持久化,改爲save 100 6更方便 save 60 10000 #60秒有1w個keys改變,就會執行持久化
優點:
劣勢:
總結:
二、 Append-only file(縮寫爲aof),將讀寫操做存放到文件中。
因爲快照方式在必定間隔時間作一次,因此若是Redis意外down掉的話,就會丟失最後一次快照後的全部修改。
aof比快照方式有更好的持久化性,是因爲使用aof時,redis會將每個收到的寫命令都經過write函數寫入到文件中當redis啓動時會經過從新執行文件中保存的寫命令來在內存中從新創建整個數據庫的內容。
因爲os會在內核中緩存write作的修改,因此可能不是當即寫到磁盤上,這樣aof方式的持久化也仍是有可能會丟失一部分數據。能夠經過配置文件告訴redis咱們想要經過fsync函數強制os寫入到磁盤的時機。
配置文件中的可配置參數:
appendonly yes //啓用aof持久化方式 #appendfsync always //收到寫命令就當即寫入磁盤,最慢,可是保證了數據的完整持久化 appendfsync everysec //每秒中寫入磁盤一次,在性能和持久化方面作了很好的折中 #appendfsync no //徹底依賴os,性能最好,持久化沒有保證
參數說明:
優點:
劣勢:
總結:對比兩個持久化
Redis經過主從模式能夠容許多個slave(副) server擁有和master(主) server相同的數據庫副本。從服務器只能讀,不能寫。
1.Redis Replication的工做原理:
原理解讀:
在Slave啓動並鏈接到Master以後,它將主動發送一個SYNC命令。此後Master將啓動後臺存盤進程,同時收集全部接收到的用於修改數據集的命令,在後臺進程執行完畢後,Master將傳送整個數據庫文件到Slave,以完成一次徹底同步。而Slave服務器在接收到數據庫文件數據以後將其存盤並加載到內存中。此後,Master繼續將全部已經收集到的修改命令,和新的修改命令依次傳送給Slaves,Slave將在本次執行這些數據修改命令,從而達到最終的數據同步。
若是Master和Slave之間的連接出現斷連現象,Slave能夠自動重連Master,可是在鏈接成功以後,一次徹底同步將被自動執行。
總結:
2.Redis Replication的特色:
3.如何配置
總結:在Redis的主從配置中,從服務器是一個只讀的設備。不能寫操做。
設置一個值:set key value
set name aklman
獲取一個值:get key
get name
同時設置多個值:mset key1 value key2 value
同時獲取多個值:mget key1 key2
刪除值:del key
自增1(值必須是數字):incr key
自增指定的值:incrby key
incrby能夠操做的最大範圍:有符號的2^64;而修改Memcache的最大範圍描述是無符號的2^64超過Redis在整形最大範圍的時候,繼續自增會報錯;而Memcache在最大值時繼續增長會到0再繼續加。自減也同理,只是把增長數值設定負數便可。Memcache在最小值時繼續向下減依然是最小值。
Redis設置的數和增長的數值可使用負數,Memcache不能使用負數。增減與上同理。
形式:key => array(field1=>value1,field2=>value2,field3=>value2);value1能夠重複,field不能重複。
設置值:hset key field value
hset user name aklman
獲取值:hget key field
hget user name
設定多個值:hmset key field1 value1 field2 value2
hmset student name aklman age 18 sex 1
獲取多個值(字段值的順序能夠換):hmget key field1 field2 field3
hash表中設定的字段值是惟一的,若是以前有,就會覆蓋!!
獲取hash標的field和value(獲取因此字段及相應值):hgetall key
獲取hash表裏面的field:hkeys key
獲取hash表裏面的value的個數:hlen key
刪除hash表裏面的field值:hdel key field1 field2
注意:hash表中的操做,必須使用hash的方法來操做,字符串的操做就用字符串的方式,不能混着用。
列表:雙向列表,隊列,堆棧;裏面的值是能夠重複的。
1.雙向列表:
給一個列表從左(右)邊添加內容:lpush(rpush) Listname value1 value2 value3
查看list的內容:lrange Listname 起始位置(0或者其餘) 結束位置(-1表示最後面)
從左(右)邊彈出一個值:lpop(rpop) Listname
查看列表的長度:llen Listname
2.隊列:
給一個列表從左邊添加內容:lpushListname value1 value2 value3
從左邊彈出一個值:lpop Listname
給一個列表從右邊添加內容:rpush Listname value1 value2 value3
從右邊彈出一個值:rpop Listname
3.堆棧
給一個列表從左邊添加內容:lpushListname value1 value2 value3
從左邊彈出一個值:lpop Listname
給一個列表從右邊添加內容:rpush Listname value1 value2 value3
從右邊彈出一個值:rpop Listname
添加數據:sadd set value1 value2 value3
添加完數據後再想添加數據,能夠再sadd setvalue4 value5 value3,發現直插入成功兩個,由於集合不容許values的值重複出現。
查看數據:smembers set
隨機彈出:spop set
爲何集合裏面的數據能隨機彈出?緣由是集合中的數據是無序的,也就是無序集合有這個特性。隨機彈出多個值:spop set n (n不能超過集合元素數)
查看長度:scard set
交集:sinter setA setB
交集就是它們的共同部分,與數學中學的一個樣
並集:sunion setA setB
重複的內容只顯示一次。
差集:sdiff setA setB
redis裏面的差集,是隻顯示,第一個集合的內容
添加數據:zadd SortedSetKey number1 value1 number2 value2
查看長度:zcard SortedSetKey
查看有序集合裏面的值:zrange SortedSetKey 起始位置 結束位置(-1表示最後的位置)
顯示有序集合排序的編號:zrange SortedSetKey 起始位置 結束位置(-1表示最後的位置) withscores
修改排序號:zincrby SortedSetKey n value1
顯示倒序:zrevrange SortedSetKey 起始位置 結束位置(-1表示最後的位置)
顯示帶編號的倒序:zrevrange SortedSetKey 起始位置 結束位置(-1表示最後的位置) withscores
注意:
1.查看Redis裏面有多少個key:keys *
2.幾條經常使用命令:
//在命令行直接運行命令 redis-cli keys '*' //在命令行刪除內容,指定刪除的key redis-cli del 'test' //結合兩個命令實現搜索而且刪除key,這樣寫會報錯,由於keys在執行完成以後,一次性把文檔裏面拿給了del,此時,del就認爲你文檔裏面的值,是一個值,要刪除就會報錯。 redis-cli keys '*' | redis-cli del //解決方式以下,xargs的含義是:當左邊命令結果經過管道的時候,只要有xargs參數,它就是告訴左邊的命令,你執行一條結果,就給我一條結果。左邊在執行的時候,執行一個結果,就當即傳給咱們右邊去執行 redis-cli keys '*t' |xargs redis-cli del
思考問題:
1.當咱們左邊的查詢內容是10G的時候,它要傳給右邊,須要的內存多少?
佔用內存20G,由於使用了xargs參數,就是執行完一個結構就傳給右邊,一個結構能夠佔10K,傳給右邊也是10K,加起來就是20K。
2.在結合find的使用
find /toot/ -name '*php' | xargs ls -l
3.判斷key是否存在:exists key
4.設置過時時間:expire key 20
5.查看過時時間:ttl key
6.查看key的類型:type key
7.選擇庫:select 2
8.是在redis的客戶端去ping咱們redis的服務端:ping hello
9.清空當前庫:flushdb
10.清空索引的庫:flushall
11.Redis的key命名規範
1.EXISTS and DEL
2.TYPE and KEYS
3.RANDOMKEY and CLEAR
4.RENAME and RENAMENX
5.DBSIZE
6.CONFIG GET and CONFIG SET
7.CONFIG RESETSTAT
PHP操做Redis:使用咱們的php客戶端(redis擴展)鏈接到redis服務器
<?php $redis=new redis(); $redis->connect('127.0.0.1',6379); $redis->auth('aklman'); $redis->set('DomainServer','Aklman.com');
就能夠在Redis從服務器中看到這條信息了。
INFO [section] :查詢Redis相關信息。 INFO命令能夠查詢Redis幾乎全部的信息,其命令選項有以下:
[1] 持久化是指存儲到磁盤,服務器重啓後還能夠存在。而存儲到內存中的數據,一重啓服務器就不存在。