NoSQL(三):主从复制
主從復制
主從復制概述
主從復制結構模式
主從復制工作原理
- slave向master發送sync命令
- master啟動后臺存盤進程,并收集所有數據命令
- master完成后臺存盤后,傳送整個數據文件到slave
- slave接收數據文件,加載到內存中完成首次完全同步
- 后續有新數據產生時,master繼續收集數據修改命令依次傳給slave,完成同步
配置主從復制
拓撲結構
redis主從復制
- redis服務運行后,默認都是master服務器
添加一臺新的從庫服務器
[root@host53 ~]# redis-cli -h 192.168.4.53 -p 6353 shutdown [root@host53 ~]# vim +282 /etc/redis/6379.conf 282 slaveof 192.168.4.51 6351 [root@host53 ~]# /etc/init.d/redis_6379 start Starting Redis server... [root@host53 ~]# redis-cli -h 192.168.4.53 -p 6353 192.168.4.53:6353> info replication # Replication role:slave master_host:192.168.4.51 master_port:6351 master_link_status:up master_last_io_seconds_ago:3 master_sync_in_progress:0 slave_repl_offset:2119 slave_priority:100 slave_read_only:1 connected_slaves:0 master_replid:cae73fe71d7dd25494e540cc9d90776efbf321f5 master_replid2:0000000000000000000000000000000000000000 master_repl_offset:2119 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:2106 repl_backlog_histlen:14192.168.4.51:6351> info replication #在51主機上查看,有兩個從服務器 # Replication role:master connected_slaves:2 slave0:ip=192.168.4.52,port=6352,state=online,offset=2231,lag=0 slave1:ip=192.168.4.53,port=6353,state=online,offset=2231,lag=0 master_replid:cae73fe71d7dd25494e540cc9d90776efbf321f5 master_replid2:0000000000000000000000000000000000000000 master_repl_offset:2245 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:1 repl_backlog_histlen:2245配置帶驗證的主從復制
- 配置 master,設置連接密碼,重啟密碼 [root@host51 ~]# redis-cli -h 192.168.4.51 -p 6351 shutdown [root@host51 ~]# vim +501 /etc/redis/6379.conf #把51主機配置密碼501 requirepass 123456 [root@host51 ~]# /etc/init.d/redis_6379 start #啟動服務 Starting Redis server... [root@host51 ~]# redis-cli -h 192.168.4.51 -p 6351 -a 123456 192.168.4.51:6351> info replication #此時查看主從復制信息,發現51主機沒有從服務器,因為在設置的時候,從服務器不知道主服務需要密碼 # Replication role:master connected_slaves:0 master_replid:f1e42fe68a0d21458128290c548e7fe87a44ea66 master_replid2:0000000000000000000000000000000000000000 master_repl_offset:0 second_repl_offset:-1 repl_backlog_active:0 repl_backlog_size:1048576 repl_backlog_first_byte_offset:0 repl_backlog_histlen:0- 配置slave,設置連接密碼,重啟服務 [root@host52 ~]# redis-cli -h 192.168.4.52 -p 6352 shutdown #將52主機服務關閉[root@host52 ~]# vim +289 /etc/redis/6379.conf #修改配置文件,讓52主機知道主服務器的驗證密碼289 masterauth 123456[root@host52 ~]# /etc/init.d/redis_6379 start #再次重啟 Starting Redis server... [root@host52 ~]# redis-cli -h 192.168.4.52 -p 6352 192.168.4.52:6352> info replication #查看主從復制信息,此時可以看到51主的信息了 # Replication role:slave #角色,從服務器 master_host:192.168.4.51 #主庫IP地址 master_port:6351 #主庫端口 master_link_status:up #連接狀態開啟 master_last_io_seconds_ago:5 master_sync_in_progress:0 slave_repl_offset:14 slave_priority:100 slave_read_only:1 connected_slaves:0 master_replid:8ea70d98c6e9e80b7e334544a4ef3ea2bb0b2ec6 master_replid2:0000000000000000000000000000000000000000 master_repl_offset:14 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:1 repl_backlog_histlen:1453主機也做同樣的操作[root@host53 ~]# redis-cli -h 192.168.4.53 -p 6353 shutdown #關閉53主機的服務 [root@host53 ~]# vim +289 /etc/redis/6379.conf #設置密碼289 masterauth 123456 [root@host53 ~]# /etc/init.d/redis_6379 start #啟動服務 Starting Redis server... [root@host53 ~]# redis-cli -h 192.168.4.53 -p 6353 192.168.4.53:6353> info replication #查看復制信息 # Replication role:slave #角色,從服務器 master_host:192.168.4.51 #主庫IP地址 master_port:6351 #主庫端口號 master_link_status:up #與主庫連接狀態開啟 master_last_io_seconds_ago:8 master_sync_in_progress:0 slave_repl_offset:140 slave_priority:100 slave_read_only:1 connected_slaves:0 master_replid:8ea70d98c6e9e80b7e334544a4ef3ea2bb0b2ec6 master_replid2:0000000000000000000000000000000000000000 master_repl_offset:140 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:127 repl_backlog_histlen:14此時再回到51主機查看主從信息,就會發現,兩個從服務器的信息又回來了192.168.4.51:6351> info replication # Replication role:master #角色,主服務器 connected_slaves:2 #從服務器,2臺 slave0:ip=192.168.4.52,port=6352,state=online,offset=154,lag=0 #從服務器52信息 slave1:ip=192.168.4.53,port=6353,state=online,offset=154,lag=0 #從服務器53信息 master_replid:8ea70d98c6e9e80b7e334544a4ef3ea2bb0b2ec6 master_replid2:0000000000000000000000000000000000000000 master_repl_offset:154 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:1 repl_backlog_histlen:154哨兵服務
哨兵服務介紹
- 節省運維成本
- 監視master服務器
- 發現master宕機后,將從服務器升級為主服務器
- 主配置文件 sentinel.conf
- 模板文件:redis-4.0.8/sentinel.conf
拓撲結構
配置哨兵服務
54主機: [root@host54 ~]# redis-cli -h 192.168.4.54 -p 6354 192.168.4.54:6354> info replication #查看當前主從信息,此時是一個獨立的服務器,默認為主服務器 # Replication role:master connected_slaves:0 master_replid:109967e8e7e63cc0a7bb33c4dd92177496dced3f master_replid2:0000000000000000000000000000000000000000 master_repl_offset:0 second_repl_offset:-1 repl_backlog_active:0 repl_backlog_size:1048576 repl_backlog_first_byte_offset:0 repl_backlog_histlen:055主機:[root@host55 ~]# redis-cli -h 192.168.4.55 -p 6355 shutdown [root@host55 ~]# vim +282 /etc/redis/6379.conf #修改配置文件,讓55主機作為54主機的從服務器282 slaveof 192.168.4.54 6354 [root@host55 ~]# /etc/init.d/redis_6379 start Starting Redis server... [root@host55 ~]# redis-cli -h 192.168.4.55 -p 6355 192.168.4.55:6355> info replication #在55主機查看主從信息狀態,此時55主機是從的狀態 # Replication role:slave master_host:192.168.4.54 master_port:6354 master_link_status:up master_last_io_seconds_ago:5 master_sync_in_progress:0 slave_repl_offset:14 slave_priority:100 slave_read_only:1 connected_slaves:0 master_replid:2f89b8c40607cad01757fce504a876f5fc27e488 master_replid2:0000000000000000000000000000000000000000 master_repl_offset:14 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:1 repl_backlog_histlen:14192.168.4.54:6354> info replication #在54主機再次查看主從信息狀態,發現54主機多了一個從服務器 # Replication role:master connected_slaves:1 slave0:ip=192.168.4.55,port=6355,state=online,offset=336,lag=1 master_replid:2f89b8c40607cad01757fce504a876f5fc27e488 master_replid2:0000000000000000000000000000000000000000 master_repl_offset:336 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:1 repl_backlog_histlen:33656主機: [root@host56 ~]# redis-cli -h 192.168.4.56 -p 6356 shutdown [root@host56 ~]# vim +282 /etc/redis/6379.conf #修改配置文件,讓56主機作為55主機的從服務器282 slaveof 192.168.4.55 6355 [root@host56 ~]# /etc/init.d/redis_6379 start Starting Redis server... [root@host56 ~]# redis-cli -h 192.168.4.56 -p 6356 192.168.4.56:6356> info replication #查看主從信息,56主機為從服務器 # Replication role:slave master_host:192.168.4.55 master_port:6355 master_link_status:up master_last_io_seconds_ago:6 master_sync_in_progress:0 slave_repl_offset:140 slave_priority:100 slave_read_only:1 connected_slaves:0 master_replid:2f89b8c40607cad01757fce504a876f5fc27e488 master_replid2:0000000000000000000000000000000000000000 master_repl_offset:140 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:127 repl_backlog_histlen:14192.168.4.55:6355> info replication #在55主機查看狀態,發現55主機多了一個從服務器IP為192.168.4.56 # Replication role:slave master_host:192.168.4.54 master_port:6354 master_link_status:up master_last_io_seconds_ago:3 master_sync_in_progress:0 slave_repl_offset:154 slave_priority:100 slave_read_only:1 connected_slaves:1 slave0:ip=192.168.4.56,port=6356,state=online,offset=154,lag=1 master_replid:2f89b8c40607cad01757fce504a876f5fc27e488 master_replid2:0000000000000000000000000000000000000000 master_repl_offset:154 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:1 repl_backlog_histlen:154測試: 在54主機上寫入數據,則55 56主機都可以看到相應的數據54主機: 192.168.4.54:6354> set tian 111222 OK 192.168.4.54:6354> set haha 555 OK 192.168.4.54:6354> keys * 1) "haha" 2) "tian"55主機: 192.168.4.55:6355> keys * 1) "haha" 2) "tian" 192.168.4.55:6355> get tian "111222" 192.168.4.55:6355> get haha "555"56主機: 192.168.4.56:6356> keys * 1) "tian" 2) "haha" 192.168.4.56:6356> get tian "111222" 192.168.4.56:6356> get haha "555"--------------------------------------------- 配置哨兵服務器192.168.4.57- 安裝哨兵服務 - 創建主配置文件 - 啟動哨兵服務[root@host57 ~]# cd /opt [root@host57 opt]# ls mha redis-3.2.1.gem redis-4.0.8 redis-4.0.8.tar.gz [root@host57 opt]# rpm -q gcc 未安裝軟件包 gcc [root@host57 opt]# yum -y install gcc [root@host57 opt]# tar -zvxf redis-4.0.8.tar.gz [root@host57 opt]# cd redis-4.0.8/ [root@host57 redis-4.0.8]# make && make install [root@host57 redis-4.0.8]# ls 00-RELEASENOTES COPYING Makefile redis.conf runtest-sentinel tests BUGS deps MANIFESTO runtest sentinel.conf utils CONTRIBUTING INSTALL README.md runtest-cluster src創建哨兵服務的主配置文件并編輯[root@host57 redis-4.0.8]# vim /etc/sentinel.conf #創建主配置文件 bind 192.168.4.57 #哨兵服務地址,表示監聽本機地址(0.0.0.0代表本機所有網絡接口) sentinel monitor host54 192.168.4.54 6354 1 #監視主服務器啟動哨兵服務,會占用一個終端 [root@host57 redis-4.0.8]# redis-sentinel /etc/sentinel.conf #啟動哨兵服務 4711:X 29 Feb 19:23:51.779 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo 4711:X 29 Feb 19:23:51.779 # Redis version=4.0.8, bits=64, commit=00000000, modified=0, pid=4711, just started 4711:X 29 Feb 19:23:51.779 # Configuration loaded 4711:X 29 Feb 19:23:51.780 * Increased maximum number of open files to 10032 (it was originally set to 1024)._._ _.-``__ ''-._ _.-`` `. `_. ''-._ Redis 4.0.8 (00000000/0) 64 bit.-`` .-```. ```\/ _.,_ ''-._ ( ' , .-` | `, ) Running in sentinel mode|`-._`-...-` __...-.``-._|'` _.-'| Port: 26379| `-._ `._ / _.-' | PID: 4711`-._ `-._ `-./ _.-' _.-' |`-._`-._ `-.__.-' _.-'_.-'| | `-._`-._ _.-'_.-' | http://redis.io `-._ `-._`-.__.-'_.-' _.-' |`-._`-._ `-.__.-' _.-'_.-'| | `-._`-._ _.-'_.-' | `-._ `-._`-.__.-'_.-' _.-' `-._ `-.__.-' _.-' `-._ _.-' `-.__.-' 4711:X 29 Feb 19:23:51.785 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128. 4711:X 29 Feb 19:23:51.787 # Sentinel ID is 714d4a5b97456538f19d3d822bd020ebc046d7ea 4711:X 29 Feb 19:23:51.787 # +monitor master host54 192.168.4.54 6354 quorum 1 4711:X 29 Feb 19:23:51.793 * +slave slave 192.168.4.55:6355 192.168.4.55 6355 @ host54 192.168.4.54 6354 ##提示54主機是master主服務器,55主機是slave從服務器------------------------------------------------- 測試哨兵服務的配置1.停止54主機的redis服務 192.168.4.54:6354> shutdown not connected> exit2.在55主機查看復制信息 [root@host55 ~]# redis-cli -h 192.168.4.55 -p 6355 192.168.4.55:6355> info replication # Replication role:master #角色是master connected_slaves:1 slave0:ip=192.168.4.56,port=6356,state=online,offset=19475,lag=1 master_replid:0172cc9b61ee406e8539bf6b6a23f1614a321099 master_replid2:2f89b8c40607cad01757fce504a876f5fc27e488 master_repl_offset:19475 second_repl_offset:18891 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:1 repl_backlog_histlen:19475在管理主機查看哨兵服務的狀態 [root@host57 ~]# cat /etc/sentinel.conf bind 192.168.4.57 sentinel myid 714d4a5b97456538f19d3d822bd020ebc046d7ea # Generated by CONFIG REWRITE port 26379 dir "/opt/redis-4.0.8" sentinel monitor host54 192.168.4.55 6355 1 #此時,監控的主機依舊是自定義主機名host54,但監視的主服務器已經變成了55主機 sentinel config-epoch host54 1 sentinel leader-epoch host54 1 sentinel known-slave host54 192.168.4.54 6354 sentinel known-slave host54 192.168.4.56 6356 sentinel current-epoch 1此時,如果再次將54主機服務開啟,則54主機自動變為55主機的從服務器 [root@host54 ~]# /etc/init.d/redis_6379 start Starting Redis server... [root@host54 ~]# redis-cli -h 192.168.4.54 -p 6354 192.168.4.54:6354> info replication # Replication role:slave master_host:192.168.4.55 master_port:6355 master_link_status:up master_last_io_seconds_ago:2 master_sync_in_progress:0 slave_repl_offset:51529 slave_priority:100 slave_read_only:1 connected_slaves:0 master_replid:0172cc9b61ee406e8539bf6b6a23f1614a321099 master_replid2:0000000000000000000000000000000000000000 master_repl_offset:51529 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:48985 repl_backlog_histlen:2545[root@host55 ~]# redis-cli -h 192.168.4.55 -p 6355 192.168.4.55:6355> info replication # Replication role:master connected_slaves:2 slave0:ip=192.168.4.56,port=6356,state=online,offset=57957,lag=1 slave1:ip=192.168.4.54,port=6354,state=online,offset=57957,lag=1 master_replid:0172cc9b61ee406e8539bf6b6a23f1614a321099 master_replid2:2f89b8c40607cad01757fce504a876f5fc27e488 master_repl_offset:57957 second_repl_offset:18891 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:1 repl_backlog_histlen:57957模擬55主機宕機,查看是54主機還是56主機作為主 192.168.4.55:6355> shutdown #將55主機服務關閉 not connected> exit [root@host54 ~]# redis-cli -h 192.168.4.54 -p 6354 192.168.4.54:6354> info replication #54主機變成新的主服務器,56主機就自動變成54主機的從服務器,誰的數據最新,誰就成為新的主 # Replication role:master connected_slaves:1 slave0:ip=192.168.4.56,port=6356,state=online,offset=94588,lag=0 master_replid:e24bbd33ce00c4194baeb5c26e773e4fb7b32a6b master_replid2:0172cc9b61ee406e8539bf6b6a23f1614a321099 master_repl_offset:94588 second_repl_offset:94141 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:48985 repl_backlog_histlen:45604192.168.4.56:6356> info replication # Replication role:slave master_host:192.168.4.54 master_port:6354 master_link_status:up master_last_io_seconds_ago:2 master_sync_in_progress:0 slave_repl_offset:105073 slave_priority:100 slave_read_only:1 connected_slaves:0 master_replid:e24bbd33ce00c4194baeb5c26e773e4fb7b32a6b master_replid2:0172cc9b61ee406e8539bf6b6a23f1614a321099 master_repl_offset:105073 second_repl_offset:94141 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:127 repl_backlog_histlen:104947[root@host57 ~]# cat /etc/sentinel.conf bind 192.168.4.57 sentinel myid 714d4a5b97456538f19d3d822bd020ebc046d7ea # Generated by CONFIG REWRITE port 26379 dir "/opt/redis-4.0.8" sentinel monitor host54 192.168.4.54 6354 1 #查看監控情況,此時又重新監控54主機 sentinel config-epoch host54 2 sentinel leader-epoch host54 2 sentinel known-slave host54 192.168.4.55 6355 sentinel known-slave host54 192.168.4.56 6356 sentinel current-epoch 2持久化
RDB
- RDB介紹
- 數據庫文件,全稱Redis DataBase
- 數據持久化方式之一
- 數據持久化默認方式
- 按照指定時間間隔,將內存中的數據集快照寫入硬盤
- 定義RDB文件名
- dbfilename “dump.rdb” #文件名
使用RDB文件恢復數據
- 備份數據
- 備份dump.rdb文件到其他位置
- [root@localhost ~]# cp 數據庫目錄/dump.rdb 備份目錄
- 恢復數據
- 拷貝備份文件到數據庫目錄,啟動redis服務
- RDB的優點與缺點
- RDB的優點
- 高性能的持久化實現——創建一個子進程來執行持久化,先將數據寫入臨時文件,持久化過程結束后,再用這個臨時文件替換上次持久化好的文件;過程中主進程不作任何IO操作
- 比較適合大規模數據恢復,且對數據完整性要求不是非常高的場合
- RDB的缺點
- 意外宕機時,丟失最后一次持久化的所有數據
- 優化設置
- 數據從內存保存到硬盤的頻率
- 手動存盤
使用RDB文件恢復數據
- 要求:
AOF
- AOF介紹
- Append Only File
- 追加方式記錄寫操作的文件
- 記錄redis服務所有寫操作
- 不斷的將新的寫操作,追加到文件的末尾
- 默認沒有啟動
- 使用cat命令可以查看文件內容
- AOF的優點與缺點
- AOF的優點
- 可以靈活設置持久化方式
- 出現意外宕機時,僅可能丟失一秒的數據
- AOF的缺點
- 持久化文件的體積通常會大于RDB方式
- 執行fsync策略時的速度可能會比RDB方式慢
- 啟用AOF
- 備份數據
- 備份appendonly.aof文件到其他位置
- 恢復數據
- 拷貝備份文件到數據庫目錄
- 啟動redis服務
- 優化配置
- 定義文件名
- AOF文件記錄寫操作的方式
- 日志文件會不斷增大,何時出發日志重寫?
- 修復AOF文件
- 把文件恢復到最后一次的正確操作
使用AOF文件恢復數據
- 要求:
數據類型
string字符串
- 字符串操作
設置key及值,過期時間可以使用秒或毫秒為單位
- set key value [ex seconds] [px milliseconds] [nx|xx]從偏移量開始復寫key的特定位的值
- setrange key offset value - >set first "hello world" - >setrange first 6 "Redis" #改寫為hello Redis統計字串長度
- strlen key - >strlen first存在則追加,不存在則創建key以及value,返回key長度
- append key value - >append myname tian對key所存儲字串,設置或清除特定偏移量上的位(bit)
value值可以為1或者0,offset為0~2^32之間
key不存在,則創建新key
統計字串中被設置為1的比特位數量
- bitcount key - >setbit bits 0 1 #0001 - >setbit bits 3 1 #1001 - >bitcount bits #結果為2- >setbit peter 100 1 #網站上線100天用戶登錄了一次 - >setbit peter 105 1 #網站上線105天用戶登錄了一次 - >bitcount peter- 場景說明
- 記錄網站用戶上線頻率,例如用戶A上線了多少天等類似的數據
- 如用戶在某天上線,則使用setbit,以用戶名為key,將網站上線日為offset,并在該offset上設置為1,最后計算用戶總上線次數時,使用bitcount用戶名即可。
- 這樣,即使網站運行10年,每個用戶僅占用10*365比特位即456字節。
將key中的值減1,key不存在則先初始化為0,再減1
- decr key - >set test 10 - >decr test將key中的值,減去decrement
- decrby key decrement - >set count 100 - >decrby count 20返回key存儲的字符串值,若key不存在則返回null
若key的值不是字串,則返回錯誤,get只能處理字串
返回字串值中的子字串,截取范圍為start和end
負數偏移量表示從末尾開始計數,-1表示最后一個字符,-2表示倒數第二個字符
將key的值加1,如果key不存在,則初始化為0后再加1
主要應用為計數器
將key的值增加increment
- incrby key increment為key中所存儲的值加上浮點數增量increment
- incrbyfloat key increment - >set num 16.1 - >incrbyfloat num 1.1獲取一個或者多個key的值,空格分隔,具有原子性
- mget key [key...]設置多個key及值,空格分隔,具有原子性
- mset key value [key value...] 字符類型string相關命令對存入的數據進行修改例: 192.168.4.51:6351> set x 11 OK 192.168.4.51:6351> ttl x (integer) -1 192.168.4.51:6351> set y 99 ex 10 #ex秒 OK 192.168.4.51:6351> ttl y (integer) 5 192.168.4.51:6351> ttl y (integer) -2 192.168.4.51:6351> set y 99 px 10 #px毫秒 OK 192.168.4.51:6351> ttl y (integer) -2 192.168.4.51:6351> set x 33 OK 192.168.4.51:6351> get x "33" 192.168.4.51:6351> set x 22 nx #新存入的變量不存在就賦值 (nil) 192.168.4.51:6351> set x 22 xx #變量存在就賦新的值,不存在就不賦值 OK 192.168.4.51:6351> get x "22"修改變量的值 192.168.4.51:6351> set tel ascdef OK 192.168.4.51:6351> get tel "ascdef" 192.168.4.51:6351> SETRANGE tel 0 ABC #從第一個字符開始替換 (integer) 6 192.168.4.51:6351> get tel "ABCdef" 192.168.4.51:6351> SETRANGE tel 1 ** (integer) 6 192.168.4.51:6351> get tel "A**def"統計變量值的個數 192.168.4.51:6351> STRLEN tel (integer) 6 192.168.4.51:6351> get tel "A**def"添加新值 192.168.4.51:6351> get tel "A**def" 192.168.4.51:6351> APPEND tel cc (integer) 8 192.168.4.51:6351> get tel "A**defcc" 192.168.4.51:6351> APPEND telb cc #沒有該變量就創建新的變量并賦值 (integer) 2 192.168.4.51:6351> get telb "cc"位存儲方式存儲數據,目的節省存儲空間 1G=1024M 1M=1024K 1K=1024bytes 1byte=8位 1位=0或1192.168.4.51:6351> setbit tian 1 1 (integer) 0 192.168.4.51:6351> setbit tian 2 0 (integer) 0 192.168.4.51:6351> setbit tian 3 1 (integer) 0 192.168.4.51:6351> setbit tian 4 1 (integer) 0 192.168.4.51:6351> setbit tian 5 0 (integer) 0 192.168.4.51:6351> setbit tian 6 1 (integer) 0 192.168.4.51:6351> setbit tian 7 1 (integer) 0 192.168.4.51:6351> setbit tian 8 0 (integer) 0 192.168.4.51:6351> setbit tian 9 0 (integer) 0 192.168.4.51:6351> bitcount tian (integer) 5自減 192.168.4.51:6351> get x "22" 192.168.4.51:6351> type x string 192.168.4.51:6351> DECR x (integer) 21 192.168.4.51:6351> DECR x (integer) 20 192.168.4.51:6351> DECR x (integer) 19 192.168.4.51:6351> DECR x (integer) 18 192.168.4.51:6351> get x "18"自加 192.168.4.51:6351> get x "18" 192.168.4.51:6351> INCR x (integer) 19 192.168.4.51:6351> INCR x (integer) 20 192.168.4.51:6351> INCR x (integer) 21 192.168.4.51:6351> incrby x 11 (integer) 32 192.168.4.51:6351> INCRBYFLOAT x 5.2 "37.2"獲取變量值的部分數據 192.168.4.51:6351> get tel "A**defcc" 192.168.4.51:6351> GETRANGE tel -2 -1 "cc" 192.168.4.51:6351> GETRANGE tel 0 2 "A**"list列表
- list列表簡介
- Redis的list是一個字符隊列
- 先進后出
- 一個key可以有多個值
- list列表操作
將一個或多個值value插入到列表key的表頭
key不存在,則創建key
從開始位置讀取key的值到stop結束
- lrange key start stop - >lrange list 0 2 #從0位開始,讀到2位為止 - >lrange list 0 -1 #從開始讀到結束為止 - >lrange list 0 -2 #從開始讀到倒數第2位為止移除并返回列表頭元素數據,key不存在則返回nil
- lpop key - >lpop list #刪除表頭元素,可以多次執行返回列表key的長度
- llen key返回列表中第index個值
- lindex key index - >lindex key 0; lindex key 2; lindex key -2將key中index位置的值修改為value
- lset key index value - >lset list 3 test #將list中第3個值修改為test將value插入到key的末尾
- rpush key value [value...] - >rpush list3 a b c #list3值為a b c - >rpush list3 d #末尾插入d刪除并返回key末尾的值
- rpop key - >rpush list4 a b c #list4值為a b c - >rpop list4 #刪除末尾的c,并返回刪除的值 lpush:192.168.4.51:6351> lpush hostname tian haha aaa heihei (integer) 4 192.168.4.51:6351> keys * 1) "hostname" 192.168.4.51:6351> type hostname list 192.168.4.51:6351> get hostname (error) WRONGTYPE Operation against a key holding the wrong kind of value 192.168.4.51:6351> LRANGE hostname 0 -1 1) "heihei" 2) "aaa" 3) "haha" 4) "tian" 192.168.4.51:6351> LRANGE hostname 0 2 #輸出前三個 1) "heihei" 2) "aaa" 3) "haha" 192.168.4.51:6351> LRANGE hostname -2 -1 #輸出后兩個 1) "haha" 2) "tian"lpop:192.168.4.51:6351> lpop hostname #刪除變量,默認刪除當前第一個,不能指定移除的變量 "heihei" 192.168.4.51:6351> LRANGE hostname 0 -1 1) "aaa" 2) "haha" 3) "tian"llen: 192.168.4.51:6351> llen hostname #查看變量長度 (integer) 3 192.168.4.51:6351> LRANGE hostname 0 -1 #查看list的變量,0代表第一個變量值,-1代表最后一個變量值,-2代表倒數第二個變量值,0 -1代表所有的變量值 1) "aaa" 2) "haha" 3) "tian" 192.168.4.51:6351> lpush hostname AAA BBB (integer) 5 192.168.4.51:6351> LRANGE hostname 0 -1 1) "BBB" 2) "AAA" 3) "aaa" 4) "haha" 5) "tian"lset:192.168.4.51:6351> lset hostname 0 ZZZ OK 192.168.4.51:6351> LRANGE hostname 0 -1 1) "ZZZ" 2) "AAA" 3) "aaa" 4) "haha" 5) "tian" 192.168.4.51:6351> lset hostname -1 XXX OK 192.168.4.51:6351> LRANGE hostname 0 -1 1) "ZZZ" 2) "AAA" 3) "aaa" 4) "haha" 5) "XXX"lindex:192.168.4.51:6351> lindex hostname 2 "aaa" 192.168.4.51:6351> lindex hostname -2 "haha"rpush:192.168.4.51:6351> LRANGE hostname 0 -1 1) "ZZZ" 2) "AAA" 3) "aaa" 4) "haha" 5) "XXX" 192.168.4.51:6351> rpush hostname 111 444 333 (integer) 8 192.168.4.51:6351> LRANGE hostname 0 -1 1) "ZZZ" 2) "AAA" 3) "aaa" 4) "haha" 5) "XXX" 6) "111" 7) "444" 8) "333"rpop:192.168.4.51:6351> rpop hostname #默認刪除最后一個變量 "333" 192.168.4.51:6351> LRANGE hostname 0 -1 1) "ZZZ" 2) "AAA" 3) "aaa" 4) "haha" 5) "XXX" 6) "111" 7) "444" 192.168.4.51:6351> lpop hostname "ZZZ" 192.168.4.51:6351> LRANGE hostname 0 -1 1) "AAA" 2) "aaa" 3) "haha" 4) "XXX" 5) "111" 6) "444"hash表
- hash表簡介
- 是一個string類型的filed和value的映射表
- 一個key可以對應多個filed,一個filed對應一個value
- 將一個對象存儲為hash類型,較于每個字段都存儲成string類型更能節省內存
- hash表操作
將hash表中filed值設置為value
獲取hash表中filed的值
- hget key filed - >hget site google同時給hash表中的多個filed賦值
- hmset key filed value [filed value...] - >hmset site google www.g.cn baidu www.baidu.cn返回hash表中多個filed的值
- hmget key filed [filed...] - >hmget site google baidu返回hash表中所有filed名稱
- hkeys key - >hmset site google www.g.cn baidu www.baidu.com - >hkeys site返回hash表中所有key名和對應的值列表
- hgetall key返回hash表中所有key的值
- hvals site刪除hash表中多個filed的值,不存在則忽略
- hdel key filed [filed...] - >hdel site google baidu hset,hget,hkeys:192.168.4.51:6351> hset site tian www.tian.com (integer) 1 192.168.4.51:6351> keys * 1) "site" 192.168.4.51:6351> type site hash 192.168.4.51:6351> hkeys site 1) "tian" 192.168.4.51:6351> hget site tian "www.tian.com"hmset,hmget:192.168.4.51:6351> hmset site aa www.aaa.com qq www.qq.com ss www.ss.com OK 192.168.4.51:6351> hkeys site 1) "tian" 2) "aa" 3) "qq" 4) "ss" 192.168.4.51:6351> hget site qq "www.qq.com" 192.168.4.51:6351> hmget site tian aa 1) "www.tian.com" 2) "www.aaa.com"hvals:192.168.4.51:6351> hvals site 1) "www.tian.com" 2) "www.aaa.com" 3) "www.qq.com" 4) "www.ss.com"hgetall:192.168.4.51:6351> hgetall site 1) "tian" 2) "www.tian.com" 3) "aa" 4) "www.aaa.com" 5) "qq" 6) "www.qq.com" 7) "ss" 8) "www.ss.com"hdel:192.168.4.51:6351> hdel site qq (integer) 1 192.168.4.51:6351> hkeys site 1) "tian" 2) "aa" 3) "ss"總結
以上是生活随笔為你收集整理的NoSQL(三):主从复制的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: NoSQL(二):创建、管理集群
- 下一篇: vim小技巧