欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

總結(jié)redis第三部分(安全性、主從、哨兵、事物、持久化、發(fā)布與訂閱、虛擬內(nèi)存)

八、redis的安全性

  因?yàn)閞edis速度相當(dāng)快,所以在一臺(tái)比較好的服務(wù)器下,一個(gè)外部用戶在一秒內(nèi)可以進(jìn)行15W次的密碼嘗試,這意味著需要設(shè)定非常強(qiáng)大的密碼來(lái)防止暴力破解。

創(chuàng)新互聯(lián)建站是專業(yè)的呼蘭網(wǎng)站建設(shè)公司,呼蘭接單;提供網(wǎng)站制作、成都網(wǎng)站設(shè)計(jì),網(wǎng)頁(yè)設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行呼蘭網(wǎng)站開發(fā)網(wǎng)頁(yè)制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛(ài)的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來(lái)合作!

  可以通過(guò)設(shè)置密碼以及登錄redis方式來(lái)操作,具體參考

總結(jié)redis第三部分(安全性、主從、哨兵、事物、持久化、發(fā)布與訂閱、虛擬內(nèi)存)

 



九、redis主從復(fù)制

9、1簡(jiǎn)介

 

1、Master可以擁有多個(gè)slave。

2、多個(gè)slave可以連接同一個(gè)master外,還可以連接到其他的slave。

3、主從復(fù)制不會(huì)阻塞master,在同步數(shù)據(jù)時(shí),master可以繼續(xù)處理client請(qǐng)求。

4、提供系統(tǒng)的伸縮性。

 

9、2主從復(fù)制過(guò)程

 

1、slave與master建立連接,發(fā)送sync同步命令。

2、master會(huì)開啟一個(gè)后臺(tái)進(jìn)程,將數(shù)據(jù)庫(kù)快照保存到文件中,同時(shí)master主進(jìn)程會(huì)開始收集新的寫命令并緩存。

3、master后臺(tái)完成保存后,就把文件發(fā)送給slave。

4、slave將接收到的master文件保存到磁盤上。

 

9、3主從復(fù)制配置

 

#現(xiàn)在使用同一臺(tái)機(jī)器的不同配置模擬主從復(fù)制場(chǎng)景。
root@redis conf]# pwd 
/application/redis/conf
[root@redis conf]# ls
appendonly.aof dump.rdb  redis.conf
[root@redis conf]# cd ..
[root@redis redis]# cp -a conf conf-slave
#下述為從節(jié)點(diǎn)
[root@redis redis]# cd conf-slave/
[root@redis conf-slave]# ls
appendonly.aof dump.rdb  redis.conf
 
#設(shè)置從節(jié)點(diǎn)端口
port 6380
#設(shè)置從節(jié)點(diǎn)中的文件名和路徑配置為XX-slave的形式
logfile /application/redis/logs/redis-slave.log
dir /application/redis/conf-slave/
 
#配置主節(jié)點(diǎn)的IP和端口  slaveof 10.0.0.11 6379
#配置主節(jié)點(diǎn)的密碼(redis4.0主節(jié)點(diǎn)的redis.conf也要配置)   masterauth redis
 
#設(shè)置防火墻關(guān)閉狀態(tài)
[root@redis conf-slave]# /etc/init.d/iptables stop
[root@redis conf-slave]# /etc/init.d/iptables status
iptables: Firewall is not running.
 
#可使用info查看role角色,即可知道是主服務(wù)或從服務(wù)。

 

 

9、4分別啟動(dòng)redis主從節(jié)點(diǎn)測(cè)試

#主節(jié)點(diǎn)
[root@redis ~]# redis-server/application/redis/conf/redis.conf
[root@redis ~]# lsof -i:6379
COMMAND    PIDUSER   FD   TYPE DEVICE SIZE/OFF NODE NAME
redis-ser 2456 root   4u  IPv6  16205     0t0  TCP *:6379 (LISTEN)
redis-ser 2456 root   5u  IPv4  16207     0t0  TCP *:6379 (LISTEN)
[root@redis ~]# cd /application/redis/logs/
[root@redis logs]# ll
total 1780
-rw-r--r-- 1 root root 1751493 Dec  8 02:09 redis.log
-rw-r--r-- 1 root root  59765 Dec  8 02:09 redis-slave.log
[root@redis logs]# tailf redis.log 
2456:M 08 Dec 02:08:46.338 - Accepted 10.0.0.11:17586
2456:M 08 Dec 02:08:47.345 - Accepted 10.0.0.11:17587
2456:M 08 Dec 02:08:48.352 - Accepted 10.0.0.11:17588
2456:M 08 Dec 02:08:49.076 - 0 clients connected (0slaves), 758544 bytes in use
 
#從節(jié)點(diǎn)
[root@redis ~]# redis-server/application/redis/conf-slave/redis.conf 
[root@redis ~]# lsof -i:6380
COMMAND    PIDUSER   FD   TYPE DEVICE SIZE/OFF NODE NAME
redis-ser 2460 root   4u  IPv6  16216     0t0  TCP *:6380 (LISTEN)
redis-ser 2460 root   5u  IPv4  16218     0t0  TCP *:6380 (LISTEN)
[root@redis ~]# cd /application/redis/logs/
[root@redis logs]# ll
total 1724
-rw-r--r-- 1 root root 1741206 Dec  8 02:06 redis.log
-rw-r--r-- 1 root root  15808 Dec  8 02:06 redis-slave.log
 
#從節(jié)點(diǎn)日志如果出現(xiàn)下述情況的話,那么需要把redis.conf文件中的bind 127.0.0.1注釋掉。這種情況在多臺(tái)機(jī)器中會(huì)出現(xiàn),現(xiàn)在單臺(tái)機(jī)器模擬是不會(huì)出現(xiàn)的,因?yàn)閞edis采用的安全策略是默認(rèn)只允許本地訪問(wèn),所以現(xiàn)在在同一臺(tái)機(jī)器中測(cè)試就不用注釋掉,redis.conf的具體參數(shù)參考“4、3、4redis.conf文件配置說(shuō)明”。
[root@redis logs]# tailf redis-slave.log 
2460:S 08 Dec 02:09:49.164 # Error condition on socketfor SYNC: Broken pipe
2460:S 08 Dec 02:09:50.168 - 0 clients connected (0slaves), 758544 bytes in use
2460:S 08 Dec 02:09:50.180 * Connecting to MASTER10.0.0.11:6379
2460:S 08 Dec 02:09:50.181 * MASTER <-> SLAVE syncstarted
2460:S 08 Dec 02:09:50.181 * Non blocking connect forSYNC fired the event.
#可以發(fā)現(xiàn)從節(jié)點(diǎn)沒(méi)有連接成功,那么需要設(shè)置從節(jié)點(diǎn)對(duì)應(yīng)的redis.conf文件的bind值。
[root@redis conf-slave]# lsof -i:6380
COMMAND    PIDUSER   FD   TYPE DEVICE SIZE/OFF NODE NAME
redis-ser 2460 root   4u  IPv6  16216     0t0  TCP *:6380 (LISTEN)
redis-ser 2460 root   5u  IPv4  16218     0t0  TCP *:6380 (LISTEN)
[root@redis conf-slave]# redis-cli -a shutdown -p 6380shutdown
[root@redis conf-slave]# lsof -i:6380
[root@redis conf-slave]# pwd
/application/redis/conf-slave
bind 127.0.0.1
 
 
#主節(jié)點(diǎn)設(shè)置值
[root@redis ~]# redis-cli -a redis -p 6379
127.0.0.1:6379> keys *
(empty list or set)
127.0.0.1:6379> set name nameval
OK
127.0.0.1:6379> get name
"nameval"
[root@redis logs]# pwd
/application/redis/logs
[root@redis logs]# tailf redis.log
2506:M 08 Dec 02:21:33.242 - Accepted 127.0.0.1:36324
2506:M 08 Dec 02:21:33.584 - 1 clients connected (1slaves), 1848864 bytes in use
2506:M 08 Dec 02:21:38.616 - DB 0: 1 keys (0 volatile) in4 slots HT.
127.0.0.1:6379> del name
(integer) 1
127.0.0.1:6379> keys *
1) "name2"
 
 
#從節(jié)點(diǎn)獲取值
[root@redis ~]# redis-cli -a redis -p 6380 
127.0.0.1:6380> keys *
(empty list or set)
127.0.0.1:6380> keys *
1) "name"
127.0.0.1:6380> get name
"nameval"
2512:S 08 Dec 02:19:28.089 * Background AOF rewritefinished successfully
2512:S 08 Dec 02:19:28.089 - Background AOF rewritesignal handler took 236us
2512:S 08 Dec 02:19:32.915 - 1 clients connected (0slaves), 779440 bytes in use
2512:S 08 Dec 02:21:38.716 - DB 0: 1 keys (0 volatile) in4 slots HT.
2512:S 08 Dec 02:21:38.717 - 2 clients connected (0slaves), 800536 bytes in use

 

#注意從節(jié)點(diǎn)是沒(méi)有寫操作的,只有讀操作

127.0.0.1:6380> del name
(error) READONLY You can't write against a read onlyslave.
127.0.0.1:6380> keys *
1) "name2"
 
#通過(guò)監(jiān)控查看
#主節(jié)點(diǎn)做監(jiān)控
[root@redis logs]# redis-cli -a redis -p 6379 monitor
OK
127.0.0.1:6379> flushall
OK
127.0.0.1:6379> keys *
(empty list or set)
[root@redis logs]# redis-cli -a redis -p 6379 monitor
OK
1481135598.941742 [0 127.0.0.1:36324]"flushall"
1481135634.460910 [0 127.0.0.1:36324]"keys""*"
127.0.0.1:6379> set name nameval
OK
127.0.0.1:6379> get name
"nameval"
[root@redis logs]# redis-cli -a redis -p 6379 monitor
OK
1481135697.418957 [0 127.0.0.1:36324]"set""name""nameval"
1481135698.642795 [0 127.0.0.1:36324]"get""name"
 
#從節(jié)點(diǎn)做監(jiān)控
[root@redis conf-slave]# redis-cli -a redis -p 6380monitor
OK
127.0.0.1:6380> keys *
(empty list or set)
[root@redis conf-slave]# redis-cli -a redis -p 6380monitor
OK
1481135598.306657 [0 10.0.0.11:6379] "PING"
1481135598.947041 [0 10.0.0.11:6379] "flushall"
1481135608.370998 [0 10.0.0.11:6379] "PING"
1481135618.428639 [0 10.0.0.11:6379] "PING"
1481135628.493744 [0 10.0.0.11:6379] "PING"
1481135638.562807 [0 10.0.0.11:6379] "PING"
1481135648.730527 [0 10.0.0.11:6379] "PING"
1481135658.800544 [0 10.0.0.11:6379] "PING"
1481135663.809136 [0 127.0.0.1:62476]"keys""*"
1481135668.860633 [0 10.0.0.11:6379] "PING"
[root@redis conf-slave]# redis-cli -a redis -p 6380monitor
OK
1481135688.972458 [0 10.0.0.11:6379] "PING"
1481135697.422176 [0 10.0.0.11:6379]"set""name""nameval"
1481135699.036100 [0 10.0.0.11:6379] "PING"
127.0.0.1:6380> keys *
1) "name"
127.0.0.1:6380> get name
"nameval"
[root@redis conf-slave]# redis-cli -a redis -p 6380monitor
OK
1481135747.385987 [0 127.0.0.1:62476]"keys""*"
1481135749.378369 [0 10.0.0.11:6379] "PING"
1481135750.203089 [0 127.0.0.1:62476]"get""name"
1481135759.444582 [0 10.0.0.11:6379] "PING"

 

9、5查看主從節(jié)點(diǎn)信息

#主節(jié)點(diǎn)
127.0.0.1:6379> info Replication
# Replication
role:master
connected_slaves:1
slave0:ip=127.0.0.1,port=6380,state=online,offset=2256,lag=0
master_repl_offset:2256
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:2255
 
# Replication是通過(guò)info查看節(jié)點(diǎn)信息中的一部分
 
#從節(jié)點(diǎn)
127.0.0.1:6380> info Replication
# Replication
role:slave
master_host:10.0.0.11
master_port:6379
master_link_status:up
master_last_io_seconds_ago:6
master_sync_in_progress:0
slave_repl_offset:2326
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0

 

十、哨兵模式

10、1簡(jiǎn)介

  有了主從復(fù)制以后,如果想對(duì)主從復(fù)制服務(wù)器進(jìn)行監(jiān)控,那么在redis2.6以后提供了一個(gè)“哨兵”的機(jī)制,在2.6版本中的哨兵為1.0版本并不穩(wěn)定,會(huì)出現(xiàn)各種各種的問(wèn)題,在redis2.8版本以后的哨兵功能才穩(wěn)定起來(lái)。

  顧名思義,哨兵的含義就是監(jiān)控redis系統(tǒng)的運(yùn)行狀況,其功能主要有兩點(diǎn):

監(jiān)控主數(shù)據(jù)庫(kù)和從數(shù)據(jù)庫(kù)是否正常運(yùn)行。

2、主數(shù)據(jù)庫(kù)出現(xiàn)故障時(shí),可以自動(dòng)將從數(shù)據(jù)庫(kù)轉(zhuǎn)換為主數(shù)據(jù)庫(kù),實(shí)現(xiàn)自動(dòng)切換。

  一個(gè)節(jié)點(diǎn)可以被多個(gè)哨兵去監(jiān)控。哨兵跟所有redis節(jié)點(diǎn)是沒(méi)有直接關(guān)系的,哨兵只是一個(gè)監(jiān)控程序而已。

(可以使用keepalived(配合nginx使用)代替哨兵,實(shí)現(xiàn)高可用。)

 

10、2操作步驟

 

#(只配主節(jié)點(diǎn)即可)

#配置sentinel.conf

[root@redis redis-3.2.5]# pwd
/home/lly/tools/redis-3.2.5
#拷貝到從節(jié)點(diǎn)目錄下
[root@redis redis-3.2.5]# cp sentinel.conf/application/redis/conf-slave/
[root@redis redis-3.2.5]# cp /application/redis/conf-slave/sentinel.conf/application/redis/conf-slave/sentinel.conf.ori
[root@redis redis-3.2.5]# vim/application/redis/conf-slave/sentinel.conf
sentinel monitor mymaster 127.0.0.1 6379 1  #名稱,IP,端口,投票選舉次數(shù)建議為1,多臺(tái)機(jī)器記得設(shè)置master的內(nèi)網(wǎng)IP(內(nèi)部系統(tǒng)交互用內(nèi)網(wǎng)IP,外部訪問(wèn)提供外網(wǎng)IP)。
sentinel down-after-milliseconds mymaster 5000  #設(shè)置5000毫秒檢測(cè)一次,默認(rèn)1秒
sentinel failover-timeout mymaster 900000
sentinel parallel-syncs mymaster 2
sentinel auth-pass mymaster redis       #主節(jié)點(diǎn)密碼(節(jié)點(diǎn)redis.conf中未配置密碼,那么此步省略)

 

#測(cè)試第一步

#啟動(dòng)哨兵模式,注意下面的命令中不要加-a redis –p 6380
[root@redis conf-slave]# redis-server sentinel.conf--sentinel &
 
[root@redis ~]# lsof -i:26379
COMMAND    PIDUSER   FD   TYPE DEVICE SIZE/OFF NODE NAME
redis-ser 2650 root   4u  IPv6  19430     0t0  TCP *:26379 (LISTEN)
redis-ser 2650 root   5u  IPv4  19432     0t0  TCP *:26379 (LISTEN)
 
#查看哨兵相關(guān)信息
[root@redis ~]# redis-cli -p 26379 info Sentinel                                             
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=127.0.0.1:6379,slaves=1,sentinels=1
 
#主節(jié)點(diǎn)日志
[root@redis ~]# tailf /application/redis/logs/redis.log
1481137928.553897 [0 127.0.0.1:36329] "PING"
1481137929.589836 [0 127.0.0.1:36329] "PING"
1481137929.763963 [0 127.0.0.1:36329]"PUBLISH""__sentinel__:hello""127.0.0.1,26379,a14563baa663afc1c2e06ee3cb07f222c220fd7b,0,mymaster,127.0.0.1,6379,0"

 

#測(cè)試第二步

#關(guān)閉主節(jié)點(diǎn)
[root@redis ~]# redis-cli -a redis -p 6379 shutdown
#從節(jié)點(diǎn)日志
[root@redis conf-slave]# tailf/application/redis/logs/redis-slave.log
2574:S 08 Dec 03:15:16.629 * MASTER <-> SLAVE syncstarted
2574:S 08 Dec 03:15:16.629 # Error condition on socketfor SYNC: Connection refused
2574:M 08 Dec 03:15:17.016 * Discarding previously cachedmaster state.
2574:M 08 Dec 03:15:17.016 * MASTER MODE enabled (userrequest from 'id=5 addr=127.0.0.1:62481 fd=7 name=sentinel-a14563ba-cmd age=320idle=0 flags=x db=0 sub=0 psub=0 multi=3 qbuf=0 qbuf-free=32768 obl=36 oll=0omem=0 events=r cmd=exec')
2574:M 08 Dec 03:15:17.020 # CONFIG REWRITE executed withsuccess.
2574:M 08 Dec 03:15:17.048 * 1 changes in 900 seconds.Saving...
2574:M 08 Dec 03:15:17.050 * Background saving started bypid 2712
2712:C 08 Dec 03:15:17.067 * DB saved on disk
2712:C 08 Dec 03:15:17.068 * RDB: 6 MB of memory used bycopy-on-write
2574:M 08 Dec 03:15:17.150 * Background saving terminatedwith success
2574:M 08 Dec 03:15:17.980 - Client closed connection
2574:M 08 Dec 03:15:17.981 - Client closed connection
2574:M 08 Dec 03:15:18.069 - Accepted 127.0.0.1:62499
2574:M 08 Dec 03:15:18.070 - Accepted 127.0.0.1:62500
2574:M 08 Dec 03:15:20.671 - DB 0: 1 keys (0 volatile) in4 slots HT.
2574:M 08 Dec 03:15:20.672 - 2 clients connected (0slaves), 800816 bytes in use
2574:M 08 Dec 03:15:25.705 - DB 0: 1 keys (0 volatile) in4 slots HT.
2574:M 08 Dec 03:15:25.705 - 2 clients connected (0slaves), 800800 bytes in use
 
#查看此時(shí)的哨兵信息
[root@redis ~]# redis-cli -p 26379 info Sentinel    
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=127.0.0.1:6380,slaves=1,sentinels=1
 
#原從節(jié)點(diǎn)info信息(現(xiàn)在是主節(jié)點(diǎn))
127.0.0.1:6380> info Replication
# Replication
role:master
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
 
#原主節(jié)點(diǎn)info信息(現(xiàn)在是從節(jié)點(diǎn))
127.0.0.1:6379> info Replication
Could not connect to Redis at 127.0.0.1:6379: Connectionrefused
not connected>

 

 

#測(cè)試第三步

#啟動(dòng)原主節(jié)點(diǎn)(現(xiàn)在是從節(jié)點(diǎn))
[root@redis ~]# redis-server/application/redis/conf/redis.conf
 
#查看哨兵切換日志,從節(jié)點(diǎn)切換到了原主節(jié)點(diǎn)6379
[root@redis conf-slave]# redis-server sentinel.conf--sentinel &
2650:X 08 Dec 03:15:17.980 #+failover-end master mymaster 127.0.0.1 6379
2650:X 08 Dec 03:15:17.980 #+switch-master mymaster 127.0.0.1 6379 127.0.0.1 6380
2650:X 08 Dec 03:15:17.981 *+slave slave 127.0.0.1:6379 127.0.0.1 6379 @ mymaster 127.0.0.1 6380
2650:X 08 Dec 03:18:07.759 *+convert-to-slave slave 127.0.0.1:6379 127.0.0.1 6379 @ mymaster 127.0.0.1 6380
 
#原主節(jié)點(diǎn)日志(現(xiàn)在是從節(jié)點(diǎn))
[root@redis ~]# tailf /application/redis/logs/redis.log
2574:M 08 Dec 03:18:08.674 * Background saving terminatedwith success
2574:M 08 Dec 03:18:08.679 * Synchronization with slave127.0.0.1:6379 succeeded
2574:M 08 Dec 03:18:11.903 - DB 0: 1 keys (0 volatile) in4 slots HT.
2574:M 08 Dec 03:18:11.903 - 3 clients connected (1slaves), 1891152 bytes in use
2574:M 08 Dec 03:18:16.932 - DB 0: 1 keys (0 volatile) in4 slots HT.
2574:M 08 Dec 03:18:16.932 - 3 clients connected (1slaves), 1891136 bytes in use
 
#原主節(jié)點(diǎn)info信息(現(xiàn)在是從節(jié)點(diǎn))變成從節(jié)點(diǎn)信息
not connected> info Replication
# Replication
role:slave
master_host:127.0.0.1
master_port:6380
master_link_status:up
master_last_io_seconds_ago:0
master_sync_in_progress:0
slave_repl_offset:2061
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
 
#原從節(jié)點(diǎn)info信息(現(xiàn)主節(jié)點(diǎn)),變成了主節(jié)點(diǎn)信息
127.0.0.1:6380> info Replication
# Replication
role:master
connected_slaves:1
slave0:ip=127.0.0.1,port=6379,state=online,offset=5736,lag=0
master_repl_offset:5736
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:5735

 

 

 

十一、事務(wù)

10、1redis簡(jiǎn)單事務(wù)一

  首先是使用multi打開事務(wù),然后進(jìn)行設(shè)置,這時(shí)設(shè)置的數(shù)據(jù)都會(huì)放入隊(duì)列里進(jìn)行保存,最后使用exec執(zhí)行,把數(shù)據(jù)依次存儲(chǔ)到redis中,可以使用discard方法取消事務(wù)。

 

 

#multi
標(biāo)記一個(gè)事務(wù)塊的開始。隨后的指令將在執(zhí)行EXEC時(shí)作為一個(gè)原子執(zhí)行。
返回值
simple-string-reply: 始終為OK
 
#exec
執(zhí)行事務(wù)中所有在排隊(duì)等待的指令并將鏈接狀態(tài)恢復(fù)到正常當(dāng)使用WATCH 時(shí),只有當(dāng)被監(jiān)視的鍵沒(méi)有被修改,且允許檢查設(shè)定機(jī)制時(shí),EXEC會(huì)被執(zhí)行
返回值
multi-bulk-reply: 每個(gè)元素與原子事務(wù)中的指令一一對(duì)應(yīng)當(dāng)使用WATCH時(shí),如果被終止,EXEC 則返回一個(gè)空的應(yīng)答集合
 
#discard
刷新一個(gè)事務(wù)中所有在排隊(duì)等待的指令,并且將連接狀態(tài)恢復(fù)到正常。
如果已使用WATCH,DISCARD將釋放所有被WATCH的key。
返回值
status-reply:所有返回都是 OK
 
#watch(鎖定key,直到執(zhí)行了multi/exec命令)
標(biāo)記所有指定的key 被監(jiān)視起來(lái),在事務(wù)中有條件的執(zhí)行(樂(lè)觀鎖)。
返回值
simple-string-reply: 總是 OK。
 
#unwatch(取消事務(wù)命令)
刷新一個(gè)事務(wù)中已被監(jiān)視的所有key。
如果執(zhí)行EXEC 或者DISCARD, 則不需要手動(dòng)執(zhí)行UNWATCH 。
返回值
simple-string-reply: 總是 OK。
 
127.0.0.1:6379> keys *
1) "age"
127.0.0.1:6379> get age
"11"
127.0.0.1:6379> multi
OK
127.0.0.1:6379> incr age
QUEUED
127.0.0.1:6379> exec
1) (integer) 12
127.0.0.1:6379> get age
"12"
127.0.0.1:6379> multi
OK
127.0.0.1:6379> incr age
QUEUED
127.0.0.1:6379> discard
OK
127.0.0.1:6379> get age
"12"
 
127.0.0.1:6379> keys *
1) "age"
127.0.0.1:6379> get age
"13"
127.0.0.1:6379> multi
OK
127.0.0.1:6379> incr age
QUEUED
127.0.0.1:6379> get age
QUEUED
127.0.0.1:6379> exec
1) (integer) 14
2) "14"
127.0.0.1:6379> unwatch
OK
127.0.0.1:6379> get age
"14"
 
127.0.0.1:6379> get age
"14"
127.0.0.1:6379> multi
OK
127.0.0.1:6379> incr age
QUEUED
127.0.0.1:6379> unwatch
QUEUED
127.0.0.1:6379> get age
QUEUED
127.0.0.1:6379> exec
1) (integer) 15
2) OK
3) "15"
 
127.0.0.1:6379> watch age
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> incr age
QUEUED
127.0.0.1:6379> unwatch
QUEUED
127.0.0.1:6379> discard
OK
127.0.0.1:6379> get age
"15"

 

 

10、2redis簡(jiǎn)單事務(wù)二

Redis的事務(wù)不能保證同時(shí)成功或失敗進(jìn)行提交或回滾,所以redis的事務(wù)目前還是比較簡(jiǎn)單的(程序中一般是不會(huì)使用redis事務(wù)的)。

 

127.0.0.1:6379> keys *
1) "age"
127.0.0.1:6379> get age
"15"
127.0.0.1:6379> set name nameval
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> incr age
QUEUED
#注意incr name并沒(méi)報(bào)錯(cuò),是在執(zhí)行exec命令時(shí)報(bào)錯(cuò),這個(gè)incr命令在java中調(diào)用是報(bào)錯(cuò)的。
127.0.0.1:6379> incr name
QUEUED
#下述雖然報(bào)錯(cuò),但是事務(wù)已提交,name沒(méi)有改變。如果下述執(zhí)行discard命令中斷事務(wù)的話,對(duì)所有的值都不會(huì)有影響。
127.0.0.1:6379> exec
1) (integer) 16
2) (error) ERR value is not an integer or out of range
127.0.0.1:6379> get age
"16"
127.0.0.1:6379> get name
"nameval"

 

十二、持久化機(jī)制

 

Redis是一個(gè)支持持久化的內(nèi)存數(shù)據(jù)庫(kù),也就是說(shuō)redis需要經(jīng)常將內(nèi)存中的數(shù)據(jù)同步到硬盤來(lái)保證持久化。Redis持久化的方式有以下兩種。

 

12、1快照RDB文件方式

snapshotting(快照)默認(rèn)方式,將內(nèi)存中以快照的方式寫入到二進(jìn)制文件中,默認(rèn)為dump.rdb,可以通過(guò)配置設(shè)置自動(dòng)做快照持久化的方式,我們可以配置redis在N秒內(nèi)如果超過(guò)M個(gè)key修改,那么就自動(dòng)做快照。

快照設(shè)置:

save 900 1  #900秒內(nèi)如果超過(guò)1個(gè)key被修改,則發(fā)起快照保存。下述同理。

save 300 10

save 60 10000

 

 

12、2AOF文件方式

append-only file(縮寫aof)的方式(有點(diǎn)類似于oracle日志),由于快照方式是在一定時(shí)間間隔做一次,所以可能發(fā)生redis意外down的清苦康就會(huì)丟失最后一次快照后的所有修改的數(shù)據(jù),aof比快照方式有更好的持久化性,是由于在使用aof時(shí),redis會(huì)將每一個(gè)收到的寫命令都通過(guò)write函數(shù)追加到命令中,當(dāng)redis重啟啟動(dòng)時(shí)會(huì)重新執(zhí)行文件中保存的寫命令來(lái)在內(nèi)存中重建這個(gè)數(shù)據(jù)庫(kù)的內(nèi)容。Aof文件不是立即寫到磁盤上,可以通過(guò)配置文件修改強(qiáng)制寫到硬盤中。

aof設(shè)置:

# appendonly yes    //啟動(dòng)aof持久化方式有三種修改方式。

# appendfsync always    //受到寫命令就立即寫入到磁盤中,效率最慢,但是保證完全的持久化。(比如頁(yè)面寫入慢,可能就是這種造成的,可加服務(wù)器處理)

# appendfsync everysec  //每秒鐘寫入磁盤一次,在性能和持久化方面做了很好的折中。

# appendfsync no    //完全依賴操作系統(tǒng),性能最好,不進(jìn)行同步,系統(tǒng)去操作,持久化沒(méi)保證。

 

 

 

RDB文件和AOF文件只開其中一種即可

 

上述內(nèi)容都是在redis.conf文件中配置的,redis.conf的參數(shù)解釋詳情參考“4、3、4redis.conf配置文件說(shuō)明”。

 

十三、發(fā)布與訂閱消息

13、1簡(jiǎn)介

Redis提供了簡(jiǎn)單的發(fā)布訂閱功能。

使用subscribe [頻道]    進(jìn)行訂閱監(jiān)聽。

使用publish [頻道] [發(fā)布內(nèi)容]   進(jìn)行發(fā)布消息廣播。

 

為了解耦發(fā)布者(publisher)和訂閱者(subscribe)之間的關(guān)系,redis使用了channel(頻道)作為兩者的中介,發(fā)布者將信息直接發(fā)布給channel,而channel負(fù)責(zé)將信息發(fā)送給適當(dāng)?shù)挠嗛喺撸l(fā)布者和訂閱者直接沒(méi)有相互關(guān)系,也不知道對(duì)方的存在。

總結(jié)redis第三部分(安全性、主從、哨兵、事物、持久化、發(fā)布與訂閱、虛擬內(nèi)存)

 

參考網(wǎng)站(包括場(chǎng)景和源碼分析):

“http://blog.csdn.net/clh704/article/details/19754939”

“http://www.cnblogs.com/huangxincheng/p/5002794.html”

 

13、2操作

13、2、1一個(gè)發(fā)布,一個(gè)監(jiān)聽

#開啟兩個(gè)窗口,一個(gè)做發(fā)布,一個(gè)做監(jiān)聽。

 

#注意事項(xiàng):發(fā)布窗口的publish后面的名稱channel1一定要跟監(jiān)聽窗口中subscribe后面的名稱channel1保持一致,不然不能監(jiān)聽到消息。

 

#發(fā)布窗口
[root@redis logs]# redis-cli
127.0.0.1:6379> publish channel1 testmessage1
(integer) 1#接收到發(fā)布信息的監(jiān)聽個(gè)數(shù)
127.0.0.1:6379> publish channel1 testmessage2
(integer) 1
127.0.0.1:6379> publish channeltest testmessage
(integer) 0
 
#監(jiān)聽窗口
127.0.0.1:6379> subscribe channel1
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "channel1"
3) (integer) 1
#注意監(jiān)聽的信息是3個(gè)一組
1) "message"
2) "channel1"
3) "testmessage1"
#注意監(jiān)聽的信息是3個(gè)一組
1) "message"
2) "channel1"
3) "testmessage2"

 

13、2、2一個(gè)發(fā)布,多個(gè)監(jiān)聽
#發(fā)布部分
[root@redis logs]# redis-cli
127.0.0.1:6379> publish channel1 message1
(integer) 2
127.0.0.1:6379> publish channel1 message2
(integer) 2
 
#監(jiān)聽部分
[root@redis ~]# redis-cli
127.0.0.1:6379> subscribe channel1
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "channel1"
3) (integer) 1
1) "message"
2) "channel1"
3) "message1"
1) "message"
2) "channel1"
3) "message2"
 
[root@redis conf]# redis-cli
127.0.0.1:6379> subscribe channel1
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "channel1"
3) (integer) 1
1) "message"
2) "channel1"
3) "message1"
1) "message"
2) "channel1"
3) "message2"

 

13、2、3多個(gè)發(fā)布,多個(gè)監(jiān)聽
#發(fā)布部分
 
[root@redis logs]# redis-cli
127.0.0.1:6379> publish channel1 message11
(integer) 2
127.0.0.1:6379> publish channel1 message12
(integer) 2
 
[root@redis ~]# redis-cli
127.0.0.1:6379> publish channel2 message21
(integer) 2
127.0.0.1:6379> publish channel2 message22
(integer) 2
 
#監(jiān)聽部分
[root@redis ~]# redis-cli
127.0.0.1:6379> subscribe channel1 channel2
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "channel1"
3) (integer) 1
1) "subscribe"
2) "channel2"
3) (integer) 2
1) "message"
2) "channel1"
3) "message11"
1) "message"
2) "channel2"
3) "message21"
1) "message"
2) "channel1"
3) "message12"
1) "message"
2) "channel2"
3) "message22"
 
[root@redis conf]# redis-cli
127.0.0.1:6379> subscribe channel1 channel2
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "channel1"
3) (integer) 1
1) "subscribe"
2) "channel2"
3) (integer) 2
1) "message"
2) "channel1"
3) "message11"
1) "message"
2) "channel2"
3) "message21"
1) "message"
2) "channel1"
3) "message12"
1) "message"
2) "channel2"
3) "message22"

 

 

十四、虛擬內(nèi)存的使用

 

下述內(nèi)容參考文檔

“http://ifeve.com/redis-mem/”

“http://blog.csdn.net/xinguimeng/article/details/43884893”

“http://www.cnblogs.com/stephen-liu74/archive/2012/04/04/2366803.html”

14、1簡(jiǎn)介

和大多數(shù)NoSql數(shù)據(jù)庫(kù)一樣,redis同樣遵循了key/values數(shù)據(jù)存儲(chǔ)模型。在有些情況下,redis會(huì)將key/values保存在內(nèi)存中以提高數(shù)據(jù)查詢和數(shù)據(jù)修改的效率,然而這樣的做法并非總是很好的選擇。鑒于此,我們可以將之進(jìn)一步優(yōu)化,即盡量在內(nèi)存中只保留keys的數(shù)據(jù),這樣可以保證數(shù)據(jù)檢索的效率,而values數(shù)據(jù)在很少使用的時(shí)候可以被換出到磁盤。

redis未使用linux的虛擬內(nèi)存機(jī)制,而是實(shí)現(xiàn)了自己的虛擬內(nèi)存機(jī)制,主要原因有以下兩點(diǎn):

1、linux虛擬內(nèi)存粒度過(guò)大,在linux中使用4KB的頁(yè)面,對(duì)于redis來(lái)說(shuō)太大了,而redis中的絕大多數(shù)對(duì)象都遠(yuǎn)遠(yuǎn)小于這個(gè)數(shù)值。

2、redis可以把數(shù)據(jù)交換到磁盤上的時(shí)候進(jìn)行適當(dāng)?shù)牟僮鳎热鐗嚎s,通常保存到磁盤上的對(duì)象可以去除指針和對(duì)象元數(shù)據(jù)信息,一般壓縮后的對(duì)象可以比內(nèi)存中的對(duì)象小10倍,這樣可以節(jié)省很多的IO操作。

14、2應(yīng)用場(chǎng)景

在實(shí)際應(yīng)用中,如果內(nèi)存中有一個(gè)10W條記錄的key數(shù)據(jù)集,而只有10%被經(jīng)常使用,那么開啟虛擬內(nèi)存的redis將把與較少使用的key相對(duì)應(yīng)的value轉(zhuǎn)移到磁盤上。當(dāng)客戶端請(qǐng)求獲取這些value時(shí),他們將被從swap文件中讀回,并載入到內(nèi)存中。也就是說(shuō),如果你的數(shù)據(jù)庫(kù)中有大量的keys,其中每個(gè)key僅僅關(guān)聯(lián)很小的value,那么這種場(chǎng)景就不是非常適合使用虛擬內(nèi)存。如果數(shù)據(jù)庫(kù)中只是包含很少的keys,而每一個(gè)key所關(guān)聯(lián)的value確非常大,那么這種場(chǎng)景就適合使用虛擬內(nèi)存。

 

14、3虛擬內(nèi)存配置

1、在配置文件中添加以下配置項(xiàng),以使當(dāng)前Redis服務(wù)器在啟動(dòng)時(shí)打開虛存功能。

vm-enabled yes

 

2、在配置文件中設(shè)定Redis最大可用的虛存字節(jié)數(shù)。如果內(nèi)存中的數(shù)據(jù)大于該值,則有部分對(duì)象被換出到磁盤中,其中被換出對(duì)象所占用內(nèi)存將被釋放,直到已用內(nèi)存小于該值時(shí)才停止換出。

vm-max-memory (bytes)

Redis的交換規(guī)則是盡量考慮"最老"的數(shù)據(jù),即最長(zhǎng)時(shí)間沒(méi)有使用的數(shù)據(jù)將被換出。如果兩個(gè)對(duì)象的age相同,那么Value較大的數(shù)據(jù)將先被換出。需要注意的是,Redis不會(huì)將Keys交換到磁盤,因此如果僅僅keys的數(shù)據(jù)就已經(jīng)填滿了整個(gè)虛存,那么這種數(shù)據(jù)模型將不適合使用虛存機(jī)制,或者是將該值設(shè)置的更大,以容納整個(gè)Keys的數(shù)據(jù)。在實(shí)際的應(yīng)用,如果考慮使用Redis虛擬內(nèi)存,我們應(yīng)盡可能的分配更多的內(nèi)存交給Redis使用,以避免頻繁的換入換出。

 

3、在配置文件中設(shè)定頁(yè)的數(shù)量及每一頁(yè)所占用的字節(jié)數(shù)。為了將內(nèi)存中的數(shù)據(jù)傳送到磁盤上,我們需要使用交換文件。這些文件與數(shù)據(jù)持久性無(wú)關(guān),Redis會(huì)在退出前會(huì)將它們?nèi)縿h除。由于對(duì)交換文件的訪問(wèn)方式大多為隨機(jī)訪問(wèn),因此建議將交換文件存儲(chǔ)在固態(tài)磁盤上,這樣可以大大提高系統(tǒng)的運(yùn)行效率。

vm-pages 134217728

vm-page-size 32   

在上面的配置中,Redis將交換文件劃分為vm-pages個(gè)頁(yè),其中每個(gè)頁(yè)所占用的字節(jié)為vm-page-size,那么Redis最終可用的交換文件大小為:vm-pages * vm-page-size。由于一個(gè)value可以存放在一個(gè)或多個(gè)頁(yè)上,但是一個(gè)頁(yè)不能持有多個(gè)value,鑒于此,我們?cè)谠O(shè)置vm-page-size時(shí)需要充分考慮Redis的該特征。

 

4、在Redis的配置文件中有一個(gè)非常重要的配置參數(shù),即:

vm-max-threads 4

該參數(shù)表示Redis在對(duì)交換文件執(zhí)行IO操作時(shí)所應(yīng)用的最大線程數(shù)量。通常而言,我們推薦該值等于主機(jī)的CPU cores。如果將該值設(shè)置為0,那么Redis在與交換文件進(jìn)行IO交互時(shí),將以同步的方式執(zhí)行此操作。

對(duì)于Redis而言,如果操作交換文件是以同步的方式進(jìn)行,那么當(dāng)某一客戶端正在訪問(wèn)交換文件中的數(shù)據(jù)時(shí),其它客戶端如果再試圖訪問(wèn)交換文件中的數(shù)據(jù),該客戶端的請(qǐng)求就將被掛起,直到之前的操作結(jié)束為止。特別是在相對(duì)較慢或較忙的磁盤上讀取較大的數(shù)據(jù)值時(shí),這種阻塞所帶來(lái)的影響就更為突兀了。然而同步操作也并非一無(wú)是處,事實(shí)上,從全局執(zhí)行效率視角來(lái)看,同步方式要好于異步方式,畢竟同步方式節(jié)省了線程切換、線程間同步,以及線程拉起等操作產(chǎn)生的額外開銷。特別是當(dāng)大部分頻繁使用的數(shù)據(jù)都可以直接從主內(nèi)存中讀取時(shí),同步方式的表現(xiàn)將更為優(yōu)異。

如果你的現(xiàn)實(shí)應(yīng)用恰恰相反,即有大量的換入換出操作,同時(shí)你的系統(tǒng)又有很多的cores,有鑒于此,你又不希望客戶端在訪問(wèn)交換文件之前不得不阻塞一小段時(shí)間,如果確實(shí)是這樣,我想異步方式可能更適合于你的系統(tǒng)。

 

至于最終選用哪種配置方式,最好的答案將來(lái)自于不斷的實(shí)驗(yàn)和調(diào)優(yōu)。

 

名稱欄目:總結(jié)redis第三部分(安全性、主從、哨兵、事物、持久化、發(fā)布與訂閱、虛擬內(nèi)存)
網(wǎng)站網(wǎng)址:http://www.chinadenli.net/article44/jdhche.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站收錄品牌網(wǎng)站制作Google軟件開發(fā)搜索引擎優(yōu)化網(wǎng)站排名

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

網(wǎng)站優(yōu)化排名