1.關(guān)系型與非關(guān)系型
關(guān)系型:mysql oracle
非關(guān)系型:redis mongo ES
2.Redis重要特性
1.速度快:c語言編寫的、代碼優(yōu)雅、單線程架構(gòu)
2.支持多種數(shù)據(jù)語言結(jié)構(gòu):字符串、哈希、列表、集合、有序集合、地理位置
3.豐富功能:天然計(jì)數(shù)器、鍵過期功能、消息隊(duì)列
4.支持客戶端語言多:php、java、pythom
5.數(shù)據(jù)持久化:所有的數(shù)據(jù)都運(yùn)行在內(nèi)存中、支持2種格式的持久化數(shù)據(jù)A0F、RDB、混合模式:AOF&RDB
6.自帶多種高可用架構(gòu):主從、哨兵、集群
3.Redis應(yīng)用場(chǎng)景
1.緩存-鍵過期時(shí)間:
把session會(huì)話存在redis,過期刪除
緩存用戶信息,緩存Mysql部分?jǐn)?shù)據(jù),用戶先訪問redis,redis沒有再訪問mysql,然后回寫給redis
商城優(yōu)惠卷過期時(shí)間2.排行榜-列表&有序集合:
熱度/點(diǎn)擊數(shù)排行榜
直播間禮物積分排行3.計(jì)數(shù)器-天然支持計(jì)數(shù)器:
帖子瀏覽數(shù)
視頻播放數(shù)
評(píng)論數(shù)
點(diǎn)贊/踩4.社交網(wǎng)絡(luò)-集合:
粉絲
共同好友
興趣愛好
標(biāo)簽5.消息隊(duì)列-發(fā)布訂閱:
配合ELK緩存收集來的日志
4.Redis安裝部署
官方:https://redis.io/
國內(nèi)網(wǎng)站:http://www.redis.cn/(速度快)版本選擇:
2.x : 很老,淘汰
3.x : redis-cluster(出現(xiàn)集群功能)
4.x : 混合持久化
5.x : 新增加了流處理類型,最新穩(wěn)定版
#規(guī)劃目錄
/data/soft 下載目錄
/opt/redis_6379/{conf,logs,pid} 安裝目錄,日志目錄,pid目錄,配置目錄 # redis默認(rèn)端口為6379
/data/redis_6379/ 數(shù)據(jù)目錄
--------------------------------------------------------------------------------------------
mkdir /data/soft -p
mkdir /opt/redis_6379/{conf,logs,pid} -p
mkdir /data/redis_6379 -p
cd /data/soft/
wget http://download.redis.io/releases/redis-5.0.8.tar.gz
tar xf redis-5.0.8.tar.gz -C /opt/
cd /opt/
ln -s redis-5.0.8/ /opt/redis
cd redis
make
echo $?
make install
#安裝完成后嘗試redis+tab鍵是否命令可以自動(dòng)補(bǔ)全
#配置文件
cat >/opt/redis_6379/conf/redis_6379.conf<< EOF
daemonize yes
bind 127.0.0.1 10.0.0.51
port 6379
pidfile /opt/redis_6379/pid/redis_6379.pid
logfile /opt/redis_6379/logs/redis_6379.log
EOF
#daemonize yes 后臺(tái)啟動(dòng)默認(rèn)為no
#啟動(dòng)命令
redis-server /opt/redis_6379/conf/redis_6379.conf
#檢查
ps -ef|grep redis
netstat -lntup|grep 6379
#連接redis終端
[root@db01 ~]# redis-cli
127.0.0.1:6379>
127.0.0.1:6379> set k1 v1
OK
127.0.0.1:6379> get k1
"v1"
127.0.0.1:6379>
#關(guān)閉命令
- kill
- pkill
- redis-cli
>SHUTDOWN
- redis-cli shutdown
5.Redis全局命令
全局命令是指對(duì)所有數(shù)據(jù)類型都通用的命令
redis數(shù)據(jù)格式:
key:value
鍵:值
- 寫入數(shù)據(jù)(單、多)
#單條數(shù)據(jù)寫入
127.0.0.1:6379> set k1 v1
OK
k1:鍵
v1:值
#多條數(shù)據(jù)寫入(一對(duì)式。一個(gè)key跟一個(gè)值)
127.0.0.1:6379> mset k1 v1 k2 v2 k3 v3
OK
127.0.0.1:6379> keys *
1) "k3"
2) "k2"
3) "k1"
- 查看key的值(單、多)
127.0.0.1:6379> get k1
"v1"
#只需輸入key名稱得值
#多條key名稱同時(shí)查值
127.0.0.1:6379> mget k1 k2 k3
1) "v1"
2) "v2"
3) "v3"
- 查看所有的key(危險(xiǎn)命令!禁止企業(yè)中使用)
127.0.0.1:6379> keys *
1) "k1"
#企業(yè)中數(shù)據(jù)大時(shí),容易卡死服務(wù)器
- 查看總共有多少個(gè)key(鍵)
127.0.0.1:6379> dbsize
(integer) 4
#當(dāng)前總共有4個(gè)數(shù)量key
- 查看某個(gè)Key是否存在
127.0.0.1:6379> exists k1
(integer) 1
127.0.0.1:6379> exists k2
(integer) 1
127.0.0.1:6379> exists k5
(integer) 0
127.0.0.1:6379> exists k1 k2 k5
(integer) 2
#狀態(tài)碼:
0 表示這個(gè)key不存在
1 表示這個(gè)key存在
N 表示存在N個(gè)key(可多key查詢)
- .刪除key
127.0.0.1:6379> del k4
(integer) 1
127.0.0.1:6379> del k5
(integer) 0
#狀態(tài)碼:
0 表示這個(gè)key不存在
1 表示這個(gè)key存在,并且刪除成功了
N 表示N個(gè)key存在,并且刪除成功了N個(gè)key(可多key 刪除)
- 設(shè)置鍵過期
#設(shè)置過期時(shí)間(秒為單位)
EXPIRE k1 10
#狀態(tài)碼:
0 這個(gè)key不存在
1 這個(gè)key存在,并且設(shè)置過期時(shí)間成功
- 查詢和取消鍵過期
查看keys是否過期
TTL k1
狀態(tài)碼:
-1 這個(gè)key存在,并且沒有設(shè)定存活周期,永不過期
-2 這個(gè)key不存在
N 這個(gè)key存在,并且在N秒后過期
取消過期時(shí)間:
第一種方法:
PERSIST k1
第二種方法:(重新寫入原數(shù)據(jù)方式,取消key過期)
set k1 v1
結(jié)論:
過期后的key會(huì)被直接刪除
6.天然計(jì)數(shù)器
#每次加1
127.0.0.1:6379> set k1 1
OK
127.0.0.1:6379> TYPE k1
string
127.0.0.1:6379> incr k1
(integer) 2
127.0.0.1:6379> incr k1
(integer) 3
127.0.0.1:6379> incr k1
(integer) 4
127.0.0.1:6379> get k1
"4"
#加N(輸入想要的數(shù)字)
127.0.0.1:6379> INCRBY k1 100
(integer) 104
127.0.0.1:6379> get k1
"104"
----------------------------------------------------------------
#減1:
127.0.0.1:6379> get k1
"104"
127.0.0.1:6379> INCRBY k1 -1
(integer) 103
127.0.0.1:6379> get k1
"103"
#減N(輸入想要減去的數(shù)字)
127.0.0.1:6379> get k1
"103"
127.0.0.1:6379> INCRBY k1 -99
(integer) 4
127.0.0.1:6379> get k1
"4"
7.列表操作
- 插入列表
LPUSH:從列表左側(cè)插入數(shù)據(jù)
RPUSH:從列表右側(cè)插入數(shù)據(jù)
例如:
lpush list1 a
rpush list1 b
#無論是從左或是從右,都是按照順序一個(gè)數(shù)據(jù)一個(gè)數(shù)據(jù)的插入列表中
- 查看列表內(nèi)容的長(zhǎng)度
LLEN list1
- 查看列表內(nèi)容
LRANGE list1 0 -1 # 查看所有內(nèi)容
LRANGE list1 0 -2 # 0:代表第一個(gè)值,0-2:代表第1-3的值,顯示
LRANGE list1 0 -0 # 只顯示單條數(shù)據(jù)。這里指只顯示第一個(gè)值
- 刪除列表元素
LPOP: 從列表左邊刪除一個(gè)元素
RPOP: 從列表右邊刪除一個(gè)元素
例:
LPOP list1 #list1列表的名稱
RPOP list1
#只支持按照從左或從右的順序,一個(gè)值,一個(gè)值的刪除。
- 刪除整個(gè)列表
del list1
#刪除整個(gè)list1列表以及中的數(shù)據(jù)
8.hash操作
- 創(chuàng)建一個(gè)Hash數(shù)據(jù)
HMSET user:1 name bobo job IT age 28
HMSET user:2 name json job py age 29
HMSET user:3 name hao job bug age 19
- 查看Hash里指定的值
#mysql操作:
select name from user where id =1 ;
#Hash操作:
HMGET user:1 name # 單個(gè)key
HMGET user:1 name job age # 多個(gè)key
4.查看Hash里所有的值
- 查看Hash所有的值
mysql操作:
select * from user where id =1 ;
Hash操作:
HGETALL user:1
9.集合操作set
集合不允許出現(xiàn)重復(fù)的值,自動(dòng)去重
- 創(chuàng)建集合
sadd set1 1 2 3
sadd set2 1 3 5 7
- 查看集合成員
smembers set1
smembers set2
- 查看集合的交集
127.0.0.1:6379> sinter set1 set2
1) "1"
2) "3"
- 查看集合的并集
127.0.0.1:6379> sunion set1 set2
1) "1"
2) "2"
3) "3"
4) "5"
5) "7"
- 查看集合的差集(前面減去后面)
127.0.0.1:6379> sdiff set1 set2
1) "2"
127.0.0.1:6379> sdiff set2 set1
1) "5"
2) "7"
- 刪除一個(gè)成員
srem set1 1
10.有序集合操作
- 添加成員
#有序集合是在集合基礎(chǔ)上,加入分?jǐn)?shù)制。
zadd sz3100 json
zadd sz3 90 bobo
zadd SZ3 99 xiaocancan
zadd SZ3 98 bughao
- 計(jì)算成員個(gè)數(shù)
zcard sz3
- 計(jì)算某個(gè)成員分?jǐn)?shù)
127.0.0.1:6379> zscore sz3 json
"100"
- 按照降序查看成員名次
zrank sz3 json
zrank sz3 bobo
- 按照升序查看成員名次
zrevrank sz3 json
zrevrank sz3 bobo
- .刪除成員
zrem sz3 json
- 增加成員分?jǐn)?shù)
zincrby sz3 2 xiaocancan
zscore sz3 xiaocancan
- 返回指定排名范圍的成員
zrange sz3 0 3
zrange sz3 0 3 withscores #顯示詳細(xì)信息
- 返回指定分?jǐn)?shù)范圍的成員
zrangebyscore sz3 95 100
zrangebyscore sz3 95 100 withscores #顯示詳細(xì)信息
- 返回指定分?jǐn)?shù)范圍的成員的個(gè)數(shù)
zcount sz3 90 110
11.Redis數(shù)據(jù)持久化
Redis自帶兩種方式提供數(shù)據(jù)持久化:
RDB和AOF介紹:
RDB:類似于快照的形式,當(dāng)前內(nèi)存里的狀態(tài)持久化到硬盤里
優(yōu)點(diǎn):壓縮格式/恢復(fù)速度快
缺點(diǎn):不是實(shí)時(shí)的,可能會(huì)丟失數(shù)據(jù),操作比較重AOF:類似于mysql的binlog,可以設(shè)置為每秒/每次操作以追加的形式持久化
優(yōu)點(diǎn):安全,最多損失1秒的數(shù)據(jù),可讀
缺點(diǎn):文件比較大,恢復(fù)速度慢
- 配置RDB(類似全備)
#在配置文件中加入
vim /opt/redis_6379/conf/redis_6379.conf
save 900 1 # 15分鐘內(nèi)發(fā)生一個(gè)key改變保存一次rdb
save 300 10 # 5分鐘內(nèi)發(fā)生十個(gè)key改變保存一次rdb
save 60 10000 # 1分鐘內(nèi)發(fā)生一萬個(gè)key改變保存一次rdb
dbfilename redis.rdb # 指定rdb文件名
dir /data/redis_6379/ # 指定保存的路徑
#手動(dòng)保存bgsave命令
127.0.0.1:6379> bgsave
Background saving started
#RDB總結(jié):
1.沒有配置save參數(shù)時(shí),shutdown不會(huì)持久化保存
2.沒有配置save參數(shù)時(shí),可以手動(dòng)執(zhí)行bgsave觸發(fā)持久化
3.在配置了save參數(shù)后,shutdown,kill,pkill都會(huì)自動(dòng)觸發(fā)bgsave
4.恢復(fù)的時(shí)候,rdb文件名要和配置文件里寫的一樣。
5.RDB高版本兼容低版本,低版本不兼容高版本
- 配置AOF(實(shí)時(shí)備份)
#在配置文件中加入
vim /opt/redis_6379/conf/redis_6379.conf
appendonly yes # 系統(tǒng)默認(rèn)為關(guān)閉狀態(tài)
appendfilename "redis.aof" # 定義aof的文件名
appendfsync everysec # 備份規(guī)則,實(shí)時(shí)備份,系統(tǒng)默認(rèn)
-----------------------------------------------------------------------------------------
# 手動(dòng)執(zhí)行保存命令技巧:BGREWRITEAOF # 壓縮aof文件的大小
# 5.0以上的redis默認(rèn)開啟混合模式:aof-use-rdb-preamble yes
#AOF總結(jié):
#AOF存在重寫機(jī)制:當(dāng)數(shù)據(jù)操作有del某條數(shù)據(jù)類似操作,之前寫入的數(shù)據(jù)將不再寫入磁盤持久化
#當(dāng)aof和rdb同時(shí)存在時(shí),重啟redis會(huì)優(yōu)先讀取aof的內(nèi)容
如何選擇rdb還是aof
#Redis持久化優(yōu)化:
1.開啟混合模式
2.開啟aof
3.不開啟rdb
4.rdb采用定時(shí)任務(wù)的方式定時(shí)備份
#aof文件故障模擬實(shí)驗(yàn)結(jié)論
1.aof文件損壞之后,使用修復(fù)工具,一刀流,從aof文件出錯(cuò)的地方開始到最后全部刪掉
2.任何操作之前,先備份數(shù)據(jù)
3.aof備份一般情況最多損失1秒的數(shù)據(jù)
#實(shí)驗(yàn):如果設(shè)置了過期時(shí)間,恢復(fù)數(shù)據(jù)會(huì)如何處理
1.aof文件會(huì)記錄下過期的時(shí)間
2.恢復(fù)的時(shí)候會(huì)去對(duì)比記錄的過期時(shí)間和當(dāng)前時(shí)間,如果超過了,就刪除key
3.key的過期時(shí)間不受備份恢復(fù)影響
12Redis用戶認(rèn)證
- 配置文件
vim /opt/redis_6379/conf/redis_6379.conf
requirepass 123 #ccookzhang:密碼
----------------------------------------------------------------------
#使用密碼登錄
#方式一:
[root@db01 ~]# redis-cli
127.0.0.1:6379> AUTH 123
OK
127.0.0.1:6379> set k1 v1
OK
#方式二:
redis-cli -a 123 get k1
#為什么redis的密碼認(rèn)證這么簡(jiǎn)單?
1.redis一般都部署在內(nèi)網(wǎng)環(huán)境,默認(rèn)是比較安全的環(huán)境
2.有同學(xué)擔(dān)心密碼寫在配置文件里,開發(fā)不允許登陸到Linux服務(wù)器上,但是可以連接到redis,設(shè)個(gè)密碼安全些
13.禁用或重命名危險(xiǎn)命令
#禁用危險(xiǎn)命令
vim /opt/redis_6379/conf/redis_6379.conf
rename-command CONFIG "" #127.0.0.1:6379> CONFIG GET * 獲取所有redis服務(wù)配置信息
rename-command KEYS ""
rename-command SHUTDOWN ""
rename-command FLUSHALL "" # 清空所有數(shù)據(jù)
rename-command DEL ""
rename-command FLUSHDB ""
#shutdown禁用了 讓后用kill?(可以自己定義新的對(duì)于暗號(hào)命令)
vim /opt/redis_6379/conf/redis_6379.conf
rename-command SHUTDOWN "555"
14.Redis主從復(fù)制
- 快速部署第二臺(tái)服務(wù)器
# 從已經(jīng)部署好的db01服務(wù)器上直接拉取程序文件
rsync -avz 10.0.0.51:/opt/* /opt/
mkdir /data/redis_6379/ -p
cd /opt/redis
make install # 需要重新安裝下命令
sed -i 's#51#52#g' /opt/redis_6379/conf/redis_6379.conf
redis-server /opt/redis_6379/conf/redis_6379.conf
-------------------------------------------------------------------------------
#db01 maste 服務(wù)器模擬環(huán)境,寫入測(cè)試數(shù)據(jù)
for i in {1..1000};do redis-cli -h 10.0.0.51 set k${i} ${i};done
-----------------------------------------------------------------------------------------
#配置主從復(fù)制
#方法1:(臨時(shí)生效)
redis-cli -h 10.0.0.52 slaveof 10.0.0.51 6379
#方法2:(永久生效,但是部署哨兵后)
寫進(jìn)配置文件
vim /opt/redis_6379/conf/redis_6379.conf
slaveof 10.0.0.51 6379
15.Redis配置systemctl方式啟動(dòng)
#1.創(chuàng)建用戶并更改目錄授權(quán)
useradd redis -M -s /sbin/nologin
chown -R redis:redis /opt/redis*
chown -R redis:redis /data/redis*
#2.編寫systemd啟動(dòng)文件
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=/usr/local/bin/redis-server /opt/redis_6379/conf/redis_6379.conf --supervised systemd
ExecStop=/usr/local/bin/redis-cli shutdown
Type=notify
User=redis
Group=redis
RuntimeDirectory=redis
RuntimeDirectoryMode=0755
[Install]
WantedBy=multi-user.target
#3.啟動(dòng)
systemctl daemon-reload
systemctl start redis
16.主從復(fù)制的流程
#簡(jiǎn)單流程
1.從節(jié)點(diǎn)發(fā)送同步請(qǐng)求到主節(jié)點(diǎn)
2.主節(jié)點(diǎn)接收到從節(jié)點(diǎn)的請(qǐng)求之后,做了如下操作
- 立即執(zhí)行bgsave將當(dāng)前內(nèi)存里的數(shù)據(jù)持久化到磁盤上
- 持久化完成之后,將rdb文件發(fā)送給從節(jié)點(diǎn)
3.從節(jié)點(diǎn)從主節(jié)點(diǎn)接收到rdb文件之后,做了如下操作
- 清空自己的數(shù)據(jù)(如果做從節(jié)點(diǎn)的機(jī)器有數(shù)據(jù)一點(diǎn)要先備份好,同步開啟會(huì)同步master節(jié)點(diǎn)的rdb和aof文件,自己原本數(shù)據(jù)將無法恢復(fù))
- 載入從主節(jié)點(diǎn)接收的rdb文件到自己的內(nèi)存里
4.后面的操作就是和主節(jié)點(diǎn)實(shí)時(shí)的了
5.故障時(shí)從節(jié)點(diǎn)無法自行修復(fù),需要手動(dòng)關(guān)閉主從復(fù)制
命令:SLAVEOF no one
- 主從復(fù)制注意
6.主從復(fù)制注意
1.從節(jié)點(diǎn)只讀不可寫
2.從節(jié)點(diǎn)不會(huì)自動(dòng)故障轉(zhuǎn)移,它會(huì)一直同步主
10.0.0.52:6379> set k1 v1
(error) READONLY You can't write against a read only slave.
3.主從復(fù)制故障轉(zhuǎn)移需要人工介入
修改代碼指向REDIS的IP地址
從節(jié)點(diǎn)需要執(zhí)行SLAVEOF no one
4.從節(jié)點(diǎn)會(huì)清空自己原有的數(shù)據(jù),如果同步的對(duì)象寫錯(cuò)了,就會(huì)導(dǎo)致數(shù)據(jù)丟失
5.從庫和主庫后續(xù)的同步依靠的是redis的協(xié)議,而不是RDB文件,RDB文件只是第一次建立同步時(shí)使用。
6.從庫也可以正常的持久化文件7.安全的操作
無論是同步,無論是主節(jié)點(diǎn)還是從節(jié)點(diǎn),請(qǐng)先備份一下數(shù)據(jù)