學習Redis(五)

 

Redis介紹

Redis 是徹底開源免費的,遵照BSD協議,是一個高性能的key-value數據庫。javascript

Redis 與其餘 key - value 緩存產品有如下三個特色:php

Redis支持數據的持久化,能夠將內存中的數據保持在磁盤中,重啓的時候能夠再次加載進行使用。html

Redis不只僅支持簡單的key-value類型的數據,同時還提供list,set,zset,hash等數據結構的存儲。java

Redis支持數據的備份,即master-slave模式的數據備份。node

Redis 優點

性能極高 – Redis能讀的速度是110000次/s,寫的速度是81000次/s 。python

豐富的數據類型 – Redis支持二進制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 數據類型操做。mysql

原子 – Redis的全部操做都是原子性的,同時Redis還支持對幾個操做全並後的原子性執行。git

豐富的特性 – Redis還支持 publish/subscribe, 通知, key 過時等等特性。程序員

Redis與其餘key-value存儲有什麼不一樣?

Ÿ   Redis有着更爲複雜的數據結構而且提供對他們的原子性操做,這是一個不一樣於其餘數據庫的進化路徑。Redis的數據類型都是基於基本數據結構的同時對程序員透明,無需進行額外的抽象。github

Ÿ   Redis運行在內存中可是能夠持久化到磁盤,因此在對不一樣數據集進行高速讀寫時須要權衡內存,應爲數據量不能大於硬件內存。在內存數據庫方面的 另外一個優勢是, 相比在磁盤上相同的複雜的數據結構,在內存中操做起來很是簡單,這樣Redis能夠作不少內部複雜性很強的事情。 同時,在磁盤格式方面他們是緊湊的以追加的方式產生的,由於他們並不須要進行隨機訪問。

 

 Remote Dictionary Server(Redis)是一個基於 key-value 鍵值對的持久化數據庫存儲系統。redis 和 Memcached 緩存服務很像,但它支持存儲的 value 類型相對更多,包括 string (字符串)、list (鏈表)、set (集合)、zset (sorted set --有序集合)和 hash(哈希類型)。這些數據類型都 支持 push/pop、add/remove 及取交集並集和差集及更豐富的操做,並且這些操做都是原子性的。在此基礎上,redis 支持各類不一樣方式的排序。與 memcached 同樣,爲了保證效率,數據都是緩存在內存中。區別的是 redis 會週期性的把更新的數據寫入磁盤或者把修改操做寫入追加的記錄文件,而且在此基礎上實現了 master-slave (主從)同步。

redis 的出現,再必定程度上彌補了 Memcached 這類 key-value 內存換乘服務的不足,在部分場合能夠對關係數據庫起到很好的補充做用。redis 提供了 Python,Ruby,Erlang,PHP 客戶端,使用方便。官方文檔: https://redis.io/documentation

Redis 在新浪微博中的應用

http://www.cnblogs.com/me115/p/3482783.html

 

Redis 安裝和使用實例

複製代碼
環境:
[root@redis /]# uname -r
2.6.32-504.el6.x86_64
[root@redis /]# ifconfig eth0|awk -F '[ :]+' 'NR==2{print $4}'
192.168.179.161
[root@redis /]# cat /etc/redhat-release 
CentOS release 6.6 (Final)
[root@redis /]# /etc/init.d/iptables status
iptables:未運行防火牆。
[root@redis /]# getenforce
Permissive
#3.0版本源碼安裝也同樣
wget -q http://download.redis.io/releases/redis-2.8.9.tar.gz   
tar xf redis-2.8.9.tar.gz
cd redis-2.8.9
#less README
make MALLOC=jemalloc
make PREFIX=/application/redis-2.8.9 install
ln -s /application/redis-2.8.9/ /application/redis

tree /application/redis
/application/redis
`-- bin
    |-- redis-benchmark     # Redis性能測試工具,測試Redis在系統及你的配置下的讀寫性能。
    |-- redis-check-aof     # 更新日誌檢查。
    |-- redis-check-dump    # 用於本地數據庫檢查。
    |-- redis-cli           # Redis命令行操做工具。也能夠telnet根據其純文本協議操做
    `-- redis-server        # Redis服務器的daemon啓動程序。
1 directory, 5 files
配置環境變量
[root@redis01 redis-2.8.9]# echo 'export PATH=/application/redis/bin/:$PATH' >>/etc/profile
[root@redis01 redis-2.8.9]# 
[root@redis01 redis-2.8.9]# tail -1 /etc/profile
export PATH=/application/redis/bin/:$PATH
[root@redis01 redis-2.8.9]# . /etc/profile
[root@redis01 redis-2.8.9]# which redis-server
/application/redis/bin/redis-server
拷貝生成配置文件
[root@redis01 redis-2.8.9]#  mkdir /application/redis/conf
[root@redis01 redis-2.8.9]# pwd
 [root@redis01 redis-2.8.9]# cp redis.conf /application/redis/conf/
啓動redis
redis-server /application/redis/conf/redis.conf &
[20222] 29 Nov 20:43:48.571 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
[20222] 29 Nov 20:43:48.571 * The server is now ready to accept connections on port 6379
檢查端口
lsof -i :6379
COMMAND     PID USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
redis-ser 20222 root    4u  IPv6 1523437      0t0  TCP *:6379 (LISTEN)
redis-ser 20222 root    5u  IPv4 1523439      0t0  TCP *:6379 (LISTEN)

去掉上面的警告信息
sysctl vm.overcommit_memory=1
echo 'vm.overcommit_memory=1' >>/etc/sysctl.conf
sysctl -p
關閉redis操做的命令
redis-cli shutdown save
複製代碼

 

常見操做

複製代碼
[root@redis01 redis-2.8.9]# redis-cli
127.0.0.1:6379> set id 001  #插入數據:設置一個key-value對
OK
127.0.0.1:6379> get id   #查詢數據:取出key所對應的value
"001"
127.0.0.1:6379> del id #刪除鍵值
(integer) 1
127.0.0.1:6379> get id  #查詢數據
(nil)
127.0.0.1:6379> exists id   #驗證是否存在,1表明存在,0表明不存在
(integer) 0

127.0.0.1:6379> set user001 oldboy
OK
127.0.0.1:6379> set user002 zsq
OK
127.0.0.1:6379> set user003 test
OK
127.0.0.1:6379> get user001
"oldboy"
127.0.0.1:6379> keys *   #取出全部
1) "user003"
2) "user002"
3) "user001"

select能夠切換庫從0到15  ,在第一個庫建立的內容其它庫是不可見的
127.0.0.1:6379> select 1
OK
127.0.0.1:6379[1]> keys *
(empty list or set)
127.0.0.1:6379[1]> set name oldboy
OK
127.0.0.1:6379[1]> get name
"oldboy"
127.0.0.1:6379[1]> select 0
OK
127.0.0.1:6379> keys *
1) "user003"
2) "user002"
3) "user001"
127.0.0.1:6379> select 16
(error) ERR invalid DB index
127.0.0.1:6379[16]> select 15
OK
複製代碼

其它鏈接方式

複製代碼
redis-cli -h 192.168.179.162 -p 6379
非交互式
[root@redis01 redis-2.8.9]# redis-cli -h 192.168.179.162 -p 6379 set k v
OK
[root@redis01 redis-2.8.9]# redis-cli -h 192.168.179.162 -p 6379 get k
"v"
telnet 加IP 加端口也能夠
[root@redis01 redis-2.8.9]# telnet 192.168.179.162 6379
Trying 192.168.179.162...
Connected to 192.168.179.162.
Escape character is '^]'.
set a b
+OK
get a
$1
B
nc的方式
[root@redis01 redis-2.8.9]# echo "set no004 zsq"|nc 127.0.0.1 6379
+OK
[root@redis01 redis-2.8.9]# echo "get no004 "|nc 127.0.0.1 6379
$3
zsq
複製代碼

redis的幫助

複製代碼
redis-cli  --help
192.168.179.162:6379> help
redis-cli 2.8.9
Type: "help @<group>" to get a list of commands in <group>
      "help <command>" for help on <command>
      "help <tab>" to get a list of possible help topics
      "quit" to exit
複製代碼

redis的安全帳戶密碼及受權權限

複製代碼
vim /application/redis/conf/redis.conf
335 # Warning: since Redis is pretty fast an outside user can try up to
336 # 150k passwords per second against a good box. This means that you should
337 # use a very strong password otherwise it will be very easy to break.、
339行設置密碼
339 requirepass zsq
重啓生效
redis-cli shutdown
 redis-server /application/redis/conf/redis.conf &

[root@redis01 redis-2.8.9]# redis-cli
127.0.0.1:6379> set k v
(error) NOAUTH Authentication required. #提示權限不夠
127.0.0.1:6379> auth zsq  #用auth加密碼
OK
127.0.0.1:6379> set k v
OK
非交互式 –a指定密碼
[root@redis01 redis-2.8.9]# redis-cli -a zsq
127.0.0.1:6379> set k2 v2
OK
127.0.0.1:6379> get k2
"v2"
中止redis
redis-cli -a zsq shutdown
能夠屏蔽跟更名
# It is possible to change the name of dangerous commands in a shared
# environment. For instance the CONFIG command may be renamed into something
# hard to guess so that it will still be available for internal-use tools
# but not available for general clients.
#
# Example:
#
# rename-command CONFIG b840fc02d524045429941cc15f59e41cb7be6c52
#
# It is also possible to completely kill a command by renaming it into
# an empty string:
#
rename-command set ""  #好比屏蔽這個set

[root@redis01 redis-2.8.9]# redis-cli shutdown  
(error) NOAUTH Authentication required.#關閉都沒權限
[root@redis01 redis-2.8.9]# redis-cli -a zsq shutdown #指定密碼關閉
[root@redis01 redis-2.8.9]# redis-server /application/redis/conf/redis.conf & #啓動
[root@redis01 redis-2.8.9]# redis-cli  
127.0.0.1:6379> set k v #執行set
(error) ERR unknown command 'set'   #提示找不到這個命令
127.0.0.1:6379>
複製代碼

在php環境中安裝redis的客戶端擴展

複製代碼
# 一、下載安裝
wget https://github.com/phpredis/phpredis/archive/master.zip

unzip phpredis-master.zip
cd phpredis-master
/application/php/bin/phpize
./configure --with-php-config=/application/php/bin/php-config
make
make install

cd/application/php-5.6.8/lib/php/extensions/no-debug-non-zts-20131226/
ls
memcache.so  opcache.a  opcache.so  redis.so


# 二、修改php.ini設置,重啓php
在php.ini追加一條記錄
echo "extension = redis.so" >> /application/php/lib/php.ini

#重啓 php-fpm
killall php-fpm
/application/php/sbin/php-fpm

#網頁測試
複製代碼

php程序實戰操做redis服務

複製代碼
必需要有php環境
cat /application/php/bin/php 1.php
<?php
     $redis = new Redis();
     $redis ->connect('192.168.179.162',6379);
     $redis ->auth('zsq');
     $redis ->set('name','zsq');
     $var = $redis ->get('name');
     echo "$var\n";
?>
複製代碼

Python操做Redis

複製代碼
pip install redis
or
sudo easy_install redis
or
sudo python setup.py install

詳見:
https://github.com/WoLpH/redis-py
https://pypi.python.org/pypi/redis
https://redislabs.com/python-redis
複製代碼

逐條解讀redis服務的配置文件

複製代碼
[root@redis01 redis-2.8.9]# grep -vE "#|^$" /application/redis/conf/redis.conf 
daemonize no    #在後臺運行
pidfile /var/run/redis.pid  #pid file
port 6379 #默認端口
tcp-backlog 511 #tcp的隊列
# bind 192.168.1.100 10.0.0.1  #默認監聽全部,若是有外網的環境須要監聽內網的
# bind 127.0.0.1
timeout 0  #客戶端的超時,0表示不超時
tcp-keepalive 0 #tcp的會話保持
loglevel notice #日誌級別
logfile "" #能夠把日誌記到log文件,不輸出到屏幕
# syslog-facility local0  #日誌設備,日誌集中收集能夠把註釋去掉
databases 16 #設置數據庫的數量,相似mysql的數據庫
save 900 1
save 300 10
save 60 10000
#以上三項是快照
stop-writes-on-bgsave-error yes #若是bgsave出錯是否中止寫
rdbcompression yes #在dump的時候要不要壓縮,壓縮會消耗cpu
rdbchecksum yes #rdb的檢查
dbfilename dump.rdb #dump的磁盤文件
dir ./ #控制上邊選項的路徑的,當前路徑
slave-serve-stale-data yes #主從同步
slave-read-only yes 
repl-disable-tcp-nodelay no
slave-priority 100
requirepass zsq  #安全選項,受權密碼
appendonly no
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100 #自動保持rewrite
auto-aof-rewrite-min-size 64mb 
lua-time-limit 5000 #lua腳本實現更多生產場景
slowlog-log-slower-than 10000
slowlog-max-len 128
notify-keyspace-events ""
hash-max-ziplist-entries 512 #hash優化參數
hash-max-ziplist-value 64
list-max-ziplist-entries 512
list-max-ziplist-value 64
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
hll-sparse-max-bytes 3000
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
aof-rewrite-incremental-fsync yes
複製代碼

參數說明

複製代碼
redis.conf 配置項說明以下:
1. Redis默認不是以守護進程的方式運行,能夠經過該配置項修改,使用yes啓用守護進程
    daemonize no
2. 當Redis以守護進程方式運行時,Redis默認會把pid寫入/var/run/redis.pid文件,能夠經過pidfile指定
    pidfile /var/run/redis.pid
3. 指定Redis監聽端口,默認端口爲6379,做者在本身的一篇博文中解釋了爲何選用6379做爲默認端口,由於6379在手機按鍵上MERZ對應的號碼,而MERZ取自意大利歌女Alessia Merz的名字
    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 <dbid>命令在鏈接上指定數據庫id
    databases 16
9. 指定在多長時間內,有多少次更新操做,就將數據同步到數據文件,能夠多個條件配合
    save <seconds> <changes>
    Redis默認配置文件中提供了三個條件:
    save 900 1
    save 300 10
    save 60 10000
    分別表示900秒(15分鐘)內有1個更改,300秒(5分鐘)內有10個更改以及60秒內有10000個更改。
 
10. 指定存儲至本地數據庫時是否壓縮數據,默認爲yes,Redis採用LZF壓縮,若是爲了節省CPU時間,能夠關閉該選項,但會致使數據庫文件變的巨大
    rdbcompression yes
11. 指定本地數據庫文件名,默認值爲dump.rdb
    dbfilename dump.rdb
12. 指定本地數據庫存放目錄
    dir ./
13. 設置當本機爲slav服務時,設置master服務的IP地址及端口,在Redis啓動時,它會自動從master進行數據同步
    slaveof <masterip> <masterport>
14. 當master服務設置了密碼保護時,slav服務鏈接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. 指定更新日誌條件,共有3個可選值:     no:表示等操做系統進行數據緩存同步到磁盤(快)     always:表示每次更新操做後手動調用fsync()將數據寫到磁盤(慢,安全)     everysec:表示每秒同步一次(折衷,默認值)
    appendfsync everysec
 
21. 指定是否啓用虛擬內存機制,默認值爲no,簡單的介紹一下,VM機制將數據分頁存放,由Redis將訪問量較少的頁即冷數據swap到磁盤上,訪問多的頁面由磁盤自動換出到內存中(在後面的文章我會仔細分析Redis的VM機制)
     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 0
24. Redis swap文件分紅了不少的page,一個對象能夠保存在多個page上面,但一個page上不能被多個對象共享,vm-page-size是要根據存儲的 數據大小來設定的,做者建議若是存儲不少小對象,page大小最好設置爲32或者64bytes;若是存儲很大大對象,則可使用更大的page,若是不 肯定,就使用默認值
     vm-page-size 32
25. 設置swap文件中的page數量,因爲頁表(一種表示頁面空閒或使用的bitmap)是在放在內存中的,,在磁盤上每8個pages將消耗1byte的內存。
     vm-pages 134217728
26. 設置訪問swap文件的線程數,最好不要超過機器的核數,若是設置爲0,那麼全部對swap文件的操做都是串行的,可能會形成比較長時間的延遲。默認值爲4
     vm-max-threads 4
27. 設置在向客戶端應答時,是否把較小的包合併爲一個包發送,默認爲開啓
    glueoutputbuf yes
28. 指定在超過必定的數量或者最大的元素超過某一臨界值時,採用一種特殊的哈希算法
    hash-max-zipmap-entries 64
    hash-max-zipmap-value 512
29. 指定是否激活重置哈希,默認爲開啓(後面在介紹Redis的哈希算法時具體介紹)
    activerehashing yes
30. 指定包含其它的配置文件,能夠在同一主機上多個Redis實例之間使用同一份配置文件,而同時各個實例又擁有本身的特定配置文件
    include /path/to/local.conf
複製代碼

Redis 數據類型

Redis支持五種數據類型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。

String(字符串)

string是redis最基本的類型,你能夠理解成與Memcached如出一轍的類型,一個key對應一個value。

string類型是二進制安全的。意思是redis的string能夠包含任何數據。好比jpg圖片或者序列化的對象 。

string類型是Redis最基本的數據類型,一個鍵最大能存儲512MB。

[root@redis01 redis-2.8.9]# redis-cli
127.0.0.1:6379> set name "redis.net.cn"
OK
127.0.0.1:6379> get name
"redis.net.cn"

在以上實例中咱們使用了 Redis 的 SETGET 命令。鍵爲 name,對應的值爲redis.net.cn。

注意:一個鍵最大能存儲512MB。

Hash(哈希)

Redis hash 是一個鍵值對集合。

Redis hash是一個string類型的field和value的映射表,hash特別適合用於存儲對象。

實例

複製代碼
redis 127.0.0.1:6379> HMSET user:1 username redis.net.cn password redis.net.cn points 200
OK
redis 127.0.0.1:6379> HGETALL user:1
1) "username"
2) "redis.net.cn"
3) "password"
4) "redis.net.cn"
5) "points"
6) "200"
redis 127.0.0.1:6379>
複製代碼

List(列表)

Redis 列表是簡單的字符串列表,按照插入順序排序。你能夠添加一個元素導列表的頭部(左邊)或者尾部(右邊)。
複製代碼
127.0.0.1:6379> lpush students liubing
(integer) 1
127.0.0.1:6379> lpush students zhangjie zsq
(integer) 3
127.0.0.1:6379> lpush students siqing
(integer) 4
127.0.0.1:6379> llen students
(integer) 4
127.0.0.1:6379> lrange students 0 3
1) "siqing"
2) "zsq"
3) "zhangjie"
4) "liubing"
複製代碼

列表最多可存儲 232 - 1 元素 (4294967295, 每一個列表可存儲40多億)。

Set(集合)

Redis的Set是string類型的無序集合。

集合是經過哈希表實現的,因此添加,刪除,查找的複雜度都是O(1)。

sadd 命令

添加一個string元素到,key對應的set集合中,成功返回1,若是元素以及在集合中返回0,key對應的set不存在返回錯誤。

複製代碼
sadd key member
實例
redis 127.0.0.1:6379> sadd redis.net.cn redis
(integer) 1
redis 127.0.0.1:6379> sadd redis.net.cn mongodb
(integer) 1
redis 127.0.0.1:6379> sadd redis.net.cn rabitmq
(integer) 1
redis 127.0.0.1:6379> sadd redis.net.cn rabitmq
(integer) 0
redis 127.0.0.1:6379> smembers redis.net.cn
 
1) "rabitmq"
2) "mongodb"
3) "redis"
複製代碼

注意:以上實例中 rabitmq 添加了兩次,但根據集合內元素的惟一性,第二次插入的元素將被忽略。

集合中最大的成員數爲 232 - 1 (4294967295, 每一個集合可存儲40多億個成員)。

zset(sorted set:有序集合)

Redis zset 和 set 同樣也是string類型元素的集合,且不容許重複的成員。

不一樣的是每一個元素都會關聯一個double類型的分數。redis正是經過分數來爲集合中的成員進行從小到大的排序。

zset的成員是惟一的,但分數(score)卻能夠重複。

zadd 命令

添加元素到集合,元素在集合中存在則更新對應score

zadd key score member 

實例

複製代碼
redis 127.0.0.1:6379> zadd redis.net.cn 0 redis
(integer) 1
redis 127.0.0.1:6379> zadd redis.net.cn 0 mongodb
(integer) 1
redis 127.0.0.1:6379> zadd redis.net.cn 0 rabitmq
(integer) 1
redis 127.0.0.1:6379> zadd redis.net.cn 0 rabitmq
(integer) 0
redis 127.0.0.1:6379> ZRANGEBYSCORE redis.net.cn 0 1000
 
1) "redis"
2) "mongodb"
3) "rabitmq"
複製代碼

 ####################################################################################

redis多實例介紹

接上一篇redis、建立數據存放的目錄

vim redis.conf +187
dir /application/data/

從新啓動

mkdir /application/data/
redis-cli shutdown
redis-server /application/redis/conf/redis.conf &
複製代碼
[root@redis01 conf]# redis-cli
127.0.0.1:6379> auth zsq
OK
127.0.0.1:6379> keys *
(empty list or set)
127.0.0.1:6379> set names sisi
OK
127.0.0.1:6379> get sisi
(nil)
127.0.0.1:6379> save
[34960] 03 Dec 20:29:54.318 * DB saved on disk
OK
127.0.0.1:6379> quit
[root@redis01 conf]# ll /application/data/
總用量 4
-rw-r--r-- 1 root root 32 12月  3 20:29 dump.rdb
複製代碼

Redis AUTH命令是用來向服務器驗證給定的密碼。 若是密碼與在配置文件中的口令相匹配,則服務器會返回OK狀態碼,並開始接受命令。不然,將返回一個錯誤,而且客戶須要嘗試新的密碼。

在配置文件中指定的密碼

requirepass zsq

建立實例

複製代碼
[root@redis01 conf]# mkdir /data/6380/data -p
[root@redis01 conf]# mkdir /data/6381/data -p
[root@redis01 conf]# cp redis.conf /data/6380/
[root@redis01 conf]# cp redis.conf /data/6381/
[root@redis01 conf]# cd /data/6380
[root@redis01 6380]# ll
總用量 36
drwxr-xr-x 2 root root  4096 12月  3 20:35 data
-rw-r--r-- 1 root root 31236 12月  3 20:35 redis.conf
複製代碼

跟源文件對比,兩個實例修改如下對應的幾項

複製代碼
[root@redis01 6380]# diff redis.conf /application/redis/conf/redis.conf 
41c41
< pidfile /data/6380/redis.pid
---
> pidfile /var/run/redis.pid
45c45
< port 6380
---
> port 6379
187c187
< dir /data/6380/data/
---
> dir /application/data/
449c449
< appendonly yes  #開啓這項是記錄持久化日誌
---
> appendonly no   
複製代碼

開啓6380

[root@redis01 6380]# redis-server /data/6380/redis.conf &
[root@redis01 6380]# lsof -i :6380
COMMAND     PID USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
redis-ser 35011 root    4u  IPv6 2604853      0t0  TCP *:6380 (LISTEN)
redis-ser 35011 root    5u  IPv4 2604855      0t0  TCP *:6380 (LISTEN)

測試

複製代碼
[root@redis01 6380]# redis-cli -p 6380
127.0.0.1:6380> auth zsq
OK
127.0.0.1:6380> set name oldgirl
OK
127.0.0.1:6380> get name
"oldgirl"
127.0.0.1:6380> save
[35011] 03 Dec 20:51:25.324 * DB saved on disk
OK
127.0.0.1:6380> quit
[root@redis01 6380]# ll data/
總用量 8
-rw-r--r-- 1 root root 109 12月  3 20:51 appendonly.aof  
-rw-r--r-- 1 root root  34 12月  3 20:51 dump.rdb  #要save纔有這個文件
appendonly.aof 文件記錄的操做記錄
[root@redis01 6380]# cat data/appendonly.aof 
*2
$6
SELECT
$1
0
*3
$3
Set
複製代碼

開啓6381

redis-server /data/6381/redis.conf &
[root@redis01 6380]# lsof -i :6381
COMMAND     PID USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
redis-ser 35034 root    4u  IPv6 2609259      0t0  TCP *:6381 (LISTEN)
redis-ser 35034 root    5u  IPv4 2609261      0t0  TCP *:6381 (LISTEN)

 redis複製

        複製

Redis複製很簡單易用,它經過配置容許slave Redis Servers或者Master Servers的複製品。接下來有幾個關於redis複製的很是重要特性:

一個Master能夠有多個Slaves。

Slaves能接受其餘slave的連接,除了能夠接受同一個master下面slaves的連接之外,還能夠接受同一個結構圖中的其餘slaves的連接。

redis複製是在master段是非阻塞的,這就意味着master在同一個或多個slave端執行同步的時候還能夠接受查詢。

複製在slave端也是非阻塞的,假設你在redis.conf中配置redis這個功能,當slave在執行的新的同步時,它仍能夠用舊的數據信息來提供查詢,不然,你能夠配置當redis slaves去master失去聯繫是,slave會給客戶端發送一個錯誤。

爲了有多個slaves能夠作只讀查詢,複製能夠重複2次,甚至屢次,具備可擴展性(例如:slaves對話與重複的排序操做,有多份數據冗餘就相對簡單了)。

經過複製能夠避免master全量寫硬盤的消耗:只要配置 master 的配置文件redis.conf來「避免保存」(註釋掉全部」save」命令),而後鏈接一個用來持久化數據的slave便可。可是這樣要確保masters 不會自動重啓(更多內容請閱讀下段)

redis複製是怎麼進行工做

若是設置了一個slave,無論是在第一次連接仍是從新連接master的時候,slave會發送一個同步命令 sync,而後master開始後臺保存,收集全部對修改數據的命令。當後臺保存完成,master會將這個數據文件傳送到slave,而後保存在磁盤,加載到內存中;master接着發送收集到的全部的修改數據的命令,這比如一個流命令,是redis協議自己來實現的。

你能夠本身經過遠程登陸來進行嘗試,當服務器在作一些工做併發送同步命令的時候連接到redis端口,你將會看到大量的數據傳輸,而後收到的每一個命令會顯示在遠程登陸的會話中。

當master和slave因一些故障當機時,slaves會自動的重鏈,若是master收到多個slave的同步請求,master會執行一個後臺保存,以確保全部的slaves都是正常的。

當master和slave可以維持連接,就會有一個完整的同步進行。

redis主從同步實戰

開啓兩個實例,指定端口,有密碼的指定密碼

cd /data/6380

配置文件redis.conf搜索REPLICATION關鍵字

slaveof 192.168.179.161 6379
masterauth zsq

從新啓動

redis-cli -p 6380 -a zsq shutdown

啓動的時候會有同步信息輸出,如master的IP,端口等信息

主庫也有信息輸出

從庫對主庫也有個ping的操做過程,每隔10秒發送一個PING,確認是否OK

monitor相似tcpdump,能夠監控其操做

在主庫操做

從庫能夠看到其輸出信息

查看從庫的數據同步狀況

Slave的幾個參數

Slave是不能寫數據的

默認檢測是10秒

若是連不上的時候,主庫是經過backlog來實現slave庫的增量同步,如下參數是其大小

Backlog的生成期,當主庫和slave鏈接斷開的時候,backlog在內存裏多長時間釋放

優先級,給不一樣的slave優先級,主庫宕機把哪一個slave提高爲主

查看redis的狀態信息

同步狀態信息

CPU狀態信息

info是查看所有的狀態 ,內存,客戶端鏈接等等

服務端master的信息,主從,cpu等

相關文章
相關標籤/搜索