(1).Redis概述
Redis是一個開源的使用ANSI C語言編寫、支持網絡、可基於內存亦可持久化的日志型、Key-Value(鍵值型)數據庫(非關系型數據庫),並提供多種語言的API。
Redis是一個高性能的Key-Value數據庫。它的出現很大程度補償來Memcached這類Key-Value型存儲的不足,在部分場合下可以對關系型數據庫起到很好的補充作用。它提供來Java、C/C++、PHP、JavaScript、Perl、Object-C、Python、Ruby、Erlang等客戶端,使用方便。
Redis支持主從同步,Redis能夠借助於Sentinel(哨兵,Redis自帶的)工具來監控主從節點,當主節點發生故障時,會自己提升另外一個從節點成為新的主節點。
1)支持的數據類型
和Memcached類似,但它支持存儲的Value類型相對更多,包括String(字符串)、List(列表)、Sets(集合)、Sorted Sets(有序集合)和Hash(哈希類型、關聯數組)、Bitmaps(位圖)和HyperLoglog。
2)性能
100萬較小的鍵存儲字符串,大概消耗100M內存;
由於Redis是單線程,如果服務器主機上有多個CPU,只有一個能夠使用,但並不意味着CPU會成為瓶頸,因為Redis是一個比較簡單的K-V數據存儲,CPU通常不會成為瓶頸的;
在常見的linux服務器上,500K(50萬)的並發,只需要一秒鍾處理,如果主機硬件較好的情況下,每秒鍾可以達到上百萬的並發.
3)Redis與Memcache對比
Memcache只能使用內存來緩存對象。而Redis除了可以使用內存來緩存對像,還可以周期性的將數據保存到磁盤上,對數據進行永久存儲。當服務器突然斷電或死機后, redis基於磁盤中的數據進行恢復;
Redis是單線程服務器,只有一個線程來響應所有的請求。Memcache是多線程的;
Redis支持更多的數據類型。
(2).安裝
yum安裝redis時,建議使用Remi repository源。因為Remi源提供了目前最新版本的Redis,可以通該源使用YUM安裝目前最新版本的Redis。另外還提供了PHP和MySQL的最新yum源,以及相關服務程序。
1)Remi repository源依賴於epel源,因此需要先安裝epel源
[root@youxi1 ~]# yum -y install epel-release
2)安裝Remi repository源
[root@youxi1 ~]# yum -y install http://rpms.remirepo.net/enterprise/remi-release-7.rpm [root@youxi1 ~]# ls /etc/yum.repos.d/ //下載完成后會出現許多remi的yum源,這里要用到的是remi.repo這個源 CentOS-Base.repo CentOS-Sources.repo remi-glpi92.repo remi-php70.repo remi-safe.repo CentOS-CR.repo CentOS-Vault.repo remi-glpi93.repo remi-php71.repo CentOS-Debuginfo.repo epel.repo remi-glpi94.repo remi-php72.repo CentOS-fasttrack.repo epel-testing.repo remi-modular.repo remi-php73.repo CentOS-Media.repo remi-glpi91.repo remi-php54.repo remi.repo
3)使用指定的yum源安裝Redis
[root@youxi1 ~]# yum --enablerepo=remi install -y redis //--enablerepo指定yum源 [root@youxi1 ~]# redis-cli --version //安裝完成后使用命令查看一下版本 redis-cli 5.0.5
注意:remi源安裝完成后,默認為不啟動,在需求使用remi repository源安裝程序時,需求--enablerepo=remi選項指定使用remi repository源是可以被使用的,然后進行安裝。
4)啟動Redis並設置開機自啟
[root@youxi1 ~]# systemctl start redis [root@youxi1 ~]# systemctl enable redis Created symlink from /etc/systemd/system/multi-user.target.wants/redis.service to /usr/lib/systemd/system/redis.service.
注意:Redis的端口號是6379
(3).配置文件信息
Linux下,Redis的配置文件存放在/etc/目錄下的redis.conf。以下列出來可能會用到的參數:
//第69行,Redis監聽的地址 bind 127.0.0.1 //第88行,安全模式,是否禁止外網訪問Redis,yes表示啟用,只能通過本地訪問 protected-mode yes //第92行,監聽的端口號 port 6379 /*第101行,指定tcp-backlog長度。tcp-backlog是一個等待隊列。 * 當大量請求需要Redis處理時,需要等待的請求隊列會通過backlog來緩存。 * backlog的數量決定來可以緩存的隊列數 */ tcp-backlog 511 //第109行,指定使用sock文件通信以及sock文件位置。如果服務端和客戶端在同一台主機上,建議打開。sock方式通信可以直接在內存中交換,不經過TCP/IP協議棧進行封裝、拆封 # unixsocket /tmp/redis.sock //第110行,定義sock文件的權限 # unixsocketperm 700 //第113行,表示客戶端連接成功后,空閑多長時間超時(非活躍,沒有數據交互)。0表示不開啟此功能 timeout 0 //第130行,維持長鏈接的時間,單位秒 tcp-keepalive 300 //第136行,是否在后台運行守護進程。如果使用redis服務腳本啟動,即使為no,也會運行一個守護進程。一般設置yes daemonize no //第147行,是由upstart還是systemd接管redis進程。默認無監督互動,不需要修改。 supervised no //第158行,pid文件地址 pidfile /var/run/redis_6379.pid //第166行,日志級別 loglevel notice //第174行,日志文件位置 logfile /var/log/redis/redis.log //第186行,默認由多少個數據庫。但是在分布式中,只能有一個 databases 16 /*第218到220行,快照存儲策略,存到磁盤的持久化策略 *第一個數字是單位時間,單位為秒;第二個數字是鍵值發生變化的次數 * 例如第一個,900秒內至少發生1次鍵值變化,則做一次快照(持久化) * 第二個就是,300秒內至少發生10次鍵值變化,則做一次快照(持久化) * 所有條件是並列關系,根據不同的鍵值變化選擇使用規則 */ save 900 1 save 300 10 save 60 10000 //第235行,在進行快照備份時,一旦發生錯誤是否停止,默認yes即可 stop-writes-on-bgsave-error yes //第241行,指定RDB文件是否壓縮。yes表示壓縮,會消耗CPU資源 rdbcompression yes /*第250行,是否對RDB文件做校驗碼檢測。 *此項定義在redis啟動時加載RDB文件是否對文件檢查校驗碼,在redis生成RDB文件是會生成校驗信息,在redis再次啟動或裝載RDB文件時,是否檢測校驗信息。 *如果檢測的情況下會消耗時間,會導致redis啟動時慢,但是能夠判斷RDB文件是否產生錯誤。 */ rdbchecksum yes //第253行,RDB文件名稱 dbfilename dump.rdb //第263行,RDB文件存放的路徑 dir /var/lib/redis //第286行,定義Master服務器的IP和端口,主從復制的配置信息 # replicaof <masterip> <masterport> //第293行,定義Master服務器的密碼,主從復制的配置信息 # masterauth <master-password> //第308行,當從端在主從復制過程中與主端斷開連接,yes表示繼續提供服務,即使數據可能不是最新的;no表示對請求返回錯誤信息 replica-serve-stale-data yes //第324行,從端只讀 replica-read-only yes //第355行,默認不使用diskless(無磁盤)同步方式 repl-diskless-sync no //第367行,diskless(無磁盤)方式進行數據傳遞之前會有一個時間的延遲,以便從端能夠進行到待傳送的目標隊列中,默認5秒 repl-diskless-sync-delay 5 //第373行,從端向主端發送ping的時間間隔,默認10秒 # repl-ping-replica-period 10 //第385行,設置超時時間 # repl-timeout 60 /*第400行,是否啟用TCP_NODELAY。 * 如果啟用則會使用少量的TCP包和帶寬去進行數據傳輸到從端,速度較慢; * 如果不啟用則使用較多的帶寬進行數據傳輸,速度較快。 */ repl-disable-tcp-nodelay no /*第413行,設置backlog的大小。backlog是一個緩沖區,在從端失聯時存放要同步到從端的數據。 * 因此當從端重連時,一般是不需要完全同步的。backlog越大,從端可以失聯的時間就越長(相對來說) */ # repl-backlog-size 1mb //第426行,一段時間后,從端還沒有連上master,那么backlog(緩沖區)的內存將被釋放。0表示永不釋放,默認3600秒 # repl-backlog-ttl 3600 //第441行,從端的優先級設置,數字越小優先級越高。主端故障會根據優先級高的從端來進行恢復。如果設置的是0,那么該從端永遠不會被選中 replica-priority 100 //第457到458行,當主端的可用從端小於3個或網路延遲島嶼10秒時,主端拒絕接收用戶的寫請求。 # min-replicas-to-write 3 # min-replicas-max-lag 10 //第507行,指定認證密碼,默認不啟動 # requirepass foobared //第539行,同時連接redis的最大數量 # maxclients 10000
特別注意:第69行的bind,第88行的protected-mode,第136行的daemonize,第539行的maxclients,還有主從復制的所有配置參數。
(4).redis的簡單使用
最最簡單的使用:redis-cli -h [IP地址] -p [端口號]。如果是連接本地,-h和-p都可以省略。
1)Reids字符串操作
鍵的命名規則:可以使用ASCII字符;鍵的長度不要過長,鍵的長度越長則消耗的空間越多;在同一個庫中(名稱空間),鍵的名稱不得重復,如果復制鍵的名稱,實際上是修改鍵中的值;在不同的庫中(名稱空間),鍵的多種名稱可以重復;鍵可以實現自動過期。
[root@youxi1 ~]# redis-cli 127.0.0.1:6379> set system centos //創建鍵值 OK 127.0.0.1:6379> get system //獲取鍵值 "centos" 127.0.0.1:6379> exit [root@youxi1 ~]# systemctl restart redis //重啟 [root@youxi1 ~]# redis-cli 127.0.0.1:6379> get system //可以看到鍵值是存在的 "centos" 127.0.0.1:6379> set name "youxi" EX 10 //如這般設置,則表示該鍵值值存在10秒 OK 127.0.0.1:6379> get name //10秒過后再次查看,這就是一個臨時鍵值 (nil)
2)如果開啟認證功能
首先修改配置文件,開啟認證功能
[root@youxi1 ~]# vim /etc/redis.conf requirepass 123456 //在第507行,去除注釋,設置認證密碼 [root@youxi1 ~]# systemctl restart redis
此時再次使用redis
[root@youxi1 ~]# redis-cli 127.0.0.1:6379> get system //沒有認證時,會報錯 (error) NOAUTH Authentication required. 127.0.0.1:6379> auth 123456 //認證 OK 127.0.0.1:6379> get system //認證后,再次獲取鍵值,成功 "centos"
(5).配置持久化
Redis工作時所有數據集都是存儲於內存中的。如果Redis崩潰或斷電會導致所有數據丟失,所以Redis提供了持久化功能來保證數據的可靠性。Redis持久化有兩種實現方法:RDB和AOF。
RDB: 存儲為二進制格式的數據文件,是默認啟動的持久化機制;按事先定制的策略,周期性地將數據保存至磁盤。
AOF:Append Only File類似於MySQL的二進制日志,記錄每一次redis的寫操作命令,以順序IO方式附加在指定文件的尾部,是使用追加方式實現的,這也叫做一種附加日志類型的持久化機制。由於每一次的操作都記錄,則會隨着時間長而增大文件的容量,並且有些記錄的命令是多余的。但是redis進程能夠自動的去掃描這個對應的AOF文件,把其中一些冗余的操作給合並一個,以實現將來一次性把數據恢復。
RDB的配置其實上面已經說明過了,我這里再復制一下,如下。總共就6個配置點。
/* * 第218到220行,快照存儲策略,存到磁盤的持久化策略 *第一個數字是單位時間,單位為秒;第二個數字是鍵值發生變化的次數 * 例如第一個,900秒內至少發生1次鍵值變化,則做一次快照(持久化) * 第二個就是,300秒內至少發生10次鍵值變化,則做一次快照(持久化) * 所有條件是並列關系,根據不同的鍵值變化選擇使用規則 */ save 900 1 save 300 10 save 60 10000 //第235行,在進行快照備份時,一旦發生錯誤是否停止,默認yes即可 stop-writes-on-bgsave-error yes //第241行,指定RDB文件是否壓縮。yes表示壓縮,會消耗CPU資源 rdbcompression yes /*第250行,是否對RDB文件做校驗碼檢測。 *此項定義在redis啟動時加載RDB文件是否對文件檢查校驗碼,在redis生成RDB文件是會生成校驗信息,在redis再次啟動或裝載RDB文件時,是否檢測校驗信息。 *如果檢測的情況下會消耗時間,會導致redis啟動時慢,但是能夠判斷RDB文件是否產生錯誤。 */ rdbchecksum yes //第253行,RDB文件名稱 dbfilename dump.rdb //第263行,RDB文件存放的路徑 dir /var/lib/redis
AOF的配置從第679行開始,如果需要可以自己看一下。