第二十二周-94-NoSQL-Redis緩存技術(shù)

Redis緩存技術(shù)-運(yùn)維篇—olgguo導(dǎo)師
無(wú)論面試還是工作,關(guān)于Redis理解這些就夠了

0. NoSQL 產(chǎn)品(key-value)

RDBMS :MySQL悠反,Oracle 盐固,MSSQL,PG
NoSQL  :Redis,MongoDB眯停,列存儲(chǔ)存儲(chǔ)相關(guān)
NewSQL----->分布式數(shù)據(jù)庫(kù)架構(gòu)(學(xué)習(xí)了MongoDB)

緩存產(chǎn)品介紹:
memcached (大公司會(huì)做二次開發(fā))
redis
Tair

Redis教程—菜鳥教程

1. Redis功能介紹

數(shù)據(jù)類型豐富    (筆試潦嘶、面試)*****
支持持久化      (筆試贰锁、面試) *****
多種內(nèi)存分配及回收策略
支持弱事務(wù)            (面試)    ****
消息隊(duì)列巷屿、消息訂閱 
支持高可用                                 ****
支持分布式分片集群 (面試)   *****
緩存穿透\雪崩(筆試固以、面試)   *****
Redis API                  **
資料

2、企業(yè)緩存產(chǎn)品介紹

Memcached:
優(yōu)點(diǎn):高性能讀寫嘱巾、單一數(shù)據(jù)類型憨琳、支持客戶端式分布式集群、一致性hash
多核結(jié)構(gòu)旬昭、多線程讀寫性能高篙螟。
缺點(diǎn):無(wú)持久化、節(jié)點(diǎn)故障可能出現(xiàn)緩存穿透问拘、分布式需要客戶端實(shí)現(xiàn)遍略、跨機(jī)房數(shù)據(jù)同步困難、架構(gòu)擴(kuò)容復(fù)雜度高
Redis:  優(yōu)點(diǎn):高性能讀寫场梆、多數(shù)據(jù)類型支持墅冷、數(shù)據(jù)持久化纯路、高可用架構(gòu)或油、支持自定義虛擬內(nèi)存、支持分布式分片集群驰唬、單線程讀寫性能極高
缺點(diǎn):多線程讀寫較Memcached慢
新浪顶岸、京東、直播類平臺(tái)叫编、網(wǎng)頁(yè)游戲
    
memcache與redis在讀寫性能的對(duì)比
memcached 適合,多用戶訪問(wèn),每個(gè)用戶少量的rw
redis     適合,少用戶訪問(wèn),每個(gè)用戶大量rw 
            
Tair:
優(yōu)點(diǎn):高性能讀寫辖佣、支持三種存儲(chǔ)引擎(ddb、rdb搓逾、ldb)卷谈、支持高可用、支持分布式分片集群霞篡、支撐了幾乎所有淘寶業(yè)務(wù)的緩存世蔗。
    缺點(diǎn):?jiǎn)螜C(jī)情況下,讀寫性能較其他兩種產(chǎn)品較慢

3朗兵、Redis使用場(chǎng)景介紹

Memcached:多核的緩存服務(wù)污淋,更加適合于多用戶并發(fā)訪問(wèn)次數(shù)較少的應(yīng)用場(chǎng)景
Redis:?jiǎn)魏说木彺娣?wù),單節(jié)點(diǎn)情況下余掖,更加適合于少量用戶寸爆,多次訪問(wèn)的應(yīng)用場(chǎng)景。
Redis一般是單機(jī)多實(shí)例架構(gòu),配合redis集群出現(xiàn)赁豆。


4仅醇、Redis安裝部署:

軟件下載鏈接: 提取碼: tdhg

下載:
wget http://download.redis.io/releases/redis-3.2.12.tar.gz
解壓:
上傳至 /data
tar xzf redis-3.2.12.tar.gz
mv redis-3.2.12 redis

安裝:
yum -y install gcc automake autoconf libtool make
cd redis
make

環(huán)境變量:
vim /etc/profile 
export PATH=/data/redis/src:$PATH
source /etc/profile 

啟動(dòng):
redis-server & 

連接測(cè)試:
redis-cli 
127.0.0.1:6379> set num 10
OK
127.0.0.1:6379> get num
10

5、Redis基本管理操作

5.1基礎(chǔ)配置文件介紹

mkdir /data/6379
cat > /data/6379/redis.conf<<EOF
daemonize yes
port 6379
logfile /data/6379/redis.log
dir /data/6379
dbfilename dump.rdb
EOF


redis-cli shutdown 
redis-server /data/6379/redis.conf 
netstat -lnp|grep 63

+++++++++++配置文件說(shuō)明++++++++++++++
redis.conf
是否后臺(tái)運(yùn)行:
daemonize yes
默認(rèn)端口:
port 6379
日志文件位置
logfile /var/log/redis.log
持久化文件存儲(chǔ)位置
dir /data/6379
RDB持久化數(shù)據(jù)文件:
dbfilename dump.rdb
++++++++++++++++++++++++++++++++++++++
redis-cli
127.0.0.1:6379> set name zhangsan 
OK
127.0.0.1:6379> get name
"zhangsan"

5.2 redis安全配置

`redis默認(rèn)開啟了保護(hù)模式魔种,只允許本地回環(huán)地址登錄并訪問(wèn)數(shù)據(jù)庫(kù)着憨。`
禁止protected-mode
protected-mode yes/no (保護(hù)模式,是否只允許本地訪問(wèn))

[root@db01 /data/redis]# redis-cli -h 10.0.0.51 -p 6379
10.0.0.51:6379> get alex


報(bào)錯(cuò)信息翻譯
(1)Bind :指定IP進(jìn)行監(jiān)聽
vim /data/6379/redis.conf
bind 10.0.0.51  127.0.0.1

(2)增加requirepass  {password}
vim /data/6379/redis.conf
requirepass 123456

----------驗(yàn)證-----
方法一:
[root@db03 ~]# redis-cli -a 123456
127.0.0.1:6379> set name zhangsan 
OK
127.0.0.1:6379> exit
方法二:
[root@db03 ~]# redis-cli
127.0.0.1:6379> auth 123456
OK
127.0.0.1:6379> set a b
[root@db01 src]# redis-cli -a 123 -h 10.0.0.51 -p 6379
10.0.0.51:6379> set b 2
OK

5.3 在線查看和修改配置

CONFIG GET *
CONFIG GET requirepass    密碼
CONFIG GET r*             以r開頭的模糊查詢
CONFIG SET requirepass 123  修改密碼

5.4 redis持久化(內(nèi)存數(shù)據(jù)保存到磁盤)

RDB和AOF詳細(xì)介紹

RDB务嫡、AOF

5.4.1. RDB 持久化

    可以在指定的時(shí)間間隔內(nèi)生成數(shù)據(jù)集的 時(shí)間點(diǎn)快照(point-in-time snapshot)甲抖。
    優(yōu)點(diǎn):速度快,適合于用做備份心铃,主從復(fù)制也是基于RDB持久化功能實(shí)現(xiàn)的准谚。
    缺點(diǎn):會(huì)有數(shù)據(jù)丟失

127.0.0.1:6379> save    拍攝快照
OK

2. rdb持久化核心配置參數(shù):
vim /data/6379/redis.conf
dir /data/6379
dbfilename dump.rdb
save 900 1       #900秒內(nèi)只要有1個(gè)變更就做持RDB久化
save 300 10      #300秒內(nèi)只要有10個(gè)變更就做RDB持久化
save 60 10000    #60秒內(nèi)只要有1萬(wàn)個(gè)變更就做RDB持久化

3. 配置分別表示:
900秒(15分鐘)內(nèi)有1個(gè)更改
300秒(5分鐘)內(nèi)有10個(gè)更改
60秒內(nèi)有10000個(gè)更改

5.4.2 AOF 持久化(append-only log file)

類似于mysql的 binlog

1. 介紹
    記錄服務(wù)器執(zhí)行的所有寫操作命令,并在服務(wù)器啟動(dòng)時(shí)去扣,通過(guò)重新執(zhí)行這些命令來(lái)還原數(shù)據(jù)集柱衔。 
    AOF 文件中的命令全部以 Redis 協(xié)議的格式來(lái)保存,新命令會(huì)被追加到文件的末尾愉棱。
    優(yōu)點(diǎn):可以最大程度保證數(shù)據(jù)不丟唆铐,可以把所有記錄都記下來(lái)
    缺點(diǎn):日志記錄量級(jí)比較大

2. AOF持久化配置
appendonly yes        開關(guān)
刷寫策略
appendfsync always    總是
appendfsync everysec  每秒
appendfsync no    

是否打開aof日志功能
每1個(gè)命令,都立即同步到aof 
每秒寫1次
寫入工作交給操作系統(tǒng),由操作系統(tǒng)判斷緩沖區(qū)大小,統(tǒng)一寫入到aof.

vim /data/6379/redis.conf
appendonly yes
appendfsync everysec 
重啟
redis-cli -a 123456 shutdown
redis-server /data/6379/redis.conf 

面試:
redis 持久化方式有哪些?有什么區(qū)別奔滑?
rdb:基于快照的持久化净嘀,速度更快,一般用作備份桅咆,主從復(fù)制也是依賴于rdb持久化功能
aof:以追加的方式記錄redis操作日志的文件斗遏。可以最大程度的保證redis數(shù)據(jù)安全梅猿,類似于mysql的binlog


※6氓辣、Redis數(shù)據(jù)類型(筆試):

6.1 介紹

String :      字符類型
Hash:         字典類型
List:         列表     
Set:          集合 
Sorted set:   有序集合
string : 計(jì)數(shù)器應(yīng)用 , session 共享
hash : MySQL數(shù)據(jù)庫(kù)緩存,canal mysql 自動(dòng) redis
list : 朋友圈
set : 集合操作 : 共同好友,共同喜好、二度好友等功能袱蚓,
sortset : 排行榜

6.2 KEY的通用操作

KEYS *   keys a  keys a*    查看已存在所有鍵的名字   ****
TYPE                        返回鍵所存儲(chǔ)值的類型     ****
EXPIRE\ PEXPIRE             以秒\毫秒設(shè)定生存時(shí)間       ***
TTL\ PTTL                   以秒\毫秒為單位返回生存時(shí)間 ***
PERSIST                     取消生存時(shí)間設(shè)置            ***
DEL                         刪除一個(gè)key
EXISTS                      檢查是否存在
RENAME                      變更KEY名
---例子介紹:
(1)KEYS *   keys a  keys a*    查看已存在所有鍵的名字   ****
127.0.0.1:6379> KEYS *    生產(chǎn)中禁止直接" * "號(hào)查看,
(empty list or set)
127.0.0.1:6379> set alex sb
OK
127.0.0.1:6379> set a 1 
OK
127.0.0.1:6379> set b 2
OK
127.0.0.1:6379> KEYS *
1) "a"
2) "alex"
3) "b"

(2)TYPE                        返回鍵所存儲(chǔ)值的類型     ****
127.0.0.1:6379> type a
string

(3)EXPIRE\ PEXPIRE             以秒\毫秒設(shè)定生存時(shí)間       ***
TTL\ PTTL                   以秒\毫秒為單位返回生存時(shí)間 ***
127.0.0.1:6379> TTL a
(integer) -1     -1表示不過(guò)期
127.0.0.1:6379> EXPIRE a 60
(integer) 1
127.0.0.1:6379> TTL a
(integer) 57
127.0.0.1:6379> TTL a
(integer) 0
127.0.0.1:6379> TTL a
(integer) -2    -2表示鍵值對(duì)沒(méi)有了
127.0.0.1:6379> TTL a


(4)PERSIST                     取消生存時(shí)間設(shè)置            ***
127.0.0.1:6379> EXPIRE alex 60
(integer) 1
127.0.0.1:6379> TTL alex
(integer) 56
127.0.0.1:6379> PERSIST alex
(integer) 1
127.0.0.1:6379> TTL alex
(integer) -1

(5)DEL                         刪除一個(gè)key
127.0.0.1:6379> del alex
(integer) 1
127.0.0.1:6379> TTL alex
(integer) -2

(6)EXISTS                      檢查是否存在
127.0.0.1:6379> EXISTS alex
(integer) 0    0表示不在了
127.0.0.1:6379> EXISTS b
(integer) 1    1表示在

(7)RENAME                      變更KEY名
127.0.0.1:6379> RENAME b bb
OK
127.0.0.1:6379> KEYS *
1) "bb"

---例子:
127.0.0.1:6379> set name zhangsan 
127.0.0.1:6379> EXPIRE name 60
(integer) 1
127.0.0.1:6379> ttl name
(integer) 57
127.0.0.1:6379> set a b ex 60
OK
127.0.0.1:6379> ttl a
127.0.0.1:6379> PERSIST a
(integer) 1
127.0.0.1:6379> ttl a
(integer) -1

6.3 Strings

※應(yīng)用場(chǎng)景※
session 共享
常規(guī)計(jì)數(shù):微博數(shù)钞啸,粉絲數(shù),訂閱喇潘、禮物
key:value
----------
運(yùn)維掌握應(yīng)用場(chǎng)景即可
----------
(1)
 set name zhangsan  
(2)
 MSET id 101 name zhangsan age 20 gender m
 等價(jià)于以下操作:
 SET id 101 
 set name zhangsan 
 set age 20 
 set gender m
(3)計(jì)數(shù)器
每點(diǎn)一次關(guān)注体斩,都執(zhí)行以下命令一次
127.0.0.1:6379> incr num
顯示粉絲數(shù)量:
127.0.0.1:6379> get num

暗箱操作:
127.0.0.1:6379> INCRBY num 10000
(integer) 10006
127.0.0.1:6379> get num
"10006"
127.0.0.1:6379> DECRBY num 10000
(integer) 6
127.0.0.1:6379> get num
"6"
詳細(xì)的例子:------------------------------------

增
set mykey "test"                為鍵設(shè)置新值,并覆蓋原有值
getset mycounter 0              設(shè)置值,取值同時(shí)進(jìn)行
setex mykey 10 "hello"          設(shè)置指定 Key 的過(guò)期時(shí)間為10秒,在存活時(shí)間可以獲取value
setnx mykey "hello"             若該鍵不存在响蓉,則為鍵設(shè)置新值
mset key3  "zyx"  key4 "xyz"    批量設(shè)置鍵

刪
del mykey                        刪除已有鍵

改
append mykey "hello"            若該鍵并不存在,返回當(dāng)前 Value 的長(zhǎng)度
                                該鍵已經(jīng)存在硕勿,返回追加后 Value的長(zhǎng)度
incr mykey                      值增加1,若該key不存在,創(chuàng)建key,初始值設(shè)為0,增加后結(jié)果為1
decrby  mykey  5                值減少5
setrange mykey 20 dd            把第21和22個(gè)字節(jié),替換為dd, 超過(guò)value長(zhǎng)度,自動(dòng)補(bǔ)0
查  
exists mykey                    判斷該鍵是否存在,存在返回 1枫甲,否則返回0
get mykey                       獲取Key對(duì)應(yīng)的value
strlen mykey                    獲取指定 Key 的字符長(zhǎng)度
ttl mykey                       查看一下指定 Key 的剩余存活時(shí)間(秒數(shù))
getrange mykey 1 20             獲取第2到第20個(gè)字節(jié),若20超過(guò)value長(zhǎng)度,則截取第2個(gè)和后面所有的
mget key3 key4                  批量獲取鍵

6.4 hash類型(字典類型)

# 將mysql中的表導(dǎo)入到redis中
db01 [test]>select concat("hmset t100w_",id," id ",id," num ",num," k1 ",k1," k2 ",k2," dt ","'",dt,"'") from t100w where id<100 into outfile '/tmp/t100w.txt';
+---------------------------------------------------------------------------------------+
| concat("hmset t100w_",id," id ",id," num ",num," k1 ",k1," k2 ",k2," dt ","'",dt,"'") |
+---------------------------------------------------------------------------------------+
| hmset t100w_1 id 1 num 25503 k1 0M k2 IJ56 dt '2019-08-12 11:41:16'                   |
| hmset t100w_2 id 2 num 756660 k1 rx k2 bc67 dt '2019-08-12 11:41:16'                  |
| hmset t100w_3 id 3 num 876710 k1 2m k2 tu67 dt '2019-08-12 11:41:16'                  |
...
[root@db01 /data/6379]# cat /tmp/t100w.txt |redis-cli -a 123456
[root@db01 /data/6379]# redis-cli -a 123456
127.0.0.1:6379> KEYS *
  1) "t100w_60"
  2) "t100w_74"
  3) "t100w_75"
  4) "t100w_15"
  5) "t100w_24"
  6) "t100w_45"
應(yīng)用場(chǎng)景:
存儲(chǔ)部分變更的數(shù)據(jù)源武,如用戶信息等扼褪。
最接近mysql表結(jié)構(gòu)的一種類型
主要是可以做數(shù)據(jù)庫(kù)緩存。

存數(shù)據(jù):
hmset stu  id 101 name zhangsan age 20 gender m
hmset stu1 id 102 name zhangsan1 age 21 gender f

取數(shù)據(jù):
HMGET stu id name age gender
HMGET stu1 id name age gender

select concat("hmset city_",id," id ",id," name ",name," countrycode ",countrycode," district ",district," population ",population) from city limit 10 into outfile '/tmp/hmset.txt'

---------------------更多的例子
增
hset myhash field1 "s"    
若字段field1不存在,創(chuàng)建該鍵及與其關(guān)聯(lián)的Hashes, Hashes中,key為field1 ,并設(shè)value為s 粱栖,若存在會(huì)覆蓋原value
hsetnx myhash field1 s    
若字段field1不存在,創(chuàng)建該鍵及與其關(guān)聯(lián)的Hashes, Hashes中,key為field1 ,并設(shè)value為s话浇, 若字段field1存在,則無(wú)效
hmset myhash field1 "hello" field2 "world       一次性設(shè)置多個(gè)字段
刪
hdel myhash field1                      刪除 myhash 鍵中字段名為 field1 的字段
del myhash                              刪除鍵
改  
hincrby myhash field 1                  給field的值加1

查
hget myhash field1                      獲取鍵值為 myhash,字段為 field1 的值
hlen myhash                             獲取myhash鍵的字段數(shù)量
hexists myhash field1                   判斷 myhash 鍵中是否存在字段名為 field1 的字段
hmget myhash field1 field2 field3       一次性獲取多個(gè)字段
hgetall myhash                          返回 myhash 鍵的所有字段及其值
hkeys myhash                            獲取myhash 鍵中所有字段的名字
hvals myhash                            獲取 myhash 鍵中所有字段的值

6.5 LIST(列表)

應(yīng)用場(chǎng)景
消息隊(duì)列系統(tǒng)
比如sina微博
在Redis中我們的最新微博ID使用了常駐緩存,這是一直更新的闹究。
但是做了限制不能超過(guò)5000個(gè)ID幔崖,因此獲取ID的函數(shù)會(huì)一直詢問(wèn)Redis。
只有在start/count參數(shù)超出了這個(gè)范圍的時(shí)候渣淤,才需要去訪問(wèn)數(shù)據(jù)庫(kù)赏寇。
系統(tǒng)不會(huì)像傳統(tǒng)方式那樣“刷新”緩存,Redis實(shí)例中的信息永遠(yuǎn)是一致的价认。
SQL數(shù)據(jù)庫(kù)(或是硬盤上的其他類型數(shù)據(jù)庫(kù))只是在用戶需要獲取“很遠(yuǎn)”的數(shù)據(jù)時(shí)才會(huì)被觸發(fā)嗅定,
而主頁(yè)或第一個(gè)評(píng)論頁(yè)是不會(huì)麻煩到硬盤上的數(shù)據(jù)庫(kù)了。

微信朋友圈:
127.0.0.1:6379> LPUSH wechat "today is nice day !"
127.0.0.1:6379> LPUSH wechat "today is bad day !"
127.0.0.1:6379> LPUSH wechat "today is good  day !"
127.0.0.1:6379> LPUSH wechat "today is rainy  day !"
127.0.0.1:6379> LPUSH wechat "today is friday !"

[5,4,3,2,1]
 0 1 2 3 4 

[e,d,c,b,a]
0 1 2 3  4


127.0.0.1:6379> lrange wechat  0 0
1) "today is friday !"
127.0.0.1:6379> lrange wechat  0 1
1) "today is friday !"
2) "today is rainy  day !"
127.0.0.1:6379> lrange wechat  0 2
1) "today is friday !"
2) "today is rainy  day !"
3) "today is good  day !"
127.0.0.1:6379> lrange wechat  0 3
127.0.0.1:6379> lrange wechat  -2 -1
1) "today is bad day !"
2) "today is nice day !"

[root@db01 /tmp]# redis-cli -a 123456
127.0.0.1:6379> lpush pyq "jin tian shi 1"
(integer) 1
127.0.0.1:6379> lpush pyq "jin tian shi 2"
(integer) 2
127.0.0.1:6379> lpush pyq "jin tian shi 3"
(integer) 3
127.0.0.1:6379> lpush pyq "jin tian shi 4"
(integer) 4
127.0.0.1:6379> lpush pyq "jin tian shi 5"
(integer) 5
127.0.0.1:6379> LRANGE pyq 0 -1
1) "jin tian shi 5"
2) "jin tian shi 4"
3) "jin tian shi 3"
4) "jin tian shi 2"
5) "jin tian shi 1"
127.0.0.1:6379> LRANGE pyq 0 0 
1) "jin tian shi 5"
127.0.0.1:6379> LRANGE pyq 0 1
1) "jin tian shi 5"
2) "jin tian shi 4"
127.0.0.1:6379> LRANGE pyq 0 2
1) "jin tian shi 5"
2) "jin tian shi 4"
3) "jin tian shi 3"
127.0.0.1:6379>


-----------------
增 
lpush mykey a b             若key不存在,創(chuàng)建該鍵及與其關(guān)聯(lián)的List,依次插入a ,b用踩, 若List類型的key存在,則插入value中
lpushx mykey2 e             若key不存在,此命令無(wú)效渠退, 若key存在,則插入value中
linsert mykey before a a1   在 a 的前面插入新元素 a1
linsert mykey after e e2    在e 的后面插入新元素 e2
rpush mykey a b             在鏈表尾部先插入b,在插入a
rpushx mykey e              若key存在,在尾部插入e, 若key不存在,則無(wú)效
rpoplpush mykey mykey2      將mykey的尾部元素彈出,再插入到mykey2 的頭部(原子性的操作)
刪
del mykey                   刪除已有鍵 
lrem mykey 2 a              從頭部開始找,按先后順序,值為a的元素,刪除數(shù)量為2個(gè),若存在第3個(gè),則不刪除
ltrim mykey 0 2             從頭開始,索引為0,1,2的3個(gè)元素,其余全部刪除
改
lset mykey 1 e              從頭開始, 將索引為1的元素值,設(shè)置為新值 e,若索引越界,則返回錯(cuò)誤信息
rpoplpush mykey mykey       將 mykey 中的尾部元素移到其頭部
查
lrange mykey 0 -1           取鏈表中的全部元素,其中0表示第一個(gè)元素,-1表示最后一個(gè)元素脐彩。
lrange mykey 0 2            從頭開始,取索引為0,1,2的元素
lrange mykey 0 0            從頭開始,取第一個(gè)元素,從第0個(gè)開始,到第0個(gè)結(jié)束
lpop mykey                  獲取頭部元素,并且彈出頭部元素,出棧
lindex mykey 6              從頭開始,獲取索引為6的元素 若下標(biāo)越界,則返回nil 

6.6 SET 集合類型(join union)

小璐和乃亮的故事9

應(yīng)用場(chǎng)景:
案例:在微博應(yīng)用中碎乃,可以將一個(gè)用戶所有的關(guān)注人存在一個(gè)集合中,將其所有粉絲存在一個(gè)集合惠奸。
Redis還為集合提供了求交集梅誓、并集、差集等操作晨川,可以非常方便的實(shí)現(xiàn)如共同關(guān)注证九、共同喜好删豺、二度好友等功能共虑,
對(duì)上面的所有集合操作,你還可以使用不同的命令選擇將結(jié)果返回給客戶端還是存集到一個(gè)新的集合中呀页。

127.0.0.1:6379> sadd lxl pg1 jnl baoqiang gsy alexsb
(integer) 5
127.0.0.1:6379> sadd jnl baoqiang ms bbh yf wxg
(integer) 5
127.0.0.1:6379> SUNION lx jnl
1) "baoqiang"
2) "yf"
3) "bbh"
4) "ms"
5) "wxg"
127.0.0.1:6379> SUNION lxl  jnl
1) "gsy"
2) "yf"
3) "alexsb"
4) "bbh"
5) "jnl"
6) "pg1"
7) "baoqiang"
8) "ms"
9) "wxg"
127.0.0.1:6379> 
127.0.0.1:6379> 
127.0.0.1:6379> 
127.0.0.1:6379> 
127.0.0.1:6379> SINTER lxl jnl
1) "baoqiang"
127.0.0.1:6379> 
127.0.0.1:6379> 
127.0.0.1:6379> 
127.0.0.1:6379> 
127.0.0.1:6379> 
127.0.0.1:6379> 
127.0.0.1:6379> SDIFF jnl lxl
1) "wxg"
2) "yf"
3) "bbh"
4) "ms"
127.0.0.1:6379> 
127.0.0.1:6379> 
127.0.0.1:6379> 
127.0.0.1:6379> 
127.0.0.1:6379> SDIFF lxl jnl
1) "jnl"
2) "pg1"
3) "gsy"
4) "alexsb"

增
sadd myset a b c  
若key不存在,創(chuàng)建該鍵及與其關(guān)聯(lián)的set,依次插入a ,b,若key存在,則插入value中,若a 在myset中已經(jīng)存在,則插入了 d 和 e 兩個(gè)新成員妈拌。
刪
spop myset              尾部的b被移出,事實(shí)上b并不是之前插入的第一個(gè)或最后一個(gè)成員
srem myset a d f        若f不存在, 移出 a、d ,并返回2
改
smove myset myset2 a        將a從 myset 移到 myset2蓬蝶,
查
sismember myset a           判斷 a 是否已經(jīng)存在尘分,返回值為 1 表示存在。
smembers myset          查看set中的內(nèi)容
scard myset             獲取Set 集合中元素的數(shù)量
srandmember myset       隨機(jī)的返回某一成員
sdiff myset1 myset2 myset3      1和2得到一個(gè)結(jié)果,拿這個(gè)集合和3比較,獲得每個(gè)獨(dú)有的值
sdiffstore diffkey myset myset2 myset3      3個(gè)集和比較,獲取獨(dú)有的元素,并存入diffkey 關(guān)聯(lián)的Set中
sinter myset myset2 myset3              獲得3個(gè)集合中都有的元素
sinterstore interkey myset myset2 myset3  把交集存入interkey 關(guān)聯(lián)的Set中
sunion myset myset2 myset3              獲取3個(gè)集合中的成員的并集
sunionstore unionkey myset myset2 myset3  把并集存入unionkey 關(guān)聯(lián)的Set中

6.7 SortedSet(有序集合)

應(yīng)用場(chǎng)景:
排行榜應(yīng)用丸氛,取TOP N操作
這個(gè)需求與上面需求的不同之處在于培愁,前面操作以時(shí)間為權(quán)重,這個(gè)是以某個(gè)條件為權(quán)重缓窜,比如按頂?shù)拇螖?shù)排序定续,
這時(shí)候就需要我們的sorted set出馬了谍咆,將你要排序的值設(shè)置成sorted set的score,將具體的數(shù)據(jù)設(shè)置成相應(yīng)的value私股,
每次只需要執(zhí)行一條ZADD命令即可摹察。

127.0.0.1:6379> zadd topN 0 smlt 0 fskl 0 fshkl 0 lzlsfs 0 wdhbx 0 wxg 
(integer) 6
127.0.0.1:6379> ZINCRBY topN 100000 smlt
"100000"
127.0.0.1:6379> ZINCRBY topN 10000 fskl
"10000"
127.0.0.1:6379> ZINCRBY topN 1000000 fshkl
"1000000"
127.0.0.1:6379> ZINCRBY topN 100 lzlsfs
"100"
127.0.0.1:6379> ZINCRBY topN 10 wdhbx
"10"
127.0.0.1:6379> ZINCRBY topN 100000000 wxg
"100000000"

127.0.0.1:6379> ZREVRANGE topN 0 2 
1) "wxg"
2) "fshkl"
3) "smlt"
127.0.0.1:6379> ZREVRANGE topN 0 2 withscores
1) "wxg"
2) "100000000"
3) "fshkl"
4) "1000000"
5) "smlt"
6) "100000"
127.0.0.1:6379> 

增
zadd myzset 2 "two" 3 "three"       添加兩個(gè)分?jǐn)?shù)分別是 2 和 3 的兩個(gè)成員
刪
zrem myzset one two                 刪除多個(gè)成員變量,返回刪除的數(shù)量
改
zincrby myzset 2 one                將成員 one 的分?jǐn)?shù)增加 2,并返回該成員更新后的分?jǐn)?shù)
查 
zrange myzset 0 -1 WITHSCORES       返回所有成員和分?jǐn)?shù),不加WITHSCORES,只返回成員
zrank myzset one                    獲取成員one在Sorted-Set中的位置索引值倡鲸。0表示第一個(gè)位置
zcard myzset                        獲取 myzset 鍵中成員的數(shù)量
zcount myzset 1 2                   獲取分?jǐn)?shù)滿足表達(dá)式 1 <= score <= 2 的成員的數(shù)量
zscore myzset three                 獲取成員 three 的分?jǐn)?shù)
zrangebyscore myzset  1 2               獲取分?jǐn)?shù)滿足表達(dá)式 1 < score <= 2 的成員
#-inf 表示第一個(gè)成員供嚎,+inf最后一個(gè)成員
#limit限制關(guān)鍵字
#2  3  是索引號(hào)
zrangebyscore myzset -inf +inf limit 2 3  返回索引是2和3的成員
zremrangebyscore myzset 1 2         刪除分?jǐn)?shù) 1<= score <= 2 的成員,并返回實(shí)際刪除的數(shù)量
zremrangebyrank myzset 0 1              刪除位置索引滿足表達(dá)式 0 <= rank <= 1 的成員
zrevrange myzset 0 -1 WITHSCORES        按位置索引從高到低,獲取所有成員和分?jǐn)?shù)
#原始成員:位置索引從小到大
      one  0  
      two  1
#執(zhí)行順序:把索引反轉(zhuǎn)
      位置索引:從大到小
      one 1
      two 0
#輸出結(jié)果: two  
       one
zrevrange myzset 1 3                獲取位置索引,為1,2,3的成員
#相反的順序:從高到低的順序
zrevrangebyscore myzset 3 0             獲取分?jǐn)?shù) 3>=score>=0的成員并以相反的順序輸出
zrevrangebyscore myzset 4 0 limit 1 2    獲取索引是1和2的成員,并反轉(zhuǎn)位置索引

7. 發(fā)布訂閱

image.png

PUBLISH channel msg
    將信息 message 發(fā)送到指定的頻道 channel
SUBSCRIBE channel [channel ...]
    訂閱頻道峭状,可以同時(shí)訂閱多個(gè)頻道
UNSUBSCRIBE [channel ...]
    取消訂閱指定的頻道, 如果不指定頻道克滴,則會(huì)取消訂閱所有頻道
PSUBSCRIBE pattern [pattern ...]
    訂閱一個(gè)或多個(gè)符合給定模式的頻道,每個(gè)模式以 * 作為匹配符优床,比如 it* 匹配所   有以 it 開頭的頻道( it.news 偿曙、 it.blog 、 it.tweets 等等)羔巢, news.* 匹配所有 以 news. 開頭的頻道( news.it 望忆、 news.global.today 等等),諸如此類
PUNSUBSCRIBE [pattern [pattern ...]]
    退訂指定的規(guī)則, 如果沒(méi)有參數(shù)則會(huì)退訂所有規(guī)則
PUBSUB subcommand [argument [argument ...]]
    查看訂閱與發(fā)布系統(tǒng)狀態(tài)
注意:使用發(fā)布訂閱模式實(shí)現(xiàn)的消息隊(duì)列竿秆,當(dāng)有客戶端訂閱channel后只能收到后續(xù)發(fā)布到該頻道的消息启摄,之前發(fā)送的不會(huì)緩存,必須Provider和Consumer同時(shí)在線幽钢。

發(fā)布訂閱例子:
窗口1:
127.0.0.1:6379> SUBSCRIBE baodi 
窗口2:
127.0.0.1:6379> PUBLISH baodi "jin tian zhen kaixin!"
訂閱多頻道:
窗口1:
127.0.0.1:6379> PSUBSCRIBE wang*
窗口2:
127.0.0.1:6379> PUBLISH wangbaoqiang "jintian zhennanshou "

8歉备、Redis事務(wù)

redis的事務(wù)是基于隊(duì)列實(shí)現(xiàn)的。
mysql的事務(wù)是基于事務(wù)日志和鎖機(jī)制實(shí)現(xiàn)的匪燕。
redis是樂(lè)觀鎖機(jī)制蕾羊。

開啟事務(wù)功能時(shí)(multi)
multi 
command1      
command2
command3
command4
exec 
discard

4條語(yǔ)句作為一個(gè)組,并沒(méi)有真正執(zhí)行帽驯,而是被放入同一隊(duì)列中龟再。
如果,這是執(zhí)行discard尼变,會(huì)直接丟棄隊(duì)列中所有的命令利凑,而不是做回滾。
exec
當(dāng)執(zhí)行exec時(shí)嫌术,對(duì)列中所有操作哀澈,要么全成功要么全失敗
127.0.0.1:6379> set a b
OK
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> set a b
QUEUED
127.0.0.1:6379> set c d
QUEUED
127.0.0.1:6379> exec
1) OK
2) OK

9. redis樂(lè)觀鎖實(shí)現(xiàn)(模擬買票)

發(fā)布一張票
set ticket 1
窗口1:
watch ticket
multi
set ticket 0       1---->0
窗口2:
multi 
set ticket 0 
exec 
窗口1:
exec

10、 服務(wù)器管理命令

Info
Client list
Client kill ip:port
config get *
CONFIG RESETSTAT 重置統(tǒng)計(jì)
CONFIG GET/SET 動(dòng)態(tài)修改
Dbsize
FLUSHALL 清空所有數(shù)據(jù) 
select 1
FLUSHDB 清空當(dāng)前庫(kù)
MONITOR 監(jiān)控實(shí)時(shí)指令
SHUTDOWN 關(guān)閉服務(wù)器

關(guān)閉數(shù)據(jù)庫(kù):
redis-cli -a root shutdown
關(guān)閉服務(wù)器:
redis-cli -a 123456 monitor >/tmp/db.txt &
SHUTDOWN 

11度气、redis(Master-Replicaset) *****

11.1 原理:

1. 副本庫(kù)通過(guò)slaveof 10.0.0.51 6379命令,連接主庫(kù),并發(fā)送SYNC給主庫(kù) 
2. 主庫(kù)收到SYNC,會(huì)立即觸發(fā)BGSAVE,后臺(tái)保存RDB,發(fā)送給副本庫(kù)
3. 副本庫(kù)接收后會(huì)應(yīng)用RDB快照
4. 主庫(kù)會(huì)陸續(xù)將中間產(chǎn)生的新的操作,保存并發(fā)送給副本庫(kù)
5. 到此,我們主復(fù)制集就正常工作了
6. 再此以后,主庫(kù)只要發(fā)生新的操作,都會(huì)以命令傳播的形式自動(dòng)發(fā)送給副本庫(kù).
7. 所有復(fù)制相關(guān)信息,從info信息中都可以查到.即使重啟任何節(jié)點(diǎn),他的主從關(guān)系依然都在.
8. 如果發(fā)生主從關(guān)系斷開時(shí),從庫(kù)數(shù)據(jù)沒(méi)有任何損壞,在下次重連之后,從庫(kù)發(fā)送PSYNC給主庫(kù)
9. 主庫(kù)只會(huì)將從庫(kù)缺失部分的數(shù)據(jù)同步給從庫(kù)應(yīng)用,達(dá)到快速恢復(fù)主從的目的

11.2 主從數(shù)據(jù)一致性保證

min-slaves-to-write 1
min-slaves-max-lag  3

11.3 主庫(kù)是否要開啟持久化割按?

如果不開有可能,主庫(kù)重啟操作磷籍,造成所有主從數(shù)據(jù)丟失适荣!

12. 主從復(fù)制實(shí)現(xiàn)

1丙躏、環(huán)境:
準(zhǔn)備兩個(gè)或兩個(gè)以上redis實(shí)例

mkdir /data/638{0..2}

配置文件示例:
cat >> /data/6380/redis.conf <<EOF
port 6380
daemonize yes
pidfile /data/6380/redis.pid
loglevel notice
logfile "/data/6380/redis.log"
dbfilename dump.rdb
dir /data/6380
requirepass 123
masterauth 123
EOF


cat >>   /data/6381/redis.conf <<EOF
port 6381
daemonize yes
pidfile /data/6381/redis.pid
loglevel notice
logfile "/data/6381/redis.log"
dbfilename dump.rdb
dir /data/6381
requirepass 123
masterauth 123
EOF


cat >>   /data/6382/redis.conf <<EOF
port 6382
daemonize yes
pidfile /data/6382/redis.pid
loglevel notice
logfile "/data/6382/redis.log"
dbfilename dump.rdb
dir /data/6382
requirepass 123
masterauth 123
EOF


啟動(dòng):
redis-server /data/6380/redis.conf
redis-server /data/6381/redis.conf
redis-server /data/6382/redis.conf

主節(jié)點(diǎn):6380
從節(jié)點(diǎn):6381、6382

2束凑、開啟主從:
6381/6382命令行:

redis-cli -p 6381 -a 123 SLAVEOF 127.0.0.1 6380
redis-cli -p 6382 -a 123 SLAVEOF 127.0.0.1 6380


3晒旅、查詢主從狀態(tài)
 redis-cli -p 6380 -a 123 info replication
 redis-cli -p 6381 -a 123 info replication
 redis-cli -p 6382 -a 123 info replication

13 redis-sentinel(哨兵)

1、監(jiān)控
2汪诉、自動(dòng)選主废恋,切換(6381 slaveof no one)
3、2號(hào)從庫(kù)(6382)指向新主庫(kù)(6381)
4扒寄、應(yīng)用透明 
5鱼鼓、自動(dòng)處理故障節(jié)點(diǎn)

sentinel搭建過(guò)程

mkdir /data/26380
cd /data/26380
vim sentinel.conf
port 26380
dir "/data/26380"
sentinel monitor mymaster 127.0.0.1 6380 1
sentinel down-after-milliseconds mymaster 5000
sentinel auth-pass mymaster 123 

啟動(dòng):
[root@db01 26380]# redis-sentinel /data/26380/sentinel.conf  &>/tmp/sentinel.log &

==============================
如果有問(wèn)題:
1、重新準(zhǔn)備1主2從環(huán)境
2该编、kill掉sentinel進(jìn)程
3迄本、刪除sentinel目錄下的所有文件
4、重新搭建sentinel
======================================

停主庫(kù)測(cè)試:
 
[root@db01 ~]# redis-cli -p 6380 shutdown
[root@db01 ~]# redis-cli -p 6381
info replication

啟動(dòng)源主庫(kù)(6380)课竣,看狀態(tài)嘉赎。

Sentinel管理命令:
redis-cli -p 26380
PING :返回 PONG 。
SENTINEL masters :列出所有被監(jiān)視的主服務(wù)器
SENTINEL slaves <master name> 

SENTINEL get-master-addr-by-name <master name> : 返回給定名字的主服務(wù)器的 IP 地址和端口號(hào)于樟。 
SENTINEL reset <pattern> : 重置所有名字和給定模式 pattern 相匹配的主服務(wù)器公条。 
SENTINEL failover <master name> : 當(dāng)主服務(wù)器失效時(shí), 在不詢問(wèn)其他 Sentinel 意見(jiàn)的情況下迂曲, 強(qiáng)制開始一次自動(dòng)故障遷移靶橱。

14. redis cluster

Redis Cluster原理


14.1 介紹

高性能

1、在多分片節(jié)點(diǎn)中路捧,將16384個(gè)槽位关霸,均勻分布到多個(gè)分片節(jié)點(diǎn)中
2、存數(shù)據(jù)時(shí)杰扫,將key做crc16(key),然后和16384進(jìn)行取模队寇,得出槽位值(0-16383之間)
3、根據(jù)計(jì)算得出的槽位值涉波,找到相對(duì)應(yīng)的分片節(jié)點(diǎn)的主節(jié)點(diǎn)英上,存儲(chǔ)到相應(yīng)槽位上
4、如果客戶端當(dāng)時(shí)連接的節(jié)點(diǎn)不是將來(lái)要存儲(chǔ)的分片節(jié)點(diǎn)啤覆,分片集群會(huì)將客戶端連接切換至真正存儲(chǔ)節(jié)點(diǎn)進(jìn)行數(shù)據(jù)存儲(chǔ)
https://www.php.cn/redis/423851.html

高可用:

在搭建集群時(shí),會(huì)為每一個(gè)分片的主節(jié)點(diǎn)惭聂,對(duì)應(yīng)一個(gè)從節(jié)點(diǎn)窗声,實(shí)現(xiàn)slaveof的功能,同時(shí)當(dāng)主節(jié)點(diǎn)down辜纲,實(shí)現(xiàn)類似于sentinel的自動(dòng)failover的功能笨觅。

1拦耐、redis會(huì)有多組分片構(gòu)成(3組)
2、redis cluster 使用固定個(gè)數(shù)的slot存儲(chǔ)數(shù)據(jù)(一共16384slot)
3见剩、每組分片分得1/3 slot個(gè)數(shù)(0-5500  5501-11000  11001-16383)
4杀糯、基于CRC16(key) % 16384 ====》值 (槽位號(hào))。

14.2 規(guī)劃苍苞、搭建過(guò)程:

6個(gè)redis實(shí)例固翰,一般會(huì)放到3臺(tái)硬件服務(wù)器
注:在企業(yè)規(guī)劃中,一個(gè)分片的兩個(gè)分到不同的物理機(jī)羹呵,防止硬件主機(jī)宕機(jī)造成的整個(gè)分片數(shù)據(jù)丟失骂际。
端口號(hào):7000-7005

安裝集群插件

EPEL源安裝ruby支持
yum install ruby rubygems -y
使用國(guó)內(nèi)源
gem sources -l
gem sources -a http://mirrors.aliyun.com/rubygems/ 
gem sources  --remove https://rubygems.org/
gem sources -l
gem install redis -v 3.3.3

集群節(jié)點(diǎn)準(zhǔn)備

mkdir /data/700{0..5}
cat > /data/7000/redis.conf <<EOF
port 7000
daemonize yes
pidfile /data/7000/redis.pid
loglevel notice
logfile "/data/7000/redis.log"
dbfilename dump.rdb
dir /data/7000
protected-mode no
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
EOF

cat >> /data/7001/redis.conf <<EOF
port 7001
daemonize yes
pidfile /data/7001/redis.pid
loglevel notice
logfile "/data/7001/redis.log"
dbfilename dump.rdb
dir /data/7001
protected-mode no
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
EOF

cat >> /data/7002/redis.conf <<EOF
port 7002
daemonize yes
pidfile /data/7002/redis.pid
loglevel notice
logfile "/data/7002/redis.log"
dbfilename dump.rdb
dir /data/7002
protected-mode no
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
EOF


cat >>  /data/7003/redis.conf <<EOF
port 7003
daemonize yes
pidfile /data/7003/redis.pid
loglevel notice
logfile "/data/7003/redis.log"
dbfilename dump.rdb
dir /data/7003
protected-mode no
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
EOF


cat >> /data/7004/redis.conf <<EOF
port 7004
daemonize yes
pidfile /data/7004/redis.pid
loglevel notice
logfile "/data/7004/redis.log"
dbfilename dump.rdb
dir /data/7004
protected-mode no
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
EOF

cat >> /data/7005/redis.conf <<EOF
port 7005
daemonize yes
pidfile /data/7005/redis.pid
loglevel notice
logfile "/data/7005/redis.log"
dbfilename dump.rdb
dir /data/7005
protected-mode no
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
EOF

啟動(dòng)節(jié)點(diǎn):

redis-server /data/7000/redis.conf 
redis-server /data/7001/redis.conf 
redis-server /data/7002/redis.conf 
redis-server /data/7003/redis.conf 
redis-server /data/7004/redis.conf 
redis-server /data/7005/redis.conf 
[root@db01 ~]# ps -ef |grep redis
root       8854      1  0 03:56 ?        00:00:00 redis-server *:7000 [cluster]     
root       8858      1  0 03:56 ?        00:00:00 redis-server *:7001 [cluster]     
root       8860      1  0 03:56 ?        00:00:00 redis-server *:7002 [cluster]     
root       8864      1  0 03:56 ?        00:00:00 redis-server *:7003 [cluster]     
root       8866      1  0 03:56 ?        00:00:00 redis-server *:7004 [cluster]     
root       8874      1  0 03:56 ?        00:00:00 redis-server *:7005 [cluster]  

將節(jié)點(diǎn)加入集群管理

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

集群狀態(tài)查看

集群主節(jié)點(diǎn)狀態(tài)
redis-cli -p 7000 cluster nodes | grep master
集群從節(jié)點(diǎn)狀態(tài)
redis-cli -p 7000 cluster nodes | grep slave

14.3 集群節(jié)點(diǎn)管理

增加新的節(jié)點(diǎn)

mkdir /data/7006
mkdir /data/7007
cat > /data/7006/redis.conf <<EOF
port 7006
daemonize yes
pidfile /data/7006/redis.pid
loglevel notice
logfile "/data/7006/redis.log"
dbfilename dump.rdb
dir /data/7006
protected-mode no
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
EOF

cat >  /data/7007/redis.conf <<EOF
port 7007
daemonize yes
pidfile /data/7007/redis.pid
loglevel notice
logfile "/data/7007/redis.log"
dbfilename dump.rdb
dir /data/7007
protected-mode no
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
EOF

redis-server /data/7006/redis.conf 
redis-server /data/7007/redis.conf 

添加主節(jié)點(diǎn):

redis-trib.rb add-node 127.0.0.1:7006 127.0.0.1:7000

轉(zhuǎn)移slot(重新分片)

redis-trib.rb reshard 127.0.0.1:7000

添加一個(gè)從節(jié)點(diǎn)

redis-trib.rb add-node --slave --master-id 8ff9ef5b78e6da62bd7b362e1fe190cba19ef5ae 127.0.0.1:7007 127.0.0.1:7000

14.4 刪除節(jié)點(diǎn)

將需要?jiǎng)h除節(jié)點(diǎn)slot移動(dòng)走

redis-trib.rb reshard 127.0.0.1:7000
49257f251824dd815bc7f31e1118b670365e861a 
127.0.0.1:7006
0-1364 5461-6826 10923-12287
1365      1366     1365

刪除一個(gè)節(jié)點(diǎn)

刪除master節(jié)點(diǎn)之前首先要使用reshard移除master的全部slot,然后再刪除當(dāng)前節(jié)點(diǎn)
redis-trib.rb del-node 127.0.0.1:7006 8ff9ef5b78e6da62bd7b362e1fe190cba19ef5ae


---------------------
設(shè)置redis最大內(nèi)存
config set maxmemory 102400000
---------------------
image.png

15. redis的多API支持

python為例
yum install -y python36 
python3 -V
yum install -y python36-pip
pip3 install redis 
pip3 install redis-py-cluster

++++++++++++源碼方式+++++++++++++++
https://redis.io/clients
下載redis-py-master.zip
安裝驅(qū)動(dòng):
unzip redis-py-master.zip
cd redis-py-master
python3 setup.py install

redis cluster的連接并操作(python2.7.2以上版本才支持redis cluster,我們選擇的是3.6)
https://github.com/Grokzen/redis-py-cluster
安裝redis-cluser的客戶端程序
cd redis-py-cluster-unstable
python3 setup.py install
+++++++++++++++++++++++++++++++++

對(duì)redis的單實(shí)例進(jìn)行連接操作

[root@db01 ~]# redis-server /data/6379/redis.conf 

python3
>>>import redis
>>>r = redis.StrictRedis(host='10.0.0.51', port=6379, db=0,password='123456')
>>>r.set('oldboy', 'oldguo')
>>>r.get('oldboy')

sentinel集群連接并操作

[root@db01 ~]# redis-server /data/6380/redis.conf
[root@db01 ~]# redis-server /data/6381/redis.conf
[root@db01 ~]# redis-server /data/6382/redis.conf 
[root@db01 ~]# redis-sentinel /data/26380/sentinel.conf &
--------------------------------
## 導(dǎo)入redis sentinel包
>>>from redis.sentinel import Sentinel  
##指定sentinel的地址和端口號(hào)
>>> sentinel = Sentinel([('localhost', 26380)], socket_timeout=0.1)  
##測(cè)試冈欢,獲取以下主庫(kù)和從庫(kù)的信息
>>> sentinel.discover_master('mymaster')  
>>> sentinel.discover_slaves('mymaster')  

配置讀寫分離

#寫節(jié)點(diǎn)
>>> master = sentinel.master_for('mymaster', socket_timeout=0.1,password="123")  
#讀節(jié)點(diǎn)
>>> slave = sentinel.slave_for('mymaster', socket_timeout=0.1,password="123")  
###讀寫分離測(cè)試   key     
>>> master.set('oldboy', '123')  
>>> slave.get('oldboy')  

python連接rediscluster集群測(cè)試

使用

python3
>>> from rediscluster import RedisCluster  
>>> startup_nodes = [{"host":"127.0.0.1", "port": "7000"},{"host":"127.0.0.1", "port": "7001"},{"host":"127.0.0.1", "port": "7002"}]  
### Note: decode_responses must be set to True when used with python3  
>>> rc = RedisCluster(startup_nodes=startup_nodes, decode_responses=True)  
>>> rc.set("foo", "bar")  
True  
>>> print(rc.get("foo"))  
'bar'

16.一些概念

緩存穿透

概念
訪問(wèn)一個(gè)不存在的key歉铝,緩存不起作用,請(qǐng)求會(huì)穿透到DB凑耻,流量大時(shí)DB會(huì)掛掉太示。

解決方案
采用布隆過(guò)濾器,使用一個(gè)足夠大的bitmap香浩,用于存儲(chǔ)可能訪問(wèn)的key先匪,不存在的key直接被過(guò)濾;
訪問(wèn)key未在DB查詢到值弃衍,也將空值寫進(jìn)緩存呀非,但可以設(shè)置較短過(guò)期時(shí)間。

緩存雪崩

概念
大量的key設(shè)置了相同的過(guò)期時(shí)間镜盯,導(dǎo)致在緩存在同一時(shí)刻全部失效岸裙,造成瞬時(shí)DB請(qǐng)求量大、壓力驟增速缆,引起雪崩降允。

解決方案
可以給緩存設(shè)置過(guò)期時(shí)間時(shí)加上一個(gè)隨機(jī)值時(shí)間,使得每個(gè)key的過(guò)期時(shí)間分布開來(lái)艺糜,不會(huì)集中在同一時(shí)刻失效剧董。

緩存擊穿

概念
一個(gè)存在的key,在緩存過(guò)期的一刻破停,同時(shí)有大量的請(qǐng)求翅楼,這些請(qǐng)求都會(huì)擊穿到DB,造成瞬時(shí)DB請(qǐng)求量大真慢、壓力驟增毅臊。
解決方案
在訪問(wèn)key之前,采用SETNX(set if not exists)來(lái)設(shè)置另一個(gè)短期key來(lái)鎖住當(dāng)前key的訪問(wèn)黑界,訪問(wèn)結(jié)束再刪除該短期key管嬉。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末皂林,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子蚯撩,更是在濱河造成了極大的恐慌础倍,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,589評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件胎挎,死亡現(xiàn)場(chǎng)離奇詭異沟启,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)呀癣,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,615評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門美浦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人项栏,你說(shuō)我怎么就攤上這事浦辨。” “怎么了沼沈?”我有些...
    開封第一講書人閱讀 165,933評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵流酬,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我列另,道長(zhǎng)芽腾,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,976評(píng)論 1 295
  • 正文 為了忘掉前任页衙,我火速辦了婚禮摊滔,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘店乐。我一直安慰自己艰躺,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,999評(píng)論 6 393
  • 文/花漫 我一把揭開白布眨八。 她就那樣靜靜地躺著腺兴,像睡著了一般。 火紅的嫁衣襯著肌膚如雪廉侧。 梳的紋絲不亂的頭發(fā)上页响,一...
    開封第一講書人閱讀 51,775評(píng)論 1 307
  • 那天,我揣著相機(jī)與錄音段誊,去河邊找鬼闰蚕。 笑死,一個(gè)胖子當(dāng)著我的面吹牛枕扫,可吹牛的內(nèi)容都是我干的陪腌。 我是一名探鬼主播,決...
    沈念sama閱讀 40,474評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼烟瞧,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼诗鸭!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起参滴,我...
    開封第一講書人閱讀 39,359評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤强岸,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后砾赔,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蝌箍,經(jīng)...
    沈念sama閱讀 45,854評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,007評(píng)論 3 338
  • 正文 我和宋清朗相戀三年暴心,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了妓盲。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,146評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡专普,死狀恐怖悯衬,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情檀夹,我是刑警寧澤筋粗,帶...
    沈念sama閱讀 35,826評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站炸渡,受9級(jí)特大地震影響娜亿,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蚌堵,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,484評(píng)論 3 331
  • 文/蒙蒙 一买决、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧吼畏,春花似錦督赤、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,029評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至藕夫,卻和暖如春孽糖,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背毅贮。 一陣腳步聲響...
    開封第一講書人閱讀 33,153評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工办悟, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人滩褥。 一個(gè)月前我還...
    沈念sama閱讀 48,420評(píng)論 3 373
  • 正文 我出身青樓病蛉,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子铺然,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,107評(píng)論 2 356

推薦閱讀更多精彩內(nèi)容

  • 一俗孝、Redis高可用概述 在介紹Redis高可用之前,先說(shuō)明一下在Redis的語(yǔ)境中高可用的含義魄健。 我們知道赋铝,在w...
    空語(yǔ)閱讀 1,597評(píng)論 0 2
  • 五種數(shù)據(jù)結(jié)構(gòu)簡(jiǎn)介 Redis是使用C編寫的,內(nèi)部實(shí)現(xiàn)了一個(gè)struct結(jié)構(gòu)體redisObject對(duì)象沽瘦,通過(guò)結(jié)構(gòu)體...
    彥幀閱讀 6,944評(píng)論 0 14
  • 企業(yè)級(jí)redis集群架構(gòu)的特點(diǎn) 海量數(shù)據(jù) 高并發(fā) 高可用 要達(dá)到高可用革骨,持久化是不可減少的,持久化主要是做災(zāi)難恢復(fù)...
    lucode閱讀 2,207評(píng)論 0 7
  • NOSQL類型簡(jiǎn)介鍵值對(duì):會(huì)使用到一個(gè)哈希表析恋,表中有一個(gè)特定的鍵和一個(gè)指針指向特定的數(shù)據(jù)良哲,如redis,volde...
    MicoCube閱讀 3,985評(píng)論 2 27
  • 0. NoSQL 產(chǎn)品(key-value) RDBMS :MySQL助隧,Oracle 筑凫,MSSQL,PGNoSQL...
    成淺閱讀 497評(píng)論 0 0