Redis 实战笔记
生活随笔
收集整理的這篇文章主要介紹了
Redis 实战笔记
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Redis
yum源安裝
yum install -y epel-release redis systemctl enable redis systemctl start redis systemctl status redisredis 簡介
Redis是一個開源的使用 C語言編寫的 Key-value內存數據庫讀寫性能強,支持多種數據類型把數據存儲在內存中的高速緩存作者 Salvatore Sanfilippo# 中文文檔http://www.redis.cn/documentation.htmlredis 特點
速度快支持多種數據結構( string、list、hash、set、stored set)持久化主從復制(集群)支持過期時間支持事務消息訂閱官方不支持 WINDOWS,但是有第三方版本Redis與 Memcache的對比
對比測試
Redis應用場景
數據緩存提高訪問性能,使用的方式與 memcache相同。會話緩存( Session Cache)保存Web會話信息排行榜/計數器? ??Nginx+lua+Redis 計數器進行IP自動封禁消息隊列構建實時消息系統,聊天,群聊。多實例
復制redis.conf redis-server redis-cli 到不同的文件夾修改配置文件中的端口# 去除注釋 sed -ri '/^$|#/d' redis.conf # 后臺啟動 [root@mysql-56 redis-6.0.9]# grep daemon redis.conf daemonize yes [root@mysql-56 redis-6.0.9]# ./src/redis-server redis.conf [root@mysql-56 redis-6.0.9]# ./src/redis-cli -p 6380 127.0.0.1:6380>redis 源碼安裝
#安裝 wget http://download.redis.io/releases/redis-3.2.6.tar.gz tar xzf redis-3.2.6.tar.gz cd redis-3.2.6 make#運行 src/redis-server #客戶端 src/redis-cli#查看路徑 rpm -ql redis # 啟動客戶端端口 redis-cli -p 6380配置文件
主目錄下 redis.conf??port 6380 # 端口 daemonize yes # 后臺運行 pidfile /var/run/redis_6380.pid #進程文件 logfile "/data/redis6380/redis.log" #日志文件 appendonly yes #日志開關 dbfilename dump.rdb # 持久化數據文件[root@mysql-56 redis-6.0.9]# ls /data/redis6380/ redis.conf redis.log redis-serverredis 保護模式
一鍵部署[root@mysql-56 redis-6.0.9]# cat /usr/lib/systemd/system/redis.service [Unit] Description=Redis persistent key-value database After=network.target After=network-online.target Wants=network-online.target[Service] ExecStart=/usr/bin/redis-server /etc/redis.conf --supervised systemd ExecStop=/usr/libexec/redis-shutdown Type=notify User=redis Group=redis RuntimeDirectory=redis RuntimeDirectoryMode=0755[Install] WantedBy=multi-user.targetBind 保護模式
- Redis 3.2 新特性
- Bind
- 禁止 protected-mode
- 增加 requirepass {password}
- 在redis-cli中使用
redis 數據
獲取當前配置CONFIG GET *變更運行配置CONFIG SET loglevel "notice"持久化
- RDB持久化可以在指定的時間間隔內生成數據集的時間點快照(point-in-time snapshot)
- AOF持久化記錄服務器執行的所有寫操作命令,并在服務器啟動時,通過重新執行這些命令來還原數據集。AOF文件中的命令全部以Redis協議的格式來保存,新命令會被追加到文件的末尾。Redis還可以在后臺對AOF文件進行重寫(rewrite),使得AOF文件的體積不會超出保存數據集狀態所需的實際大小。
- Redis還可以同時使用AOF持久化和RDB持久化。在這種情況下,當 Redis重啟時,它會優先使用AOF文件來還原數據集,因為AOF文件保存的數據集通常比RDB文件所保存的數據集更完整。
- 你甚至可以關閉持久化功能,讓數據只在服務器運行時存在。
持久化策略
日志文件 appendonly yes/nosave 900 1save 300 10save 60? 10000分別表示900秒(15分鐘)內有1個更改,300秒(5分鐘)內有10個更改以及60秒內有10000個更改,即將數據寫入硬盤。壓縮
decompression yes-指定存儲至本地數據庫時是否壓縮數據,默認為yes,Redis 采用LZF壓縮,如果為了節省CPU時間,可以關閉該選項,但會導致數據庫文件變的巨大同步
appendfsync everysec- no:表示等操作系統進行數據緩存同步到磁盤,linux 約30秒(快)- always:表示每次更新操作后調用fsync()將數據寫到磁盤(慢,安全)- everysec:表示每秒同步一次(折中,默認值)核心實戰
數據類型
常規操作
KEYS * 查看KEY支持通配符DEL? ??刪除給定的一個或多個keyEXISTS? ? 檢查是否存在EXPIRE? ??設定生存時間TTL? ??? ??以秒為單位返回過期時間DUMP RESTORE? ??? ??序例化與反序列化PEXIRE PTTL PERSIST? ??以毫秒為單位RENAME? ??變更KEY名SORT? ??鍵值排序,有非數字時報錯TYPE? ??返回鍵所存儲值的類型字符串
SET name lewenGet name一個鍵最大能存儲512MBAppend #將value追加到key原來的值的末尾 INCRBY #增加 DECRBY #減少DECRBY count 20 減去指定量 Mget mset #同時獲取設置一個或多個鍵值對 STRLEN #返回字符串長度 INCR DECR #將值增或減1練習
127.0.0.1:6380> set name lewen OK 127.0.0.1:6380> get name "lewen" 127.0.0.1:6380> type name string127.0.0.1:6380> APPEND name 123 (integer) 8 127.0.0.1:6380> get name "lewen123"127.0.0.1:6380> mset name fadewalk age 24 OK 127.0.0.1:6380> get name "fadewalk" 127.0.0.1:6380> get age "24"127.0.0.1:6380> mget name age 1) "fadewalk" 2) "24"127.0.0.1:6380> STRLEN name (integer) 8 127.0.0.1:6380> STRLEN age (integer) 2127.0.0.1:6380> INCR age (integer) 25 127.0.0.1:6380> INCR age (integer) 26127.0.0.1:6380> DECR age (integer) 25 127.0.0.1:6380> DECR age (integer) 24重復set 會覆蓋掉前面的值127.0.0.1:6380> EXISTS name (integer) 1 127.0.0.1:6380> INCRBY age (error) ERR wrong number of arguments for 'incrby' command 127.0.0.1:6380> INCRBY age 100 (integer) 124hash
Redis hash 是一個鍵值對集合。Redis hash 是一個 string類型的field 和 value 的映射表hash 特別適合用于存儲對象。每個hash可以存儲2^32-1鍵值對HSET HGET? ? #設置返回單個值HMSET HMGET? ? #設置返回多個值Hmset user name quo sex male age 22HGETALL? ?#返回KEY的所有鍵值HEXSITS? #判斷是否存在HLEN? ? ? #判斷長度HKEYS? ? #獲取所有字典HVALS? ? #獲取所有值HDEL? ? ?#刪除key中的一個或多個指定域127.0.0.1:6380> hset user:1 name lewen (integer) 1 127.0.0.1:6380> TYPE user:1 hash 127.0.0.1:6380> hset user:1 set male (integer) 1127.0.0.1:6380> hgetall user:1 1) "name" 2) "lewen" 3) "age" 4) "24" 5) "set" 6) "male" 127.0.0.1:6380> hget user:1 name "lewen" 127.0.0.1:6380> hget user:1 age "24" 127.0.0.1:6380> hmget user:1 name age 1) "lewen" 2) "24"刪除 127.0.0.1:6380> hdel user:1 name (integer) 1 127.0.0.1:6380> hdel user:1 set (integer) 1 127.0.0.1:6380> del user:1 (integer) 1 127.0.0.1:6380> keys * 1) "age" 2) "name"127.0.0.1:6380> hmset user name lewen age 24 sex male OK 127.0.0.1:6380> HINCRBY user age 10 (integer) 34 127.0.0.1:6380> HINCRBY user age -5 (integer) 29list
Redis? ??列表是簡單的字符串列表。按照插入順序排序每個LIST可以存儲2^32-1鍵值對LPUSH? ? #將一個或多個值插入到列表頭部RPUSH? ? #將一個或多個值插入到列表尾部LPOP/RPOP? ? #移除表頭/尾的元素LLEN? ? ? #返回列表長度LRANGE? ? #返回指定的元素LREM greet 2 morning? ? #刪除前兩個 morningLREM greet -1 morning? ?#刪除后一個 morningLREM greet 0 hello? ? ?#刪除所有 helloLindex? ? #返回列表key中下標為 index的元素LSET key index value? ? #將列表key下標為 index的元素的值設置為valueLINSERT? ? #插入數據位于某元素之前或之后。LINSERT key BEFORE|AFTER pivot?value127.0.0.1:6380> lpush found gf yfd jy fc zs (integer) 5 127.0.0.1:6380> type found list127.0.0.1:6380> lrange found 0 10 1) "zs" 2) "fc" 3) "jy" 4) "yfd" 5) "gf"127.0.0.1:6380> lrange found 0 3 1) "zs" 2) "fc" 3) "jy" 4) "yfd" 127.0.0.1:6380> lrange found 0 5 1) "zs" 2) "fc" 3) "jy" 4) "yfd" 5) "gf"127.0.0.1:6380> lpush found wj (integer) 6 127.0.0.1:6380> lrange found 0 5 1) "wj" 2) "zs" 3) "fc" 4) "jy" 5) "yfd" 6) "gf"127.0.0.1:6380> rpush found ha (integer) 7 127.0.0.1:6380> lrange found 0 6 1) "wj" 2) "zs" 3) "fc" 4) "jy" 5) "yfd" 6) "gf" 7) "ha"消費 127.0.0.1:6380> rpop found "ha" 127.0.0.1:6380> lrange found 0 6 1) "wj" 2) "zs" 3) "fc" 4) "jy" 5) "yfd" 6) "gf" 127.0.0.1:6380> lpop found "wj" 127.0.0.1:6380> lrange found 0 6 1) "zs" 2) "fc" 3) "jy" 4) "yfd" 5) "gf"127.0.0.1:6380> rpush found bao1 bao2 bao3 bao4 (integer) 9 127.0.0.1:6380> lrange found 0 10 1) "zs" 2) "fc" 3) "jy" 4) "yfd" 5) "gf" 6) "bao1" 7) "bao2" 8) "bao3" 9) "bao4" 127.0.0.1:6380> lpop found "zs" 127.0.0.1:6380> lpop found "fc" 127.0.0.1:6380> lpop found "jy" 127.0.0.1:6380> lpop found "yfd" 127.0.0.1:6380> lpop found "gf" 127.0.0.1:6380> lpop found "bao1"127.0.0.1:6380> lrange found 0 10 1) "bao2" 2) "bao3" 3) "bao4" 127.0.0.1:6380> LLEN found (integer) 3127.0.0.1:6380> rpush found bao1 bao2 bao3 bao4 (integer) 7 127.0.0.1:6380> lrange found 0 10 1) "bao2" 2) "bao3" 3) "bao4" 4) "bao1" 5) "bao2" 6) "bao3" 7) "bao4" 127.0.0.1:6380> lrem found 1 bao2 (integer) 1 127.0.0.1:6380> lrange found 0 10 1) "bao3" 2) "bao4" 3) "bao1" 4) "bao2" 5) "bao3" 6) "bao4"127.0.0.1:6380> lset found 0 baozi001 OK 127.0.0.1:6380> lrange found 0 10 1) "baozi001" 2) "bao4" 3) "bao1" 4) "bao2" 5) "bao3" 6) "bao4"127.0.0.1:6380> lindex found 0"baozi001"127.0.0.1:6380> linsert found after baozi001 baozi002(integer) 7127.0.0.1:6380> lrange found 0 101) "baozi001"2) "baozi002"3) "bao4"4) "bao1"5) "bao2"6) "bao3"7) "bao4"redis 隊列訂閱
生產消費模型
消息模式
- 發布消息通常有兩種模式:隊列模式( queuIng)和發布-訂閱模式(publish- subscribe)。隊列模式中, consumers可以同時從服務端讀取消息,每個消息只被其中一個 consume讀到。
- 發布-訂閱模式中消息被廣播到所有的 consumer中, topic中的消息將被分發到組中的一個成員中。同一組中的 consumer可以在不同的程序中,也可以在不同的機器上。
Redis 發布訂閱
- Redis發布訂閱(pub/sub)是一種消息通信模式:發送者(pub)發送消息,訂閱者(sub)接收消息。
- Redis客戶端可以訂閱任意數量的頻道。
訂閱發布實例
SUBSCRIBE mq1? ??#客戶端PUBLISH mq1 "Redis is a great caching technique"PSUBSCRIBE 訂閱一個或多個符合給定模式的頻道psubscribe news *tech*PUBLISH channel message將信息 message?發送到指定的頻道 channel。返回值代表消費者數量pubsub channels? ? #顯示訂閱頻道PUBSUB NUMSUB news.it? ? #打印各頻道訂閱者數量PUNSUBSCRIBE? ? #退訂多個頻道SUBSCRIBE? ? ? ?#訂閱給定的一個或多個頻道的信息。UNSUBSCRIBE? ? ?#退訂頻道127.0.0.1:6380> PUBLISH mq1 "redis is a great caching technique"(integer) 2127.0.0.1:6380>Redis 事務
Redis 事務可以一次執行多個命令事務是一個單獨的隔離操作:事務中的所有命令都會序列化、按順序地執行。事務在執行的過程中,不會被其他客戶端發送來的命令請求所打斷。原子性:事務中的命令要么全部被執行,要么全部都不執行。執行過程- 開始事務
- 命令入隊
- 執行事務
事務命令
DISCARD取消事務,放棄執行事務塊內的所有命合。EXEC執行所有事務塊內的命令MULTI標記一個事務塊的開始UNWATCH取消 WATCH命合對所有key的監視WATCH key [key....]-監視一個(或多個)key,如果在事務執行之前這個(或這些)key被其他命合所改動,那么事務捋被打斷數據備份
[root@cs7 ~]# redis-cli 127.0.0.1:6379> CONFIG GET dir # 獲取當前目錄 1) "dir" 2) "/var/lib/redis" [root@cs7 ~]# ls /var/lib/redis/ dump.rdb- Save備份(無持久化策略時),生成時在redis 當前目錄中。
- 恢復時只需將 dump.rdb 放入redis當前目錄
備份恢復實例
[root@mysql-56 redis6380]# egrep "port|daemon|dir|logfile|dbfilename" redis.conf port 6380 daemonize yes logfile "./redis.log" dbfilename dump-6380.rdb dir /data/redis6380 [root@mysql-56 redis6380]# tree . ├── appendonly.aof ├── dump-6380.rdb ├── redis.conf ├── redis.log └── redis-server[root@mysql-56 redis6380]# ./redis-server redis.conf [root@mysql-56 redis6380]# redis-cli -p 6380 127.0.0.1:6380> KEYS * (empty list or set) 127.0.0.1:6380> mset name lewen age 24 OK 127.0.0.1:6380> SHUTDOWN not connected> exit [root@mysql-56 redis6380]# ls appendonly.aof dump-6380.rdb redis.conf redis.log redis-server [root@mysql-56 redis6380]# mv dump-6380.rdb /tmp/ [root@mysql-56 redis6380]# mv appendonly.aof /tmp/[root@mysql-56 redis6380]# ./redis-server redis.conf [root@mysql-56 redis6380]# redis-cli -p 6380 127.0.0.1:6380> KEYS * (empty list or set) 127.0.0.1:6380> SHUTDOWN not connected> [root@mysql-56 redis6380]# mv /tmp/dump-6380.rdb . [root@mysql-56 redis6380]# ls appendonly.aof dump-6380.rdb redis.conf redis.log redis-server [root@mysql-56 redis6380]# ./redis-server redis.conf [root@mysql-56 redis6380]# redis-cli -p 6380 127.0.0.1:6380> KEYS * 1) "age" 2) "name"主從復制
主從配置
slaveof 192.168.1.1:6379slave-read-only? ? ?# 只讀模式masterauth <password>? ? ? ??#主服務器設置密碼后需要填寫密碼min-slaves-to-write <number of slaves> ? ??#從服務器不少于,才允許寫入min-slaves-max-lag <number of seconds>? ??#從服務器延遲不大于CONFIG set slave-read-only yesConfig set masterauth rootinfo replicationSLAVEOF NO ONE? ? #升級至 MASTER127.0.0.1:6380> info replication # Replication role:master connected_slaves:2 slave0:ip=127.0.0.1,port=6381,state=online,offset=140,lag=1 slave1:ip=127.0.0.1,port=6382,state=online,offset=140,lag=1 master_replid:8b3a113a7708b59ec6da191eab8ddfa3a5ec2b92 master_replid2:0000000000000000000000000000000000000000 master_repl_offset:140 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:1 repl_backlog_histlen:140127.0.0.1:6381> SLAVEOF 127.0.0.1 6380 OK 127.0.0.1:6382> SLAVEOF 127.0.0.1 6380 OK127.0.0.1:6382> MGET name age 1) "lewen" 2) "24" 127.0.0.1:6381> SLAVEOF no one基于 keepalived的自動故障切換Redis sentinel
redis 哨兵實現主從復制master和slave 自動切換Redis sentinel
·Redis-Sentinel 是 Redis官方推薦的高可用性(HA)解決方案,當用Redis做 Master-slave的高可用方案時,假如 master宕機了,Redis本身(包括它的很多客戶端)都沒有實現自動進行主備切換,而Redis-sentinel 本身也是一個獨立運行的進程,它能監控多個 master-slave?集群,發現 master宕機后能進行自動切換。功能
監控( Monitoring):Sentinel 會不斷地檢查你的主服務器和從服務器是否運作正常。提醒( Notification):當被監控的某個Redis服務器出現問題時,Sentinel可以通過API向管理員或者其他應用程序發送通知。自動故障遷移( Automatic failover):當一個主服務器不能正常工時, Sentinel會開始一次自動故障遷移操作,它會將失效主服務器的其中一個從服務器升級為新的主服務器,并讓失效主服務器的其他從服務器改為復制新的主服務器;當客戶端試圖連接失效的主服務器時,集群也會向客戶端返回新主服務器的地址,使得集群可以使用新主服務器代替失效服務器。Sentinel 命令
PING: 返回PONGSENTINEL masters:列出所有被監視的主服務器SENTINEL slaves <master name>SENTINEL get-master-addr-by-name<master name>:返回給定名字的主服務器的IP地址和端口號。SENTINEL reset <pattern>:重置所有名字和給定模式 pattern相匹配的主服務器。SENTINEL failover <master name>:當主服務器失效時,在不詢問其他 Sentinel意見的情況下,強制開始一次自動故障遷移。查看配置文件配置
cp src/redis-sentinel sentinel.conf vim sentinel.conf port 26380 dir "." sentinel monitor mcmaster 127.0.0.1 6381 1 # 主的個數,這里就寫一個 sentinel down-after-milliseconds mymaster 60000 sentinel config-epoch mymaster O #啟動 ./redis-sentinel /sentinel.conf實操配置復制到哨兵文件到 /data/s1[root@mysql-56 s1]# cat sentinel.conf port 26379 daemonize yes pidfile "/var/run/redis-sentinel.pid" logfile "./sentinel.log" dir "/data/s1/" sentinel myid 1c83d3230453094e2878f2f89dcd609ec601e380 sentinel deny-scripts-reconfig yes sentinel monitor mymaster 127.0.0.1 6381 1 sentinel down-after-milliseconds mymaster 10000 sentinel config-epoch mymaster 1配置文件
指定監控 mastersentinel monitor mymaster 127.0.0.1 6379 2 {2表示多少個 sentinel同意}安全信息sentinel auth-pass mymaster luyx30超過15000毫秒后認為主機宕機sentinel down-after-milliseconds mymaster 15000·當主從切換多久后認為主從切換失敗sentinel failover-timeout mymaster 100000這兩個配置后面的數量主從機需要一樣, epoch為 master的版本sentinel leader-epoch mymaster 1sentinel config-epoch mymaster 1演示
6380 掛了會自動的 6381 成為master當6380 恢復了以后,又可以加入成為slave如下:127.0.0.1:6380> info replication # Replication role:master connected_slaves:2 slave0:ip=127.0.0.1,port=6381,state=online,offset=9326,lag=0 slave1:ip=127.0.0.1,port=6382,state=online,offset=9326,lag=0 master_replid:8b3a113a7708b59ec6da191eab8ddfa3a5ec2b92 master_replid2:0000000000000000000000000000000000000000 master_repl_offset:9459 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:1 repl_backlog_histlen:9459 127.0.0.1:6380> SHUTDOWN not connected>[root@mysql-56 s1]# redis-cli -p 6381 127.0.0.1:6381> info replication # Replication role:master connected_slaves:1 slave0:ip=127.0.0.1,port=6382,state=online,offset=11106,lag=0 master_replid:15dc060e31823a40c0e971733dc0add4c3e960f0 master_replid2:8b3a113a7708b59ec6da191eab8ddfa3a5ec2b92 master_repl_offset:11106 second_repl_offset:10006 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:1 repl_backlog_histlen:11106Redis cluster
Redis集群
Reds集群是一個可以在多個Redis節點之間進行數據共享的設施(installation)。Redis集群不支持那些需要同時處理多個鍵的Redis命合,因為執行這些命令需要在多個Redis節點之間移動數據,并且在高負載的情況下,這些命令將降低Redis集群的性能,并導致不可預測的行為Redis集群通過分區(partition)來提供一定程度的可用性(availability):即使集群中有一部分節點失效或者無法進行通訊,集群也可以繼續處理命合請求。將數據自動切分(split)到多個節點的能力。當集群中的一部分節點失效或者無法進行通訊時,仍然可以繼續處理命令請求的能力。前面是 主從復制的小集群Redis 集群數據共享
- Redis集群使用數據分片(sharding)而非一致性哈希(consistency hashing)來實現:一個Redis集群包含16384個哈希槽( hash slot),數據庫中的每個鍵都屬于這16384個哈希槽的其中一個,集群使用公式CRC16(key)% 16384來計算鍵key屬于哪個槽,其中CRC16(key)語句用于計算鍵key的CRC16校驗和。
- 節點A負責處理0號至5500號哈希槽。
- 節點B負責處理5501號至11000號哈希槽。
- 節點C負責處理11001號至16384號哈希槽
集群的復制
- 為了使得集群在一部分節點下線或者無法與集群的大多數(majority)節點進行通訊的情況下,仍然可以正常運作,Redis集群對節點使用了主從復制功能:集群中的每個節點都有1個至N個復制品(replicate),其中一個復制品為主節點(master),而其余的N-1個復制品為從節點(slave)。
- 在之前列舉的節點A、B、C的例子中,如果節點B下線了,那么集群將無法正常運行,因為集群找不到節點來處理501號至11000號的哈希槽。
- 假如在創建集群的時候(或者至少在節點B下線之前),我們為主節點B添加了從節點B1,那么當主節點B下線的時候,集群就會捋B1設置為新的主節點,并讓它代替下線的主節點B,繼續處理5501號至11000號的哈希槽,這樣集群就不會因為主節點B的下線而無法正常運作了。
- 不過如果節點B和B1都下線的話,Redis集群還是會停止運作。
運行機制
所有的 redis節點彼此互聯(PING-PONG機制),內部使用二進制協議優化傳輸速度和帶寬。節點的fail是通過集群中超過半數的 master節點檢測失效時才生效客戶端與redis節點直連,不需要中間 proxy層.客戶端不需要連接集群所有節點連接集群中任何一個可用節點即可把所有的物理節點映射到[0~16383] slot上,cluster 負責維護 node slot key注意
需要安裝ruby支持yum install ruby rubygems -ygem install redis<如果gem卡住不動,使用國內鏡像>gemsources--addhttps://gems.ruby-china.org/--removehttps://rubygems.org/gem sources -[root@mysql-56 s1]# yum install ruby rubygems -y[root@mysql-56 s1]# gem install redis[root@mysql-56 s1]# gem sources -a https://mirrors.ustc.edu.cn/rubygems/https://mirrors.ustc.edu.cn/rubygems/ added to sources[root@mysql-56 s1]# gem sources --remove https://rubygems.org/https://rubygems.org/ removed from sources[root@mysql-56 s1]# gem sources -l*** CURRENT SOURCES ***https://mirrors.ustc.edu.cn/rubygems/配置文件中包含cluster-enabled yes cluster-config-file nodes.conf cluster-node-timeout 5000 appendonly yes創建多個實例
#!/bin/bash rm -rf /data/700* for no in {0..5} domkdir /data/700$nocd /data/700$nocp -r /data/redis6380/* ./ sed -i "s/port 6379/port 700$no/g" redis.confsed -i "s/daemonize no/daemonize yes/g" redis.confsed -i "s#/var/log/redis/redis.log#redis.log#g" redis.conf# sed -i "s/dump.rdb/dump_700$no.rdb/g" redis.conf# sed -i "s/appendonly.aof/appendonly_700$no.aof/g" redis.confecho "cluster-enabled yes" >> redis.confecho "cluster-config-file nodes.conf" >> redis.confecho "cluster-node-timeout 5000" >> redis.confsed -i "s/appendonly no/appendonly yes/g" redis.confsed -i "s/redis_6379.pid/redis_700$no.pid/g" redis.confsed -i "/dir/d" redis.confecho 'dir "./"' >>redis.confdone啟動實例
#!/bin/bash for i in `ss -lntp|grep 700|egrep 'pid=[0-9]{4}'|awk -F '=|,' '{print $3}'`;do kill -9 $i;done for no in {0..5} docd /data/700$no./redis-server ./redis.confdone創建集群
/data/redis-trib.rb create --replicas 1 \127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 \127.0.0.1:7004 127.0.0.1:7005給定 redis-trib.rb程序的命合是 create,這表示我們希望創建一個新的集群。選項 --replicas 1 表示我們希望為集群中的每個主節點創建一個從節點之后跟著的其他參數則是實例的地址列表,我們希望程序使用這些地址所指示的實例來創建新集群。# 新的創建集群方式/data/redis-cli --cluster create 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 --cluster-replicas 1集群客戶端[root@txy redis-6.0.9]# redis-cli -c -p 7000重新分片./redis-trib.rb reshard 127.0.0.1:7000[root@txy redis-6.0.9]# redis-cli -c -p 7000 127.0.0.1:7000> set name lewf -> Redirected to slot [5798] located at 127.0.0.1:7001 OK 127.0.0.1:7001> set name lewfd OK 127.0.0.1:7001> set name lewfd OK 127.0.0.1:7001> get name "lewfd"集群管理
集群狀態redis-cli -p 7000 cluster nodes |grep master故障轉移redis-cli -p 7002 debug segfault查看狀態redis-cli -p 7000 cluster nodes|grep master增加新的節點
./redis-trib.rb add-node 127.0.0.1:7006 127.0.0.1:7000變成某實例的從redis 127.0.0.1:7006 > cluster replicate?3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e刪除一個節點redis-trib del-node ip:port '<node-id>'刪除 master節點之前首先要使用 reshard 移除 master的全部 slot,然后再刪除當前節點狀態說明
- 集群最近一次向節點發送PING命合之后,過去了多長時間還沒接到回復。
- 節點最近一次返回PONG回復的時間。
- 節點的配置紀元(configuration epoch):詳細信息請參考Redis?集群規范。
- 本節點的網絡連接情況:例如 connected。
- 節點目前包含的槽:例如 1270.0.1:7001 目前包含號碼為5960至10921的哈希槽。
面試常問
集群哨兵持久化問題redis qps
單實例qps每天11萬次不要超過5萬最大3萬總結
以上是生活随笔為你收集整理的Redis 实战笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 19 | 案例篇:为什么系统的Swap变
- 下一篇: Nginx 性能优化