34-redis緩存服務(wù)(一)

本章內(nèi)容

◆ 緩存介紹
◆ redis 部署與使用
◆ redis 高可用與集群
◆ memcached

一、 緩存概念

  • 緩存是為了調(diào)節(jié)速度不一致的兩個或多個不同的物質(zhì)的速度地回,在中間對速度較快的一方起到一個加速訪問速度較慢的一方的作用,比如 CPU 的一級溜徙、二級緩存是保存了 CPU 最近經(jīng)常訪問的數(shù)據(jù)知残,內(nèi)存是保存 CPU 經(jīng)常訪問硬盤的數(shù)據(jù)父能,而且硬盤也有大小不一的緩存净神,甚至是物理服務(wù)器的 raid 卡有也緩存何吝,都是為了起到加速 CPU 訪問硬盤數(shù)據(jù)的目的,因為 CPU 的速度太快了鹃唯, CPU 需要的數(shù)據(jù)硬盤往往不能在短時間內(nèi)滿足 CPU 的需求爱榕,因此 PCU 緩存、內(nèi)存坡慌、 Raid 卡以及硬盤緩存就在一定程度上滿足了 CPU 的數(shù)據(jù)需求黔酥,即 CPU 從緩存讀取數(shù)據(jù)可以大幅提高 CPU 的工作效率。
1.1: 系統(tǒng)緩存

1.1.1: buffer 與 cache

  • buffer:緩沖也叫寫緩沖,一般用于寫操作跪者,可以將數(shù)據(jù)先寫入內(nèi)存在寫入磁盤棵帽, buffer 一般用于寫緩沖,用于解決不同介質(zhì)的速度不一致的緩沖渣玲,先將數(shù)據(jù)臨時寫入到里自己最近的地方逗概,以提高寫入速度, CPU 會把數(shù)據(jù)先寫到內(nèi)存的磁盤緩沖區(qū)忘衍,然后就認(rèn)為數(shù)據(jù)已經(jīng)寫入完成看仗谆,然后由內(nèi)核在后續(xù)的時間在寫入磁盤,所以服務(wù)器突然斷電會丟失內(nèi)存中的部分?jǐn)?shù)據(jù)淑履。
    cache:緩存也叫讀緩存隶垮,一般用于讀操作, CPU 讀文件從內(nèi)存讀秘噪,如果內(nèi)存沒有就先從硬盤讀到內(nèi)存再讀到 CPU狸吞,將需要頻繁讀取的數(shù)據(jù)放在里自己最近的緩存區(qū)域,下次讀取的時候即可快速讀取指煎。

1.1.2: cache 的保存位置

  • 客戶端:瀏覽器
  • 內(nèi)存:本地服務(wù)器蹋偏、遠(yuǎn)程服務(wù)器
  • 硬盤:本機(jī)硬盤、遠(yuǎn)程服務(wù)器硬盤

1.1.3: cache 的特性

  • 自動過期:給緩存的數(shù)據(jù)加上有效時間至壤,超出時間后自動過期刪除
  • 過期時間: 強(qiáng)制過期威始,源網(wǎng)站更新圖片后 CDN 是不會更新的,需要強(qiáng)制是圖片緩存過期
  • 命中率: 即緩存的讀取命中率
1.2: 用戶層緩存

1.2.1: DNS 緩存
默認(rèn)為 60 秒像街,即 60 秒之內(nèi)在訪問同一個域名就不在進(jìn)行 DNS 解析:
查看 chrome 瀏覽器的 DNS 緩存:
chrome://net-internals/#dns

image.png

1.2.2:火狐瀏覽器緩存

地址欄:about:cache

image.png

1.2.3: 瀏覽器緩存過期機(jī)制

1.2.3.1: 最后修改時間
系統(tǒng)調(diào)用會獲取文件的最后修改時間黎棠,如果沒有發(fā)生變化就返回給瀏覽器 304 的狀態(tài)碼,表示沒有發(fā)生變化镰绎,然后瀏覽器就使用的本地的緩存展示資源

image.png
image.png

1.2.3.2: Etag 標(biāo)記
基于 Etag 標(biāo)記是否一致做判斷頁面是否發(fā)生過變化脓斩,比如基于 Nginx 的 etag on 來實現(xiàn)

image.png

1.2.3.3: 過期時間

  • 以上兩種都需要發(fā)送請求,即不管資源是否過期都要發(fā)送請求進(jìn)行協(xié)商畴栖,這樣會消耗不必要的時間随静,因此有了緩存的過期時間,即第一次請求資源的時候帶一個資源的過期時間吗讶,默認(rèn)為 30 天燎猛,當(dāng)前這種方式使用的比表較多,但是無法保證客戶的時間都是準(zhǔn)確并且一致的照皆,因此假如一個最大生存周期重绷,使用用戶本地的時間計算緩存數(shù)據(jù)是否超過多少天,下面的過期時間為 2027 年纵寝,但是緩存的最大生存周期計算為天等于 3650 天即 10 年论寨,過期時間如下:
image.png
1.3: CDN 緩存

1.3.1: 什么是 CND

  • 內(nèi)容分發(fā)網(wǎng)絡(luò)(Content Delivery Network),通過將服務(wù)內(nèi)容分發(fā)至全網(wǎng)加速節(jié)點爽茴,利用全球調(diào)度系統(tǒng)使用戶能夠就近獲取葬凳,有效降低訪問延遲,提升服務(wù)可用性室奏, CDN 第一降低機(jī)房的使用帶寬火焰,因為很多資源通過 CDN 就直接返回用戶了,第二解決不同運營商之間的互聯(lián)胧沫,因為可以讓聯(lián)通的網(wǎng)絡(luò)訪問聯(lián)通讓電信的網(wǎng)絡(luò)訪問電信昌简,起到加速用戶訪問的目的, 第三:解決用戶訪問的地域問題绒怨,就近返回用戶資源纯赎。
    百度 CDN: https://cloud.baidu.com/product/cdn.html
    阿里 CDN: https://www.aliyun.com/product/cdn?spm=5176.8269123.416540.50.728y8n
    騰訊 CDN: https://www.qcloud.com/product/cdn

1.3.2: 用戶請求 CDN 流程:

  • 提前對靜態(tài)內(nèi)容進(jìn)行預(yù)緩存,避免大量的請求回源南蹂,導(dǎo)致主站網(wǎng)絡(luò)帶寬被打滿而導(dǎo)致數(shù)據(jù)無法更新犬金,另外 CDN 可以將數(shù)據(jù)根據(jù)訪問的熱度不同而進(jìn)行不同級別的緩存,例如訪問量最高的資源訪問 CDN邊緣節(jié)點的內(nèi)存六剥,其次的放在 SSD 或者 SATA晚顷,再其次的放在云存儲,這樣兼顧了速度與成本疗疟。

1.3.3: CDN 主要優(yōu)勢:

  • 提前對靜態(tài)內(nèi)容進(jìn)行預(yù)緩存该默,避免大量的請求回源,導(dǎo)致主站網(wǎng)絡(luò)帶寬被打滿而導(dǎo)致數(shù)據(jù)無法更新策彤,另外 CDN 可以將數(shù)據(jù)根據(jù)訪問的熱度不同而進(jìn)行不同級別的緩存栓袖,例如訪問量最高的資源訪問 CDN邊緣節(jié)點的內(nèi)存,其次的放在 SSD 或者 SATA店诗,再其次的放在云存儲叽赊,這樣兼顧了速度與成本。緩存-緩存到最快的地方如內(nèi)存必搞,緩存的數(shù)據(jù)準(zhǔn)確命中率高必指,訪問速度就快
  • 調(diào)度準(zhǔn)確-將用戶調(diào)度到最近的邊緣節(jié)點
  • 性能優(yōu)化-CDN 專門用于緩存響應(yīng)速度快
  • 安全相關(guān)-抵御攻擊
  • 節(jié)省帶寬:由于用戶請求由邊緣節(jié)點響應(yīng),因此大幅降低到源站帶寬恕洲。
1.4: 應(yīng)用層緩存
  • Nginx塔橡、 PHP 等 web 服務(wù)可以設(shè)置應(yīng)用緩存以加速響應(yīng)用戶請求, 另外有些解釋性語言比如 PHP/Python不能直接運行霜第,需要先編譯成字節(jié)碼葛家,但字節(jié)碼需要解釋器解釋為機(jī)器碼之后才能執(zhí)行,因此字節(jié)碼也是一種緩存泌类,有時候會出現(xiàn)程序代碼上線后字節(jié)碼沒有更新的現(xiàn)象癞谒。
1.5: 其他層面緩存
  • CPU 緩存(L1 的數(shù)據(jù)緩存和 L1 的指令緩存)、二級緩存、三級緩存
  • 磁盤緩存
  • RAID 卡
  • 分布式緩存: redis弹砚、 memcache
二双仍、 redis 部署與使用
2.1: redis 基礎(chǔ)

官網(wǎng)地址: https://redis.io/
Redis 和 Memcached 是非關(guān)系型數(shù)據(jù)庫也稱為 NoSQL 數(shù)據(jù)庫,MySQL桌吃、Mariadb朱沃、SQL Server、PostgreSQL茅诱、Oracle 數(shù)據(jù)庫屬于關(guān)系型數(shù)據(jù)(RDBMS, Relational Database Management System)

2.1.1: redis 簡介

Redis(Remote Dictionary Server)在 2009 年發(fā)布逗物, 開發(fā)者 Salvatore Sanfilippo 是意大利開發(fā)者, 他本想為自己的公司開發(fā)一個用于替換 MySQL 的產(chǎn)品 Redis瑟俭, 但是沒有想到他把 Redis 開源后大受歡迎翎卓,短短幾年, Redis 就有了很大的用戶群體摆寄,目前國內(nèi)外使用的公司有知乎網(wǎng)莲祸、新浪微博、 GitHub 等
redis 是一個開源的椭迎、遵循 BSD 協(xié)議的锐帜、基于內(nèi)存的而且目前比較流行的鍵值數(shù)據(jù)庫(key-value database),是一個非關(guān)系型數(shù)據(jù)庫畜号, redis 提供將內(nèi)存通過網(wǎng)絡(luò)遠(yuǎn)程共享的一種服務(wù)屋休,提供類似功能的還有memcache研铆,但相比 memcache, redis 還提供了易擴(kuò)展、高性能疲酌、 具備數(shù)據(jù)持久性等功能沪哺。
Redis 在高并發(fā)阿迈、低延遲環(huán)境要求比較高的環(huán)境使用量非常廣泛典蜕, 目前 redis 在 DB-Engine 月排行榜https://db-engines.com/en/ranking 中一直比較靠前,而且一直是鍵值型存儲類的首位疼蛾。

2.1.2: redis 對比 memcached

  • 支持?jǐn)?shù)據(jù)的持久化:可以將內(nèi)存中的數(shù)據(jù)保持在磁盤中肛跌,重啟 redis 服務(wù)或者服務(wù)器之后可以從備份文件中恢復(fù)數(shù)據(jù)到內(nèi)存繼續(xù)使用。
  • 支持更多的數(shù)據(jù)類型:支持 string(字符串)察郁、 hash(哈希數(shù)據(jù))衍慎、 list(列表)、 set(集合)皮钠、 zet(有序集合)
  • 支持?jǐn)?shù)據(jù)的備份:可以實現(xiàn)類似于數(shù)據(jù)的 master-slave 模式的數(shù)據(jù)備份稳捆,另外也支持使用快照+AOF。
  • 支持更大的 value 數(shù)據(jù): memcache 單個 key value 最大只支持 1MB麦轰,而 redis 最大支持 512MB乔夯。
  • Redis 是單線程砖织, 而 memcache 是多線程, 所以單機(jī)情況下沒有 memcache 并發(fā)高末荐, 但 redis 支持分布式集群以實現(xiàn)更高的并發(fā)侧纯, 單 Redis 實例可以實現(xiàn)數(shù)萬并發(fā)。
  • 支持集群橫向擴(kuò)展:基于 redis cluster 的橫向擴(kuò)展鞠评,可以實現(xiàn)分布式集群茂蚓,大幅提升性能和數(shù)據(jù)安全性壕鹉。
    都是基于 C 語言開發(fā)剃幌。

2.1.3: redis 典型應(yīng)用場景

  • Session 共享:常見于 web 集群中的 Tomcat 或者 PHP 中多 web 服務(wù)器 session 共享
  • 消息隊列: ELK 的日志緩存、 部分業(yè)務(wù)的訂閱發(fā)布系統(tǒng)
  • 計數(shù)器: 訪問排行榜晾浴、商品瀏覽數(shù)等和次數(shù)相關(guān)的數(shù)值統(tǒng)計場景
  • 緩存: 數(shù)據(jù)查詢负乡、 電商網(wǎng)站商品信息、 新聞內(nèi)容
  • 微博/微信社交場合: 共同好友脊凰、 點贊評論等
2.2: Redis 安裝及使用

2.2.1: yum 安裝 redis

  • 在 centos 系統(tǒng)上需要安裝 epel 源抖棘。

  • 安裝 redis:

    yum install redis –y
    systemctl start redis && systemctl enable redis
    [root@redis-s3 ~]# redis-cli
    127.0.0.1:6379> info
    # Server
    redis_version:3.2.12
    redis_git_sha1:00000000
    redis_git_dirty:0
    redis_build_id:7897e7d0e13773f
    redis_mode:standalone
    os:Linux 3.10.0-862.el7.x86_64 x86_64
    arch_bits:64
    

2.2.2:編譯安裝 redis

2.2.2.1: 編譯安裝命令

官方的安裝命令: https://redis.io/download

cd /usr/local/src
tar xf redis-5.0.3.tar.gz
cd redis-5.0.3
make PREFIX=/usr/local/redis install
ll /usr/local/redis/
total 0
drwxr-xr-x 2 root root 134 Dec 13 09:21 bin
mkdir /usr/local/redis/etc
cp redis.conf /usr/local/redis/etc/

2.2.2.2: 前臺啟動 redis

/usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf

2.2.2.3:解決當(dāng)前的警告提示

2.2.2.3.1: tcp-backlog

The backlog argument defines the maximum length to which the queue of pending connections
for sockfd may grow. If a connection request arrives when the queue is full, the client may receive an error
with an indication of ECONNREFUSED or, if the underlying protocol supports retransmission, the request may
be ignored so that a later reattempt at connection succeeds.

backlog 參數(shù)控制的是三次握手的時候 server 端收到 client ack 確認(rèn)號之后的隊列值。

net.core.somaxconn = 512

2.2.2.3.2: vm.overcommit_memory

0狸涌、表示內(nèi)核將檢查是否有足夠的可用內(nèi)存供應(yīng)用進(jìn)程使用切省;如果有足夠的可用內(nèi)存,內(nèi)存申請允許帕胆;
否則朝捆,內(nèi)存申請失敗,并把錯誤返回給應(yīng)用進(jìn)程懒豹。
1芙盘、表示內(nèi)核允許分配所有的物理內(nèi)存,而不管當(dāng)前的內(nèi)存狀態(tài)如何脸秽。
2儒老、表示內(nèi)核允許分配超過所有物理內(nèi)存和交換空間總和的內(nèi)存

vm.overcommit_memory = 1

2.2.2.3.3: transparent hugepage
開啟大頁內(nèi)存動態(tài)分配,需要關(guān)閉讓 redis 負(fù)責(zé)內(nèi)存管理记餐。

echo never > /sys/kernel/mm/transparent_hugepage/enabled

2.2.2.3.4: 再次啟動 redis
將以上配置同步到其他 redis 服務(wù)器驮樊。

2.2.2.4:編輯 redis 服務(wù)啟動腳本

[root@s1 ~]# 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
ExecStart=/apps/redis/bin/redis-server /apps/redis/etc/redis.conf --supervised systemd
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
Type=notify
User=root
Group=root
RuntimeDirectory=redis
RuntimeDirectoryMode=0755
[Install]
WantedBy=multi-user.target

2.2.2.5:創(chuàng)建 redis 用戶和數(shù)據(jù)目錄

groupadd -g 1000 redis && useradd -u 1000 -g 1000 redis -s /sbin/nologin
mkdir -pv /usr/local/redis/{etc,logs,data,run}
chown redis.redis -R /usr/local/redis/

2.2.2.6: 驗證 redis 啟動

useradd redis -s /sbin/nologin
chown redis.redis /usr/local/redis/ -R
chown redis.redis /usr/local/redis/ -R #注意目錄權(quán)限

2.2.2.7: 使用客戶端連接 redis

/usr/local/redis/bin/redis-cli -h IP/HOSTNAME -p PORT -a PASSWORD

2.2.2.8: 創(chuàng)建命令軟連接

ln -sv /usr/local/redis/bin/redis-* /usr/bin/
'/usr/bin/redis-benchmark' -> '/usr/local/redis/bin/redis-benchmark'
'/usr/bin/redis-check-aof' -> '/usr/local/redis/bin/redis-check-aof'
'/usr/bin/redis-check-rdb' -> '/usr/local/redis/bin/redis-check-rdb'
'/usr/bin/redis-cli' -> '/usr/local/redis/bin/redis-cli'
'/usr/bin/redis-sentinel' -> '/usr/local/redis/bin/redis-sentinel'
'/usr/bin/redis-server' -> '/usr/local/redis/bin/redis-server'

2.2.2.9: 編譯安裝后的命令

[root@redis-s1 ~]# ll /usr/local/redis/bin/
total 32656
-rwxr-xr-x 1 redis redis 4365488 Dec 13 09:21 redis-benchmark #redis 性能測試工具
-rwxr-xr-x 1 redis redis 8088920 Dec 13 09:21 redis-check-aof #AOF 文件檢查工具
-rwxr-xr-x 1 redis redis 8088920 Dec 13 09:21 redis-check-rdb #RDB 文件檢查工具
-rwxr-xr-x 1 redis redis 4800752 Dec 13 09:21 redis-cli #redis #客戶端工具
lrwxrwxrwx 1 redis redis 12 Dec 13 09:21 redis-sentinel -> redis-server #哨兵, 軟連接到server
-rwxr-xr-x 1 redis redis 8088920 Dec 13 09:21 #redis-server #redis 服務(wù)端

2.2.3: windows 安裝 redis:

2.2.4: 連接到 Redis:

  • 主要分為運維人員的連接和程序的連接
    2.2.4.1: 本機(jī)非密碼連接:
    redis-cli
    2.2.4.2: 跨主機(jī)非密碼連接:
    redis-cli -h HOSTNAME/IP -p PORT
    2.2.4.3: 跨主機(jī)密碼連接:
    redis-cli -h HOSTNAME/IP -p PORT -a PASSWORD
    2.2.4.4: python 連接方式:
#!/bin/env python
#Author: ZhangJie
import redis
import time
pool = redis.ConnectionPool(host="192.168.7.101",
port=6379,password="")
r = redis.Redis(connection_pool=pool)
for i in range(100):
r.set("k%d" % i,"v%d" % i)
time.sleep(1)
data=r.get("k%d" % i)
print(data)

小筆記:redis安裝啟動

yum install redis -y    #epel
systemctl start redis
#測試
redis-cli
ping

#源碼編譯安裝
useradd redis -s /sbin/nologin -r
cd /usr/local/src
tar xf redis-5.0.3.tar.gz
cd redis-5.0.3
make PREFIX=/apps/redis install
mkdir /apps/redis/etc
cp redis.conf /apps/redis/etc/
chown -R redis.redis /apps/redis

#創(chuàng)建服務(wù)啟動文件
vim /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=/apps/redis/bin/redis-server /apps/redis/etc/redis.conf --supervised systemd
    ExecReload=/bin/kill -s HUP $MAINPID
    ExecStop=/bin/kill -s QUIT $MAINPID
    Type=notify
    User=root
    Group=root
    RuntimeDirectory=redis
    RuntimeDirectoryMode=0755
    [Install]
    WantedBy=multi-user.target

systemctl start redis
/apps/redis/bin/redis-cli

#解決啟動時的警告
vim /etc/sysctl.conf
    net.core.somaxconn = 512        # WARNING: The TCP backlog setting of 511
    vm.overcommit_memory = 1        # WARNING overcommit_memory is set to 0!
sysctl -p
#WARNING you have Transparent Huge Pages (THP) support enabled in your kernel
echo never > /sys/kernel/mm/transparent_hugepage/enabled    #開啟大頁內(nèi)存動態(tài)分配巩剖,需要關(guān)閉讓 redis 負(fù)責(zé)內(nèi)存管理
echo 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' > /etc/rc.d/rc.local
chmod +x /etc/rc.d/rc.local
systemctl restart redis
2.3: redis 配置文件

2.3.1: redis 主要配置項

#監(jiān)聽地址, 可以用空格隔開后多個監(jiān)聽 IP
bind 0.0.0.0
#redis3.2 之后加入的新特性钠怯, 在沒有設(shè)置 bind IP 和密碼的時候只允許訪問
protected-mode yes 
127.0.0.1:6379
#監(jiān)聽端口
port 6379 
#三次握手的時候 server 端收到 client ack 確認(rèn)號之后的隊列值佳魔。
tcp-backlog 511 
#客戶端和 Redis 服務(wù)端的連接超時時間,默認(rèn)是 0晦炊,表示永不超時鞠鲜。
timeout 0 
#tcp 會話保持時間
tcp-keepalive 300 
#認(rèn)情況下 redis 不是作為守護(hù)進(jìn)程運行的宁脊,如果你想讓它在后臺運行,你就把它改成yes,當(dāng) redis 作為守護(hù)進(jìn)程運行的時候贤姆,它會寫一個 pid 到 /var/run/redis.pid 文件里面
daemonize no 
#和操作系統(tǒng)相關(guān)參數(shù)榆苞, 可以設(shè)置通過 upstart 和 systemd 管理 Redis 守護(hù)進(jìn)程, centos 7以后都使用 systemd
supervised no 
#pid 文件路徑
pidfile /var/run/redis_6379.pid 
#日志級別
loglevel notice 
#日志路徑
logfile "" 
 #設(shè)置 db 庫數(shù)量霞捡,默認(rèn) 16 個庫
databases 16
#在啟動 redis 時是否顯示 logo
always-show-logo yes 
#在 900 秒內(nèi)有一個鍵內(nèi)容發(fā)生更改就出就快照機(jī)制
save 900 1 
save 300 10
save 60 10000
#快照出錯時是否禁止 redis 寫入操作
stop-writes-on-bgsave-error no 
#持久化到 RDB 文件時坐漏,是否壓縮, "yes"為壓縮碧信, "no"則反之
rdbcompression yes 
#是否開啟 RC64 校驗赊琳,默認(rèn)是開啟
rdbchecksum yes 
#快照文件名
dbfilename dump.rdb 
#快照文件保存路徑
dir ./ 

#當(dāng)從庫同主庫失去連接或者復(fù)制正在進(jìn)行,從機(jī)庫有兩種運行方式: 1) 如果 replica-serve-stale-data 設(shè)置為 yes(默認(rèn)設(shè)置)砰碴,從庫會繼續(xù)響應(yīng)客戶端的讀請求躏筏。 2) 如果 replicaserve-stale-data 設(shè)置為 no,除去指定的命令之外的任何請求都會返回一個錯誤"SYNC with mprogress"呈枉。
replica-serve-stale-data yes 
#是否設(shè)置從庫只讀
replica-read-only yes 
#是否使用 socket 方式復(fù)制數(shù)據(jù)趁尼, 目前 redis 復(fù)制提供兩種方式, disk 和 socket猖辫, 如果新的 slave 連上來或者重連的 slave 無法部分同步酥泞,就會執(zhí)行全量同步, master 會生成 rdb 文件啃憎, 有2 種方式: disk 方式是 master 創(chuàng)建一個新的進(jìn)程把 rdb 文件保存到磁盤芝囤,再把磁盤上的 rdb 文件傳遞給 slave, socket 是 master 創(chuàng)建一個新的進(jìn)程荧飞,直接把 rdb 文件以 socket 的方式發(fā)給 slave凡人, disk 方式的時候,當(dāng)一個 rdb 保存的過程中叹阔,多個 slave 都能共享這個 rdb 文件挠轴, socket 的方式就是一個個 slave順序復(fù)制, 只有在磁盤速度緩慢但是網(wǎng)絡(luò)相對較快的情況下才使用 socket 方式耳幢, 否則使用默認(rèn)的 disk方式
repl-diskless-sync no 
#diskless 復(fù)制的延遲時間岸晦, 設(shè)置 0 為關(guān)閉, 一旦復(fù)制開始還沒有結(jié)束之前睛藻,master 節(jié)點不會再接收新 slave 的復(fù)制請求启上, 直到下一次開始
repl-diskless-sync-delay 30 
#slave 根據(jù) master 指定的時間進(jìn)行周期性的 PING 監(jiān)測
repl-ping-slave-period 10 
#復(fù)制鏈接超時時間,需要大于 repl-ping-slave-period店印, 否則會經(jīng)常報超時
repl-timeout 60 
#在 socket 模式下是否在 slave 套接字發(fā)送 SYNC 之后禁用 TCP_NODELAY冈在,如果你選擇“yes”Redis 將使用更少的 TCP 包和帶寬來向 slaves 發(fā)送數(shù)據(jù)。但是這將使數(shù)據(jù)傳輸?shù)?slave上有延遲按摘, Linux 內(nèi)核的默認(rèn)配置會達(dá)到 40 毫秒包券, 如果你選擇了 "no" 數(shù)據(jù)傳輸?shù)?salve 的延遲將會減少但要使用更多的帶寬
repl-disable-tcp-nodelay no 
#復(fù)制緩沖區(qū)大小纫谅, 只有在 slave 連接之后才分配內(nèi)存。
repl-backlog-size 1mb 
#多次時間 master 沒有 slave 連接溅固,就清空 backlog 緩沖區(qū)付秕。
repl-backlog-ttl 3600 
#當(dāng) master 不可用, Sentinel 會根據(jù) slave 的優(yōu)先級選舉一個 master侍郭。最低的優(yōu)先級的 slave询吴,當(dāng)選 master。而配置成 0亮元,永遠(yuǎn)不會被選舉猛计。requirepass foobared #設(shè)置 redis 連接密碼
replica-priority 100 
 #重命名一些高危命令
rename-command
#最大連接客戶端
maxclients 10000 
#最大內(nèi)存,單位為 bytes 字節(jié)苹粟,8G 內(nèi)存的計算方式 8(G)*1024(MB)*1024(KB)*1024(Kbyte)有滑,需要注意的是 slave 的輸出緩沖區(qū)是不計算在 maxmemory 內(nèi)跃闹。
maxmemory 
#是否開啟 AOF 日志記錄嵌削, 默認(rèn) redis 使用的是 rdb 方式持久化,這種方式在許多應(yīng)用中已經(jīng)足夠用了望艺。但是 redis 如果中途宕機(jī)苛秕,會導(dǎo)致可能有幾分鐘的數(shù)據(jù)丟失,根據(jù) save 來策略進(jìn)行持久化找默,Append Only File 是另一種持久化方式艇劫,可以提供更好的持久化特性。 Redis 會把每次寫入的數(shù)據(jù)在接收后都寫入 appendonly.aof 文件惩激,每次啟動時 Redis 都會先把這個文件的數(shù)據(jù)讀入內(nèi)存里店煞,先忽略 RDB 文件。
appendonly no 
#AOF 文件名
appendfilename "appendonly.aof" 
 #aof 持久化策略的配置,no 表示不執(zhí)行 fsync,由操作系統(tǒng)保證數(shù)據(jù)同步到磁盤,always 表示每次寫入都執(zhí)行 fsync风钻,以保證數(shù)據(jù)同步到磁盤,everysec 表示每秒執(zhí)行一次 fsync顷蟀,可能會導(dǎo)致丟失這 1s 數(shù)據(jù)。no-appendfsync-on-rewrite no 在 aof rewrite 期間,是否對 aof 新記錄的 append 暫緩使用文件同步策略,主要考慮磁盤 IO 開支和請求阻塞時間骡技。默認(rèn)為 no,表示"不暫緩",新的 aof 記錄仍然會被立即同步鸣个,Linux 的默認(rèn) fsync 策略是 30 秒,如果為 yes 可能丟失 30 秒數(shù)據(jù)布朦, 但由于 yes 性能較好而且會避免出現(xiàn)阻塞因此比較推薦囤萤。
appendfsync everysec
# 當(dāng) Aof log 增長超過指定百分比例時,重寫 log file是趴, 設(shè)置為 0 表示不自動重寫 Aof 日志涛舍,重寫是為了使 aof 體積保持最小,而確保保存最完整的數(shù)據(jù)唆途。
auto-aof-rewrite-percentage 100 
#觸發(fā) aof rewrite 的最小文件大小
auto-aof-rewrite-min-size 64mb 
#是否加載由于其他原因?qū)е碌哪┪伯惓5?AOF 文件(主進(jìn)程被 kill/斷電等)
aof-load-truncated yes 
#redis4.0 新增 RDB-AOF 混合持久化格式富雅,在開啟了這個功能之后缤削, AOF 重寫產(chǎn)生的文件將同時包含 RDB 格式的內(nèi)容和 AOF 格式的內(nèi)容,其中 RDB 格式的內(nèi)容用于記錄已有的數(shù)據(jù)吹榴,而 AOF 格式的內(nèi)存則用于記錄最近發(fā)生了變化的數(shù)據(jù)亭敢,這樣 Redis 就可以同時兼有 RDB 持久化和AOF 持久化的優(yōu)點(既能夠快速地生成重寫文件,也能夠在出現(xiàn)問題時图筹,快速地載入數(shù)據(jù))帅刀。
aof-use-rdb-preamble yes 
#lua 腳本的最大執(zhí)行時間, 單位為毫秒
lua-time-limit 5000 
#是否開啟集群模式远剩,默認(rèn)是單機(jī)模式
cluster-enabled yes 
#由 node 節(jié)點自動生成的集群配置文件
cluster-config-file nodes-6379.conf 
#集群中 node 節(jié)點連接超時時間
cluster-node-timeout 15000 
#在執(zhí)行故障轉(zhuǎn)移的時候可能有些節(jié)點和 master 斷開一段時間數(shù)據(jù)比較舊扣溺, 這些節(jié)點就不適用于選舉為 master, 超過這個時間的就不會被進(jìn)行故障轉(zhuǎn)移
cluster-replica-validity-factor 10 
#一個主節(jié)點擁有的至少正常工作的從節(jié)點瓜晤, 即如果主節(jié)點的 slave 節(jié)點故障后會將多余的從節(jié)點分配到當(dāng)前主節(jié)點成為其新的從節(jié)點锥余。cluster-require-full-coverage no #集群槽位覆蓋, 如果一個主庫宕機(jī)且沒有備庫就會出現(xiàn)集群槽位不全痢掠, 那么 yes 情況下 redis 集群槽位驗證不全就不再對外提供服務(wù)驱犹,而 no 則可以繼續(xù)使用但是會出現(xiàn)查詢數(shù)據(jù)查不到的情況(因為有數(shù)據(jù)丟失)。
cluster-migration-barrier 1 

#Slow log 是 Redis 用來記錄查詢執(zhí)行時間的日志系統(tǒng)足画, slow log 保存在內(nèi)存里面雄驹,讀寫速度非常快淹辞,因此你可以放心地使用它医舆,不必?fù)?dān)心因為開啟 slow log 而損害 Redis 的速度。

#以微秒為單位的慢日志記錄象缀, 為負(fù)數(shù)會禁用慢日志蔬将, 為 0 會記錄每個命令操作。
slowlog-log-slower-than 10000 

#記錄多少條慢日志保存在隊列央星,超出后會刪除最早的霞怀, 以此滾動刪除
slowlog-max-len 128 

127.0.0.1:6379> slowlog len
(integer) 14
127.0.0.1:6379> slowlog get
1) 1) (integer) 14
    2) (integer) 1544690617
    3) (integer) 4
    4) 1) "slowlog"
127.0.0.1:6379> SLOWLOG reset
OK

小筆記:配置文件

vim /apps/redis/etc/redis.conf
bind 127.0.0.1 192.168.37.7
protected-mode yes
port 6379
tcp-backlog 511
timeout 0
tcp-keepalive 300   #單位:秒
daemonize yes       #是否已守護(hù)進(jìn)程運行
supervised systemd  #管理redis守護(hù)進(jìn)程
pidfile /apps/redis/run/redis-6379.pid
loglevel notice     #日志級別
logfile "/apps/redis/logs/redis-6379.log"   #日志路徑
databases 16        #設(shè)置 db 庫數(shù)量,默認(rèn) 16 個庫
always-show-logo yes #在啟動 redis 時是否顯示 logo

#快照
save 900 1 #在 900 秒內(nèi)有一個鍵內(nèi)容發(fā)生更改就出就快照機(jī)制
save 300 10
save 60 10000
stop-writes-on-bgsave-error no  #快照出錯時是否禁止 redis 寫入操作
rdbcompression yes          #持久化到 RDB 文件時等曼,是否壓縮里烦, "yes"為壓縮, "no"則反之
rdbchecksum yes             #是否開啟 RC64 校驗禁谦,默認(rèn)是開啟
dbfilename dump.rdb         #快照文件名
dir /apps/redis/data        #快照文件保存路徑

#主從配置
replica-serve-stale-data yes
replica-read-only yes
repl-diskless-sync no
repl-diskless-sync-delay 30
repl-ping-slave-period 10       #檢測存活
repl-timeout 60
repl-disable-tcp-nodelay no
repl-backlog-size 1mb       #復(fù)制緩沖區(qū)大小胁黑, 只有在 slave 連接之后才分配內(nèi)存
repl-backlog-ttl 3600       #多次時間 master 沒有 slave 連接,就清空 backlog 緩沖區(qū)
replica-priority 100

#安全
requirepass 123456          #設(shè)置 redis 連接密碼
rename-command              #重命名一些高危命令州泊,如flushdb,flushall

#連接并發(fā)
maxclients 10000            #最大連接客戶端
maxmemory 4294967296        #最大內(nèi)存丧蘸,單位為 bytes 字節(jié)

#AOF
appendonly yes
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
aof-use-rdb-preamble yes

#其他
lua-time-limit 5000     #lua 腳本的最大執(zhí)行時間, 單位為毫秒

#創(chuàng)建集群后自動添加
cluster-enabled yes
cluster-config-file nodes-6379.conf
cluster-node-timeout 15000
cluster-replica-validity-factor 10
cluster-migration-barrier 1
cluster-require-full-coverage no

#慢日志
slowlog-log-slower-than 10000       #以微秒為單位的慢日志記錄,為負(fù)數(shù)會禁用慢日志力喷, 為 0 會記錄每個命令操作
slowlog-max-len 128         #記錄多少條慢日志保存在隊列刽漂,超出后會刪除最早的, 以此滾動刪除
:wq

slowlog len
slowlog get
1) 1) (integer) 14
    2) (integer) 1544690617
    3) (integer) 4
    4) 1) "slowlog"
SLOWLOG reset

#修復(fù)命令
redis-check-aof --fix /apps/redis/data/appendonly.aof
redis-check-rdb

2.3.2: redis 持久化

  • redis 雖然是一個內(nèi)存級別的緩存程序弟孟,即 redis 是使用內(nèi)存進(jìn)行數(shù)據(jù)的緩存的贝咙,但是其可以將內(nèi)存的數(shù)據(jù)按照一定的策略保存到硬盤上,從而實現(xiàn)數(shù)據(jù)持久保存的目的拂募, redis 支持兩種不同方式的數(shù)據(jù)持久化保存機(jī)制庭猩,分別是 RDB 和 AOF

2.3.2.1: RDB 模式

  • RDB: 基于時間的快照, 只保留當(dāng)前最新的一次快照陈症, 特點是執(zhí)行速度比較快蔼水,缺點是可能會丟失從上次快照到當(dāng)前快照未完成之間的數(shù)據(jù)。

  • RDB 實現(xiàn)的具體過程 Redis 從主進(jìn)程先 fork 出一個子進(jìn)程录肯,使用寫時復(fù)制機(jī)制趴腋,子進(jìn)程將內(nèi)存的數(shù)據(jù)保存為一個臨時文件,比如 dump.rdb.temp论咏,當(dāng)數(shù)據(jù)保存完成之后再將上一次保存的 RDB 文件替換掉优炬,然后關(guān)閉子進(jìn)程,這樣可以保存每一次做 RDB 快照的時候保存的數(shù)據(jù)都是完整的潘靖,因為直接替換 RDB文件的時候可能會出現(xiàn)突然斷電等問題而導(dǎo)致 RDB 文件還沒有保存完整就突然關(guān)機(jī)停止保存而導(dǎo)致數(shù)據(jù)丟失的情況穿剖,可以手動將每次生成的 RDB 文件進(jìn)程備份蚤蔓,這樣可以最大化保存歷史數(shù)據(jù)卦溢。

2.3.2.2: RDB 模式的優(yōu)缺點

  • 優(yōu)點:
    • RDB 快照保存了某個時間點的數(shù)據(jù),可以通過腳本執(zhí)行 bgsave(非阻塞)或者 save(阻塞)命令自定義時間點北備份秀又,可以保留多個備份单寂,當(dāng)出現(xiàn)問題可以恢復(fù)到不同時間點的版本。
    • 可以最大化 o 的性能吐辙,因為父進(jìn)程在保存 RDB 文件的時候唯一要做的是 fork 出一個子進(jìn)程宣决,然后的
    • 操作都會有這個子進(jìn)程操作,父進(jìn)程無需任何的 IO 操作
      RDB 在大量數(shù)據(jù)比如幾個 G 的數(shù)據(jù)昏苏,恢復(fù)的速度比 AOF 的快
  • 缺點:
    • 不能時時的保存數(shù)據(jù)尊沸,會丟失自上一次執(zhí)行 RDB 備份到當(dāng)前的內(nèi)存數(shù)據(jù)
    • 數(shù)據(jù)量非常大的時候,從父進(jìn)程 fork 的時候需要一點時間贤惯,可能是毫秒或者秒

2.3.2.3: AOF 模式

  • AOF:按照操作順序依次將操作添加到指定的日志文件當(dāng)中洼专,特點是數(shù)據(jù)安全性相對較高, 缺點是即使
    有些操作是重復(fù)的也會全部記錄孵构。
  • AOF 和 RDB 一樣使用了寫時復(fù)制機(jī)制屁商, AOF 默認(rèn)為每秒鐘 fsync 一次,即將執(zhí)行的命令保存到 AOF 文件當(dāng)中颈墅,這樣即使 redis 服務(wù)器發(fā)生故障的話頂多也就丟失 1 秒鐘之內(nèi)的數(shù)據(jù)蜡镶,也可以設(shè)置不同的 fsync策略雾袱,或者設(shè)置每次執(zhí)行命令的時候執(zhí)行 fsync, fsync 會在后臺執(zhí)行線程官还,所以主線程可以繼續(xù)處理用戶的正常請求而不受到寫入 AOF 文件的 IO 影響

2.3.2.4: AOF 模式優(yōu)缺點

  • AOF 的文件大小要大于 RDB 格式的文件
    根據(jù)所使用的 fsync 策略(fsync 是同步內(nèi)存中 redis 所有已經(jīng)修改的文件到存儲設(shè)備)芹橡,默認(rèn)是appendfsync everysec 即每秒執(zhí)行一次 fsync

2.4: redis 數(shù)據(jù)類型:

2.4.1: 字符串(string)

字符串是所有編程語言中最常見的和最常用的數(shù)據(jù)類型,而且也是 redis 最基本的數(shù)據(jù)類型之一望伦,而且 redis 中所有的 key 的類型都是字符串僻族。

2.4.1.1: 添加一個 key:
127.0.0.1:6379> set key1 value1
OK
127.0.0.1:6379> get key1
"value1"
127.0.0.1:6379> TYPE key1
string
127.0.0.1:6379> SET name2 jack2 ex 3 #設(shè)置自動過期時間
OK

2.4.1.2: 獲取一個 key 的內(nèi)容
127.0.0.1:6379> get key1
"value1

2.4.1.3: 刪除一個 key
127.0.0.1:6379> DEL key1
(integer)

2.4.1.4:批量設(shè)置多個 key
127.0.0.1:6379> MSET key1 value1 key2 value2
OK

2.4.1.5: 批量獲取多個 key
127.0.0.1:6379> MGET key1 key2
OK

2.4.1.6:追加數(shù)據(jù)
127.0.0.1:6379> APPEND key1 append
(integer) 12
127.0.0.1:6379> get key1
"value1append

2.4.1.7: 數(shù)值遞增
127.0.0.1:6379> set num 10
OK
127.0.0.1:6379> INCR num
(integer) 11
127.0.0.1:6379> get num
"11

2.4.1.8: 數(shù)值遞減
127.0.0.1:6379> set num 10
OK
127.0.0.1:6379> DECR num
(integer) 9
127.0.0.1:6379> get num
"9"

2.4.1.9:返回字符串 key 長度
127.0.0.1:6379> STRLEN key1
(integer) 12

2.4.2: 列表(list)

2.4.2.1:生成列表并插入數(shù)據(jù)

LPUSH列表寫入從右往左,類似list1[0]=jhon,list1[1]=tom,list1[2]=jack

127.0.0.1:6379> LPUSH list1 jack tom jhon
(integer) 3
127.0.0.1:6379> TYPE list1
list

2.4.2.2:向列表追加數(shù)據(jù)
127.0.0.1:6379> LPUSH list1 tom
(integer) 2
127.0.0.1:6379> RPUSH list1 jack
(integer) 3

2.4.2.3: 獲取列表長度
127.0.0.1:6379> LLEN list1

2.4.2.4:獲取列表指定位置數(shù)據(jù):
127.0.0.1:6379> RPUSH list1 zhang wang li zhao
(integer) 4
127.0.0.1:6379> LRANGE list1 1 2 #指定范圍

  1. "wang"
  2. "li"
    127.0.0.1:6379> LRANGE list1 2 2 #指定位置
  3. "li"

2.4.2.5:移除列表數(shù)據(jù):
127.0.0.1:6379> RPOP list1 #最后一個
"jack"
127.0.0.1:6379> LPOP list1 #第一個
"tom"

2.4.3: 集合(set)
  • Set 是 String 類型的無序集合屡谐。集合成員是唯一的述么,這就意味著集合中不能出現(xiàn)重復(fù)的數(shù)據(jù)。

2.4.3.1:生成集合 key
127.0.0.1:6379> SADD set1 v1
(integer) 1
127.0.0.1:6379> SADD set2 v2 v4
(integer) 2
127.0.0.1:6379> TYPE set1
set
127.0.0.1:6379> TYPE set2
set

2.4.3.2: 追加數(shù)值:
追加的時候不能追加已經(jīng)存在的數(shù)值
127.0.0.1:6379> SADD set1 v2 v3 v4
(integer) 3
127.0.0.1:6379> SADD set1 v2 #沒有追加成功
(integer) 0
127.0.0.1:6379> TYPE set1
set
127.0.0.1:6379> TYPE set2
set

2.4.3.3: 查看集合的所有數(shù)據(jù):
127.0.0.1:6379> SMEMBERS set1

  1. "v4"
  2. "v1"
  3. "v3"
  4. "v2"
    127.0.0.1:6379> SMEMBERS set2
  5. "v4"
  6. "v2

2.4.3.4: 獲取集合的差集:
差集: 已屬于 A 而不屬于 B 的元素稱為 A 與 B 的差(集)
127.0.0.1:6379> SDIFF set1 set2

  1. "v1"
  2. "v3"

2.4.3.5: 獲取集合的交集:
交集: 已屬于 A 且屬于 B 的元素稱為 A 與 B 的交(集)
127.0.0.1:6379> SINTER set1 set2

  1. "v4"
  2. "v2

2.4.3.6: 獲取集合的并集:
并集:已屬于 A 或?qū)儆?B 的元素為稱為 A 與 B 的并(集)
127.0.0.1:6379> SUNION set1 set2

  1. "v2"
  2. "v4"
  3. "v1"
  4. "v3"
2.4.4: sorted set(有序集合):
  • Redis 有序集合和集合一樣也是 string 類型元素的集合,且不允許重復(fù)的成員愕掏,不同的是每個元素都會關(guān)聯(lián)一個 double(雙精度浮點型)類型的分?jǐn)?shù)度秘, redis 正是通過分?jǐn)?shù)來為集合中的成員進(jìn)行從小到大的排序, 有序集合的成員是唯一的,但分?jǐn)?shù)(score)卻可以重復(fù)饵撑,集合是通過哈希表實現(xiàn)的剑梳,所以添加,刪除滑潘,查找的復(fù)雜度都是 O(1)垢乙, 集合中最大的成員數(shù)為 2^32 - 1 (4294967295, 每個集合可存儲 40 多億個成員)。

2.4.4.1:生成有序集合:
127.0.0.1:6379> ZADD zset1 1 v1
(integer) 1
127.0.0.1:6379> ZADD zset1 2 v2
(integer) 1
127.0.0.1:6379> ZADD zset1 2 v3
(integer) 1
127.0.0.1:6379> ZADD zset1 3 v4
(integer) 1
127.0.0.1:6379> TYPE zset1
zset
127.0.0.1:6379> TYPE zset2
zset

排行案例:
192.168.7.104:6379> ZADD paihangbang 10 key1 20 key2 30 key3
(integer) 3
192.168.7.104:6379> ZREVRANGE paihangbang 0 -1 withscores #顯示指定集合內(nèi)所有 key 和得分情況

  1. "key3"
  2. "30"
  3. "key2"
  4. "20"
  5. "key1"
  6. "10"

2.4.4.2:批量添加多個數(shù)值:
127.0.0.1:6379> ZADD zset2 1 v1 2 v2 4 v3 5 v5
(integer) 4
2.4.4.3: 獲取集合的長度數(shù):
127.0.0.1:6379> ZCARD zset1
(integer) 4
127.0.0.1:6379> ZCARD zset2
(integer) 4
2.4.4.4:基于索引返回數(shù)值:
127.0.0.1:6379> ZRANGE zset1 1 3

  1. "v2"
  2. "v3"
  3. "v4"
    127.0.0.1:6379> ZRANGE zset1 0 2
  4. "v1"
  5. "v2"
  6. "v3"
    127.0.0.1:6379> ZRANGE zset1 2 2
  7. "v3

2.4.4.5:返回某個數(shù)值的索引:
127.0.0.1:6379> ZRANK zset1 v2
(integer) 1
127.0.0.1:6379> ZRANK zset1 v3
(integer) 2

2.4.5:哈希(hash):
  • hash 是一個 string 類型的 field 和 value 的映射表语卤, hash 特別適合用于存儲對象,Redis 中每個 hash 可以存儲 2^32 - 1 鍵值對(40 多億)追逮。

2.4.5.1:生成 hash key

127.0.0.1:6379> HSET hset1 name tom age 18
(integer) 1
127.0.0.1:6379> TYPE hset1
hash

2.4.5.2: 獲取 hash key 字段值

127.0.0.1:6379> HGET hset1 name
"tom"
127.0.0.1:6379> HGET hset1 age
"18"

2.4.5.3: 刪除一個 hash key 的字段

127.0.0.1:6379> HDEL hset1 age
(integer) 1

2.4.5.4:獲取所有 hash 表中的字段

127.0.0.1:6379> HSET hset1 name tom age 19
(integer) 1
127.0.0.1:6379> HKEYS hset1

  1. "name"
  2. "age

2.5: 消息隊列

  • 消息隊列主要分為兩種,分別是生產(chǎn)者消費者模式和發(fā)布者訂閱者模式粹舵,這兩種模式 Redis 都支持
2.5.1: 生產(chǎn)者消費者模式
  • 在生產(chǎn)者消費者(Producer/Consumer)模式下钮孵, 上層應(yīng)用接收到的外部請求后開始處理其當(dāng)前步驟的操作,在執(zhí)行完成后將已經(jīng)完成的操作發(fā)送至指定的頻道(channel)當(dāng)中眼滤,并由其下層的應(yīng)用監(jiān)聽該頻道并繼續(xù)下一步的操作巴席, 如果其處理完成后沒有下一步的操作就直接返回數(shù)據(jù)給外部請求,如果還有下一步的操作就再將任務(wù)發(fā)布到另外一個頻道诅需, 由另外一個消費者繼續(xù)監(jiān)聽和處理漾唉。

2.5.1.1: 模式介紹

  • 生產(chǎn)者消費者模式下, 多個消費者同時監(jiān)聽一個隊里堰塌,但是一個消息只能被最先搶到消息的消費者消費赵刑, 即消息任務(wù)是一次性讀取和處理, 此模式在分布式業(yè)務(wù)架構(gòu)中非常常用蔫仙, 比較常用的軟件還有RabbitMQ料睛、 Kafka、 RocketMQ、 ActiveMQ 等

    image.png

2.5.1.2:隊列介紹

  • 隊列當(dāng)中的 消息由不同的生產(chǎn)者寫入也會有不同的消費者取出進(jìn)行消費處理恤煞,但是一個消息一定是只能被取出一次也就是被消費一次屎勘。
  • image.png

2.5.1.3: 生產(chǎn)者發(fā)布消息

[root@redis-s4 ~]# redis-cli
127.0.0.1:6379> AUTH 123456
OK
127.0.0.1:6379> LPUSH channel1 msg1 #從管道的左側(cè)寫入
(integer) 1
127.0.0.1:6379> LPUSH channel1 msg2
(integer) 2
127.0.0.1:6379> LPUSH channel1 msg3
(integer) 3
127.0.0.1:6379> LPUSH channel1 msg4
(integer) 4
127.0.0.1:6379> LPUSH channel1 msg5
(integer) 5

2.5.1.4:查看隊列所有消息

127.0.0.1:6379> LRANGE channel1 0 -1

  1. "msg5"
  2. "msg4"
  3. "msg3"
  4. "msg2"
  5. "msg1"

2.5.1.5: 消費者消費消息

127.0.0.1:6379> RPOP channel1 #從管道的右側(cè)消費
"msg1"
127.0.0.1:6379> RPOP channel1
"msg2"
127.0.0.1:6379> RPOP channel1
"msg3"
127.0.0.1:6379> RPOP channel1
"msg4"
127.0.0.1:6379> RPOP channel1
"msg5"
127.0.0.1:6379> RPOP channel1
(nil)

2.5.1.6: 再次驗證隊列消息
127.0.0.1:6379> LRANGE channel1 0 -1
(empty list or set) #隊列中的消息已經(jīng)被已全部消費完畢

2.5.2: 發(fā)布者訂閱模式

2.5.2.1: 模式簡介

  • 在發(fā)布者訂閱者模式下,發(fā)布者將消息發(fā)布到指定的 channel 里面居扒, 凡是監(jiān)聽該 channel 的消費者都會收到同樣的一份消息概漱,這種模式類似于是收音機(jī)模式,即凡是收聽某個頻道的聽眾都會收到主持人發(fā)布的相同的消息內(nèi)容喜喂。
  • 此模式常用語群聊天瓤摧、 群通知、群公告等場景玉吁。
  • Subscriber:訂閱者
  • Publisher: 發(fā)布者
  • Channel: 頻道
image.png

2.5.2.2:訂閱者監(jiān)聽頻道

[root@redis-s4 ~]# redis-cli
127.0.0.1:6379> AUTH 123456
OK
127.0.0.1:6379> SUBSCRIBE channel1 #訂閱者訂閱指定的頻道
Reading messages... (press Ctrl-C to quit)

  1. "subscribe"
  2. "channel1"
  3. (integer) 1

2.5.2.3: 發(fā)布者發(fā)布消息

127.0.0.1:6379> PUBLISH channel1 test1 #發(fā)布者發(fā)布消息
(integer) 2
127.0.0.1:6379> PUBLISH channel1 test2
(integer) 2
127.0.0.1:6379>

2.5.2.4:各訂閱者驗證消息

127.0.0.1:6379> SUBSCRIBE channel1

2.5.2.5: 訂閱多個頻道
訂閱指定的多個頻道
> SUBSCRIBE channel1 channel2

2.5.2.6: 訂閱所有頻道
127.0.0.1:6379> PSUBSCRIBE *

2.7.2.7: 訂閱匹配的頻道
> PSUBSCRIBE chann* #匹配訂閱多個頻道

2.6: redis 其他命令

2.6.1: CONFIG
config 命令用于查看當(dāng)前 redis 配置照弥、以及不重啟更改 redis 配置等

2.6.1.1: 更改最大內(nèi)存
127.0.0.1:6379> CONFIG set maxmemory 8589934592
OK
127.0.0.1:6379> CONFIG get maxmemory

  1. "maxmemory"
  2. "8589934592"

2.6.1.2: 設(shè)置連接密碼
127.0.0.1:6379> CONFIG SET requirepass 123456 #臨時修改密碼
OK

2.5.1.3: 或當(dāng)前配置
CONFIG GET *

2.6.2: info
顯示當(dāng)前節(jié)點 redis 運行狀態(tài)信息

2.6.3: SELECT 切換數(shù)據(jù)庫
select 1

2.6.4: keys
查看當(dāng)前庫下的所有 key
key *

2.6.5: BGSAVE
手動在后臺執(zhí)行 RDB 持久化操作

2.6.6: DBSIZE
返回當(dāng)前庫下的所有 key 數(shù)量

2.6.7: FLUSHDB
強(qiáng)制清空當(dāng)前庫中的所有 key

2.6.8: FLUSHALL
強(qiáng)制清空當(dāng)前 redis 服務(wù)器所有數(shù)據(jù)庫中的所有 key, 即刪除所有數(shù)據(jù)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
禁止轉(zhuǎn)載进副,如需轉(zhuǎn)載請通過簡信或評論聯(lián)系作者这揣。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市影斑,隨后出現(xiàn)的幾起案子给赞,更是在濱河造成了極大的恐慌,老刑警劉巖矫户,帶你破解...
    沈念sama閱讀 212,718評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件片迅,死亡現(xiàn)場離奇詭異,居然都是意外死亡皆辽,警方通過查閱死者的電腦和手機(jī)柑蛇,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來膳汪,“玉大人唯蝶,你說我怎么就攤上這事∫潘裕” “怎么了?”我有些...
    開封第一講書人閱讀 158,207評論 0 348
  • 文/不壞的土叔 我叫張陵鼓蜒,是天一觀的道長痹换。 經(jīng)常有香客問我,道長都弹,這世上最難降的妖魔是什么娇豫? 我笑而不...
    開封第一講書人閱讀 56,755評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮畅厢,結(jié)果婚禮上冯痢,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好浦楣,可當(dāng)我...
    茶點故事閱讀 65,862評論 6 386
  • 文/花漫 我一把揭開白布袖肥。 她就那樣靜靜地躺著,像睡著了一般振劳。 火紅的嫁衣襯著肌膚如雪椎组。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,050評論 1 291
  • 那天历恐,我揣著相機(jī)與錄音寸癌,去河邊找鬼。 笑死弱贼,一個胖子當(dāng)著我的面吹牛蒸苇,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播吮旅,決...
    沈念sama閱讀 39,136評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼填渠,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了鸟辅?” 一聲冷哼從身側(cè)響起氛什,我...
    開封第一講書人閱讀 37,882評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎匪凉,沒想到半個月后枪眉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,330評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡再层,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,651評論 2 327
  • 正文 我和宋清朗相戀三年贸铜,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片聂受。...
    茶點故事閱讀 38,789評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡蒿秦,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蛋济,到底是詐尸還是另有隱情棍鳖,我是刑警寧澤,帶...
    沈念sama閱讀 34,477評論 4 333
  • 正文 年R本政府宣布碗旅,位于F島的核電站渡处,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏祟辟。R本人自食惡果不足惜医瘫,卻給世界環(huán)境...
    茶點故事閱讀 40,135評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望旧困。 院中可真熱鬧醇份,春花似錦稼锅、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至畔濒,卻和暖如春剩晴,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背侵状。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評論 1 267
  • 我被黑心中介騙來泰國打工赞弥, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人趣兄。 一個月前我還...
    沈念sama閱讀 46,598評論 2 362
  • 正文 我出身青樓绽左,卻偏偏與公主長得像,于是被迫代替她去往敵國和親艇潭。 傳聞我的和親對象是個殘疾皇子拼窥,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,697評論 2 351

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