教程揭秘 | 動(dòng)力節(jié)點(diǎn)內(nèi)部Java零基礎(chǔ)教學(xué)文檔第十六篇:Redis
接上期后續(xù)
本期分享第十六章節(jié)
Redis
已經(jīng)分享一大半了,你們都跟上了嗎?
每天都在學(xué)習(xí)嘛?
有什么不會(huì)的嘛?
今日教學(xué)文檔分享來了?

今日新篇章
【Redis】
主要內(nèi)容
1.?NoSQL和redis簡(jiǎn)介
2.?redis安裝、啟動(dòng)、停止
3.?redis相關(guān)數(shù)據(jù)類型
4.?redis相關(guān)命令詳解
5.?redis.conf配置文件詳解
6.?redis持久化
7.?redis從主從,哨兵
8.?redis集群配置
9.?reids客戶端的使用
10.?java連接reids
11.?spring里面使用redis
12.?spring+redis+mysql+aop做緩存
13.?springboot中使用Redis
14.?redis鍵值 的設(shè)置原則
15.?重點(diǎn)解釋面試中的緩存穿透、擊穿、雪崩的問題
學(xué)習(xí)目標(biāo)

1.?【熟悉】NoSQL的簡(jiǎn)介
1.1?什么是NoSQL
NoSQL 是 Not Only SQL 的縮寫,意即"不僅僅是SQL"的意思,泛指非關(guān)系型的數(shù)據(jù)庫。強(qiáng)調(diào)Key-Value Stores和文檔數(shù)據(jù)庫的優(yōu)點(diǎn)。
NoSQL產(chǎn)品是傳統(tǒng)關(guān)系型數(shù)據(jù)庫的功能閹割版本,通過減少用不到或很少用的功能,來大幅度提高產(chǎn)品性能(性能為王)
1.2?NoSQL起源
過去,關(guān)系型數(shù)據(jù)庫(SQL Server、Oracle、MySQL)是數(shù)據(jù)持久化的唯一選擇,但隨著發(fā)展,關(guān)系型數(shù)據(jù)庫存在以下問題。??2000次/s ?秒殺 搶購 ??QPS
1.2.1?問題1:不能滿足高性能查詢需求
我們使用:Java、.Net等語言編寫程序,是面向?qū)ο蟮?。但用?shù)據(jù)庫都是關(guān)系型數(shù)據(jù)庫。存儲(chǔ)結(jié)構(gòu)是面向?qū)ο蟮?,但是?shù)據(jù)庫卻是關(guān)系的,所以在每次存儲(chǔ)或者查詢數(shù)據(jù)時(shí),我們都需要做轉(zhuǎn)換。類似Hibernate、Mybatis這樣的ORM框架確實(shí)可以簡(jiǎn)化這個(gè)過程,但是在對(duì)高性能查詢需求時(shí),這些ORM框架就捉襟見肘了。
1.2.2?問題2:應(yīng)用程序規(guī)模的變大
網(wǎng)絡(luò)應(yīng)用程序的規(guī)模變大,需要儲(chǔ)存更多的數(shù)據(jù)、服務(wù)更多的用戶以及需求更多的計(jì)算能力。為了應(yīng)對(duì)這種情形,我們需要不停的擴(kuò)展。
擴(kuò)展分為兩類:一種是縱向擴(kuò)展,即購買更好的機(jī)器,更多的磁盤、更多的內(nèi)存等等。另一種是橫向擴(kuò)展,即購買更多的機(jī)器組成集群。在巨大的規(guī)模下,縱向擴(kuò)展發(fā)揮的作用并不是很大。首先單機(jī)器性能提升需要巨額的開銷并且有著性能的上限,在Google和Facebook這種規(guī)模下,永遠(yuǎn)不可能使用一臺(tái)機(jī)器支撐所有的負(fù)載。鑒于這種情況,我們需要新的數(shù)據(jù)庫,因?yàn)殛P(guān)系數(shù)據(jù)庫并不能很好的運(yùn)行在集群上
1.3?NoSQL數(shù)據(jù)庫類型
1.3.1?鍵值(Key-Value)數(shù)據(jù)庫[Redis/Memcached]---HashMap
適用場(chǎng)景:
儲(chǔ)存用戶信息,比如會(huì)話、配置文件、參數(shù)、購物車等等。這些信息一般都和ID(鍵)掛鉤,這種情景下鍵值數(shù)據(jù)庫是個(gè)很好的選擇。
不適用場(chǎng)景:
1.取代通過鍵查詢,而是通過值來查詢。Key-Value數(shù)據(jù)庫中根本沒有通過值查詢的途徑
2.需要儲(chǔ)存數(shù)據(jù)之間的關(guān)系。在Key-Value數(shù)據(jù)庫中不能通過兩個(gè)或以上的鍵來關(guān)聯(lián)數(shù)據(jù)。
3.事務(wù)的支持。在Key-Value數(shù)據(jù)庫中故障產(chǎn)生時(shí)不可以進(jìn)行回滾。
1.3.2?②面向文檔(Document-Oriented)數(shù)據(jù)庫[MongoDB]?ES
數(shù)據(jù)可以使用XML、JSON或者JSONB等多種形式存儲(chǔ)。?{“name”:“abc”}
適用場(chǎng)景:1.日志 2.分析
不適用場(chǎng)景:不支持事務(wù)
1.3.3?③列存儲(chǔ)(Wide Column Store/Column-Family)數(shù)據(jù)庫[HBASE]
列存儲(chǔ)數(shù)據(jù)庫將數(shù)據(jù)儲(chǔ)存在列族(column family)中,一個(gè)列族存儲(chǔ)經(jīng)常被一起查詢的相關(guān)數(shù)據(jù)。舉個(gè)例子,如果我們有一個(gè)Person類,我們通常會(huì)一起查詢他們的姓名和年齡而不是薪資。這種情況下,姓名和年齡就會(huì)被放入一個(gè)列族中,而薪資則在另一個(gè)列族中。
適用場(chǎng)景:1.日志 2.博客平臺(tái),我們儲(chǔ)存每個(gè)信息到不同的列族中。舉個(gè)例子,標(biāo)簽可以儲(chǔ)存在一個(gè),類別可以在一個(gè),而文章則在另一個(gè)。
不適用場(chǎng)景:1.ACID事務(wù) 2.原型設(shè)計(jì)。在模型設(shè)計(jì)之初,我們根本不可能去預(yù)測(cè)它的查詢方式,而一旦查詢方式改變,我們就必須重新設(shè)計(jì)列族。
1.3.4?④圖(Graph-Oriented)數(shù)據(jù)庫[Neo4J,infoGird]
適用范圍很小,主要用用網(wǎng)絡(luò)拓?fù)浞治?如脈脈的人員關(guān)系圖等
1.4?傳統(tǒng)RDBMS VS NOSQL
?RDBMS(關(guān)系型數(shù)據(jù)庫)Mysql
- 高度組織化結(jié)構(gòu)化數(shù)據(jù)
- 結(jié)構(gòu)化查詢語言(SQL)
- 數(shù)據(jù)和關(guān)系都存儲(chǔ)在單獨(dú)的表中。
- 數(shù)據(jù)操縱語言(DML),數(shù)據(jù)定義語言(DDL)
- 嚴(yán)格的一致性
- 基礎(chǔ)事務(wù)(ACID)剛性事務(wù)特性
?NoSQL(非關(guān)系型數(shù)據(jù)庫)
- 代表著不僅僅是SQL
- 沒有聲明性查詢語言?
- 沒有預(yù)定義的模式
- 鍵 - 值對(duì)存儲(chǔ),列存儲(chǔ),文檔存儲(chǔ),圖形數(shù)據(jù)庫
- 不能完整的支持事務(wù)(弱事務(wù))
- 靈活、快速、簡(jiǎn)單 MAP
- 最終一致性,而非ACID【原子,一致,隔離,持久】屬性
- 非結(jié)構(gòu)化和不可預(yù)知的數(shù)據(jù)(NoSql 數(shù)據(jù)比較松散)
- CAP定理【一致性,可用性,容錯(cuò)性】
- 高性能,高可用性和可伸縮性
?
總結(jié)NoSql
1.?NoSql就是為了性能而誕生的
2.?NoSql是Sql的閹割版本,是為了解決行業(yè)內(nèi)特定問題
3.?NoSql沒有特定的數(shù)據(jù)結(jié)構(gòu)定義,使用時(shí)不需要表
4.?NoSql對(duì)事物的支持很差
2.?【熟悉】常見的NoSQL及區(qū)別
2.1?常見的NoSQL數(shù)據(jù)庫
?

2.2?區(qū)別
1,Memcached
揮發(fā)性(臨時(shí)性)的鍵值存儲(chǔ)
一般作為關(guān)系型數(shù)據(jù)庫的緩存來使用
具有非常快的處理速度
由于存在數(shù)據(jù)丟失的可能,所以一般用來處理不需要持久保存的數(shù)據(jù)
用于需要使用expires時(shí)(需要定期清除數(shù)據(jù))
使用一致性散列(Consistent Hashing)算法來分散數(shù)據(jù)
?2,Tokyo Tyrant
持久性的鍵值存儲(chǔ)
用來處理需要持久保存,高速處理的數(shù)據(jù)
具有非??斓奶幚硭俣?/span>
用于不需要定期清除的數(shù)據(jù)
使用一致性散列(Consistent Hashing)算法來分散數(shù)據(jù)
3,Redis
兼具M(jìn)emcached和Tokyo Tyrant優(yōu)勢(shì)的鍵值存儲(chǔ)
擅長處理數(shù)組類型的數(shù)據(jù)
具有非??斓奶幚硭俣?/span>
可以高速處理時(shí)間序列的數(shù)據(jù),易于處理集合運(yùn)算
擁有很多可以進(jìn)行原子操作的方法
使用一致性散列(Consistent Hashing)算法來分散數(shù)據(jù)
4,MongoDB
面向無需定義表結(jié)構(gòu)的文檔數(shù)據(jù)
具有非常快的處理速度
通過BSON的形式可以保存和查詢?nèi)魏晤愋偷臄?shù)據(jù)
無法進(jìn)行JOIN處理,但是可以通過嵌入(embed)來實(shí)現(xiàn)同樣的功能
使用sharding(范圍分割)算法來分散數(shù)據(jù)
3.?【熟悉】Redis簡(jiǎn)介
3.1?Redis簡(jiǎn)介
Redis:Remote Dictionary Server(遠(yuǎn)程字典服務(wù)器)
Redis是當(dāng)前比較熱門的NOSQL系統(tǒng)之一,它是一個(gè)開源的使用ANSI c語言編寫的key-value存儲(chǔ)系統(tǒng)(區(qū)別于MySQL的二維表格的形式存儲(chǔ)。)。和Memcache類似,但很大程度補(bǔ)償了Memcache的不足。和Memcache一樣,Redis數(shù)據(jù)都是緩存在計(jì)算機(jī)內(nèi)存中,不同的是,Memcache只能將數(shù)據(jù)緩存到內(nèi)存中,無法自動(dòng)定期寫入硬盤,這就表示,一斷電或重啟,內(nèi)存清空,數(shù)據(jù)丟失。所以Memcache的應(yīng)用場(chǎng)景適用于緩存無需持久化的數(shù)據(jù)。而Redis不同的是它會(huì)周期性的把更新的數(shù)據(jù)寫入磁盤或者把修改操作寫入追加的記錄文件,實(shí)現(xiàn)數(shù)據(jù)的持久化
Cpu -- > 內(nèi)存(內(nèi)存頻率) ---->磁盤(機(jī)械硬盤(5400r/min),固態(tài)硬盤 0 1)
Mysql每次查詢會(huì)做磁盤IO (耗時(shí))
3.2?Redis的特點(diǎn)
1.?Redis讀取的速度是110000次/s,寫的速度是81000次/s?適用于現(xiàn)在Web2.0的時(shí)代
2.?原子性?。Redis的所有操作都是原子性的,同時(shí)Redis還支持對(duì)幾個(gè)操作合并后的原子性執(zhí)行。
3.?支持多種數(shù)據(jù)結(jié)構(gòu):string(字符串);list(列表);hash(哈希),set(集合);zset(有序集合)key(string) -value
4.?持久化,主從復(fù)制(集群)
5.?支持過期時(shí)間,支持事務(wù),消息訂閱。
6.?官方不支持window,但是有第三方版本。
3.3?Redis的應(yīng)用場(chǎng)景
3.3.1?數(shù)據(jù)緩存(提高訪問性能)?
將一些數(shù)據(jù)在短時(shí)間之內(nèi)不會(huì)發(fā)生變化,而且它們還要被頻繁訪問,為了提高用戶的請(qǐng)求速度和降低網(wǎng)站的負(fù)載,降低數(shù)據(jù)庫的讀寫次數(shù),就把這些數(shù)據(jù)放到緩存中。
3.3.2?會(huì)話緩存(共享session)
(session cache,保存web會(huì)話信息)
3.3.3?排行榜/計(jì)數(shù)器
(NGINX+lua+redis計(jì)數(shù)器進(jìn)行IP自動(dòng)封禁)
3.3.4?消息隊(duì)列(ActiveMQ/RabbitMQ/Kafka/RocketMQ)
(構(gòu)建實(shí)時(shí)消息系統(tǒng),聊天,群聊)
重點(diǎn)做緩存(數(shù)據(jù),用戶信息)
4.?【掌握】Redis的安裝及啟動(dòng)停止
4.1?windows下面的安裝
解壓
運(yùn)行服務(wù)端
運(yùn)行客戶端
解決閃退問題
?

4.2?下載Redis5
redis目前的最新版本是6.X此教程是以5.07為基礎(chǔ)來整理的,大家盡量保持一致
https://redis.io/download
?

4.3?打開VM虛擬機(jī)把文件copy到software里面
?

4.4?開始安裝
4.4.1?安裝gcc ?目地是編譯軟件
yum?install?gcc-c++?
4.4.2?解壓
?tar?-zxvf?redis-5.0.7.tar.gz
?

4.4.3?把解壓的文件copy到/usr/local/src里面
?cp?-r?/root/software/redis-5.0.7?/usr/local/src/redis
4.4.4?打開/usr/local/src/redis/deps進(jìn)行編譯依賴項(xiàng)
cd?/usr/local/src/redis/deps
進(jìn)入redis的deps目錄下
make hiredis lua jemalloc linenoise
4.4.5?打開/usr/local/src/redis進(jìn)行編譯
cd?/usr/local/src/redis
在redis的目錄下
make
?

4.4.6?在上面的Redis目錄安裝把它安裝到/usr/local/redis里面
mkdir ?-p /usr/local/redis
make install PREFIX=/usr/local/redis
?

看到上面的說明安裝成功了哦
4.4.7?驗(yàn)證安裝是否成功
cd /usr/local/redis/bin
ls
看到如下啟動(dòng)文件就可以了
?

4.4.8?把配置文件移動(dòng)到/usr/local/redis/conf目錄[目錄可以自定義] 可以為/usr/local/redis/conf
mkdir /usr/local/redis/conf
cp /usr/local/src/redis/redis.conf /usr/local/redis/conf
4.4.9?啟動(dòng)Redis
cd /usr/local/redis/bin
./redis-server /usr/local/redis/conf/redis.conf
?

4.4.10?默認(rèn)情況,Redis不是在后臺(tái)運(yùn)行,我們需要把redis放在后臺(tái)運(yùn)行
?vi /usr/local/redis/conf/redis.conf
?

4.4.11?再次啟動(dòng)查看進(jìn)程
?./redis-server /usr/local/redis/conf/redis.conf
#查看進(jìn)程
ps -ef|grep redis
?

可以看到在6379端口號(hào)已啟動(dòng)了redis
4.4.12?客戶端鏈接和退出
#連接
cd /usr/local/redis/bin
./redis-cli ?默認(rèn)是-h 127.0.0.1 -p 6379 ?
#退出
quit
ping
PONG
?

4.4.13?停止redis
?cd /usr/local/redis/bin
./redis-cli shutdown
或者
ps -ef|grep redis??????kill -9 進(jìn)程號(hào)
?

4.4.14?開機(jī)自啟Redis的配置
服務(wù)器開機(jī) 每次開機(jī) 都會(huì)執(zhí)行/etc/rc.local?這個(gè)文件
vim /etc/rc.local
加入?redis的絕對(duì)路徑
/usr/local/redis/bin/redis-server /usr/local/redis/conf/redis.conf
4.4.15?bin目錄的文件說明
redis-benchmark:redis性能測(cè)試工具
redis-check-aof:檢查aof日志的工具
redis-check-rdb:檢查rdb日志的工具
redis-cli:連接用的客戶端
redis-server:redis服務(wù)進(jìn)程
4.4.16?redis配置[后面細(xì)說]
daemonize:如需要在后臺(tái)運(yùn)行,把該項(xiàng)的值改為yes
pdifile:把pid文件放在/var/run/redis.pid,可以配置到其他地址
bind:指定redis只接收來自該IP的請(qǐng)求,如果不設(shè)置,那么將處理所有請(qǐng)求,在生產(chǎn)環(huán)節(jié)中最好設(shè)置該項(xiàng)
port:監(jiān)聽端口,默認(rèn)為6379
timeout:設(shè)置客戶端連接時(shí)的超時(shí)時(shí)間,單位為秒
loglevel:等級(jí)分為4級(jí),debug,revbose,notice和warning。生產(chǎn)環(huán)境下一般開啟notice
logfile:配置log文件地址,默認(rèn)使用標(biāo)準(zhǔn)輸出,即打印在命令行終端的端口上
database:設(shè)置數(shù)據(jù)庫的個(gè)數(shù),默認(rèn)使用的數(shù)據(jù)庫是0
save:設(shè)置redis進(jìn)行數(shù)據(jù)庫鏡像的頻率
rdbcompression:在進(jìn)行鏡像備份時(shí),是否進(jìn)行壓縮
dbfilename:鏡像備份文件的文件名
dir:數(shù)據(jù)庫鏡像備份的文件放置的路徑
slaveof:設(shè)置該數(shù)據(jù)庫為其他數(shù)據(jù)庫的從數(shù)據(jù)庫
masterauth:當(dāng)主數(shù)據(jù)庫連接需要密碼驗(yàn)證時(shí),在這里設(shè)定
requirepass:設(shè)置客戶端連接后進(jìn)行任何其他指定前需要使用的密碼
maxclients:限制同時(shí)連接的客戶端數(shù)量
maxmemory:設(shè)置redis能夠使用的最大內(nèi)存
appendonly:開啟appendonly模式后,redis會(huì)把每一次所接收到的寫操作都追加到appendonly.aof文件中,當(dāng)redis重新啟動(dòng)時(shí),會(huì)從該文件恢復(fù)出之前的狀態(tài)
appendfsync:設(shè)置appendonly.aof文件進(jìn)行同步的頻率
vm_enabled:是否開啟虛擬內(nèi)存支持
vm_swap_file:設(shè)置虛擬內(nèi)存的交換文件的路徑
vm_max_momery:設(shè)置開啟虛擬內(nèi)存后,redis將使用的最大物理內(nèi)存的大小,默認(rèn)為0
vm_page_size:設(shè)置虛擬內(nèi)存頁的大小
vm_pages:設(shè)置交換文件的總的page數(shù)量
vm_max_thrrads:設(shè)置vm IO同時(shí)使用的線程數(shù)量
5.?【掌握】Redis客戶端使用
5.1?工具說明
? ? 1,使用【可以看到層級(jí)關(guān)系】
?

? ? 2,使用
?

這個(gè)沒有層級(jí)關(guān)系
5.2?下載客戶端redis plus
鏈接:https://pan.baidu.com/s/1hPBErS--3zOZv6EXL2PEsA?
提取碼:048c?
5.3?安裝


5.4?連接
5.4.1?關(guān)閉linux防火墻
?
Centos6
查看防火墻狀態(tài):
[root@centos6 ~]# service iptables status
iptables:未運(yùn)行防火墻。
開啟防火墻:
[root@centos6 ~]# service iptables start
關(guān)閉防火墻:
[root@centos6 ~]# service iptables stop
centos7
查看防火墻狀態(tài):
firewall-cmd --state
關(guān)閉防火墻
systemctl stop firewalld.service
開啟防火墻
systemctl start firewalld.service
禁用防火墻
systemctl disable firewalld.service
5.4.2?注釋redis.conf里面的bind 127.0.0.1
?

5.4.3?修改redis.conf里面的密碼
?

5.4.4?驗(yàn)證密碼是否成功
?

5.4.5?連接
?

?
5.4.6?連接成功
?
?

6.?【掌握】啟動(dòng)后相關(guān)知識(shí)串講
6.1?單進(jìn)程單線程(重點(diǎn))
IO ----BIO ?readLine() NIO
采用?I/O 多路復(fù)用技術(shù)可以讓單個(gè)線程高效的處理多個(gè)連接請(qǐng)求(盡量減少網(wǎng)絡(luò)IO的時(shí)間消耗)?
why?
多線程處理可能涉及到鎖?(加鎖是比較慢)
多線程處理會(huì)涉及到線程切換而消耗CPU??jvm ?PC寄存器 一次cpu調(diào)度線程上下文切換(1500ns)
單進(jìn)程不存在線程安全問題
缺點(diǎn):
無法發(fā)揮多核CPU性能,不過可以通過在單機(jī)開多個(gè)Redis實(shí)例來完善
為什么用redis
1.?快
2.?為什么快(1.單線程不需要線程切換開銷,2.沒有鎖的競(jìng)爭(zhēng),3.IO多路復(fù)用)
?
6.2?默認(rèn)16個(gè)兄弟一起站臺(tái)
默認(rèn)16個(gè)數(shù)據(jù)庫,類似數(shù)組下表從零開始,初始默認(rèn)使用零號(hào)庫
6.3?切換數(shù)據(jù)庫命令
select index命令切換數(shù)據(jù)庫
6.4?常用基本命令
dbsize查看當(dāng)前數(shù)據(jù)庫的key的數(shù)量
flushdb:清空當(dāng)前庫
Flushall;通殺全部庫
6.5?其它說明
統(tǒng)一密碼管理,16個(gè)庫都是同樣密碼,要么都OK要么一個(gè)也連接不上
Redis索引都是從零開始0-15
6.6?為什么默認(rèn)端口是6379
8080
3306
80
先介紹下redis的作者Salvatore Sanfilippo(Antirez),意大利人,就是下圖這位。
?
Antirez現(xiàn)在已經(jīng)40多歲了,依然奮斗在代碼一線,為開源社區(qū)做貢獻(xiàn)。Antirez出生在非英語系國家,所以英語一直是他的短板。他曾經(jīng)寫過一篇博文,《英語傷痛 15 年》,以自己的實(shí)際經(jīng)歷鼓勵(lì)非英語系國家的程序員突破英語障礙。或說回來,在他的另一篇博文《Redis as an LRU cache》中,寫到了為什么選用6379端口:
用一張圖片來翻譯一下,6379 就是這個(gè)意思:
?
而Merz全名Alessia Merz,是意大利的一位廣告女郎,就是下面這位:
?
在Antirez看來,這個(gè)名字是愚蠢的代名詞,所以就選了這個(gè)6379
7.?【掌握】redis的數(shù)據(jù)類型(天天問)
7.1?概述
? ??? 使用Redis進(jìn)行應(yīng)用設(shè)計(jì)和開發(fā)的一個(gè)核心概念是數(shù)據(jù)類型。與關(guān)系數(shù)據(jù)庫不同,在Redis中不存在需要我們擔(dān)心的表,在使用Redis進(jìn)行應(yīng)用設(shè)計(jì)和開發(fā)時(shí),我們首先應(yīng)該考慮的是Redis原生支持的哪種數(shù)據(jù)類型適合我們的應(yīng)該場(chǎng)景,此外,我們無法像在關(guān)系數(shù)據(jù)庫中那樣,使用sql來操作Redis中的數(shù)據(jù),相反,我們需要直接使用API發(fā)送對(duì)應(yīng)的命令,來操作想要操作的數(shù)據(jù)
7.2?字符串類型Map<String,String>
? ? 字符串類型是編程語言和應(yīng)用程序中最常見和最有用的數(shù)據(jù)類型,也是Redis的基本數(shù)據(jù)類型之一,事實(shí)上,Redis中所有鍵都必須是字符串。
7.3?list數(shù)據(jù)類型Map<String,List<String>>
? ??列表是應(yīng)用我只是應(yīng)該程序開發(fā)中非常有用的數(shù)據(jù)類型之一,列表能存在一組對(duì)象,因此它也可以被用于棧或者隊(duì)列,在Redis中,與鍵相關(guān)的聯(lián)的值可以是字符串組成的列表,Redis中的列表更像是數(shù)據(jù)結(jié)構(gòu)中的雙向鏈表。
7.4?hash數(shù)據(jù)類型Map<String,Map<String,String>>
? ? 哈希表示字段和值之間的映射關(guān)系,與JAVA中的Map類似,Redis數(shù)據(jù)集本身就可以看做一個(gè)哈希,其中字符串類型的鍵關(guān)聯(lián)到如字符串和列表之類的數(shù)據(jù)對(duì)象,而Reidis的數(shù)據(jù)對(duì)象也可以再次使用哈希,其字段和值必須 是字符串。
7.5?set數(shù)據(jù)類型Map<String,Set<String,String>>
? ??集合類型是由唯一,無序?qū)ο蠼M成的集合(collection).它經(jīng)常用于測(cè)試某個(gè)成員是集合中,重復(fù)項(xiàng)刪除和集合運(yùn)算(求并,交,差集),Redis的值對(duì)象可以是字符串集合。
7.6?zset(sortset)數(shù)據(jù)類型
? ? 有序集合是一個(gè)類似于set但是更復(fù)雜的數(shù)據(jù)類型,單詞sorted意為著這種集合中的每個(gè)元素都有一個(gè)可用于排序的權(quán)重,并且我們可以按順序從集合中得到元素在某些需要一個(gè)保持?jǐn)?shù)據(jù)有序的場(chǎng)景中,使用這種原生的序的特性是很方便的。
8.?【掌握】Redis的相關(guān)命令詳解
關(guān)于命令的學(xué)習(xí)查詢看這個(gè)網(wǎng)站http://www.redis.net.cn/order/?
或者:http://redisdoc.com/
http://doc.redisfans.com/index.html
8.1?常用命令
keys * 獲取當(dāng)前庫所有的key
select index?選擇第index個(gè)庫
flushdb 清空當(dāng)前庫
del key1 刪除key
expire key 10 ?設(shè)置key的過期時(shí)間單位是秒 放在session 設(shè)置過期時(shí)間
怎么實(shí)現(xiàn)一個(gè)任務(wù)在將來的某個(gè)時(shí)間點(diǎn)發(fā)生
ttl key 查看還有多少秒過期,-1表示永不過期,-2表示已過期
move k1 1 將當(dāng)前的數(shù)據(jù)庫key移動(dòng)到某個(gè)數(shù)據(jù)庫,目標(biāo)庫有,則不能移動(dòng)
randomkey ?從當(dāng)前數(shù)據(jù)庫中隨機(jī)返回
type key 類型
exists key 判斷是否存在key
pexpire key 1000 設(shè)置key的過期時(shí)間單位是毫秒
persist key 刪除過期時(shí)間
8.2?string類型相關(guān)命令
語法set key value??存放key-vulue
????get key??獲取key的值
????getset name new_cxx 設(shè)置值,返回舊值
????mset key1 v1 key2 v2 批量設(shè)置
????mget key1 key2 批量獲取
????setnx key value 不存在就插入(set if not exists)?分布式鎖
incr age 遞增???
incrby age 10 遞增
????decr age 遞減
????decrby age 10 遞減
????strlen 長度
????getrange name 0 -1 字符串分段 ??0 -1是全部 ??0 -2 ?==n-1
????setrange key index value 從index開始替換value
????incrbyfloat 增減浮點(diǎn)數(shù)
????append 追加
????object encoding key ?得到key 的類型 ?string里面有三種編碼
????????????int ?用于能夠作用64位有符號(hào)整數(shù)表示的字符串
????????????embstr 用于長度小于或等于44字節(jié) ?Redis3.x中是39字節(jié),這種類型的編碼在內(nèi)存使用時(shí)性能更好
????????????raw ?用于長度大于44字節(jié)的
8.3?list【集合數(shù)組】
語法lpush key ?values????l=left ???r =rigth ????
lpush mylist a b c 左插入
????rpush mylist x y z 右插入
????lrange mylist 0 -1 取出數(shù)據(jù)集合 ?0 -1是取出所有 ??0 ??1取第一個(gè)和第二個(gè)
????lpop mylist 彈出集合最后一個(gè)元素 ?彈出之后就沒有了哦
????rpop mylist 彈出第一個(gè)元素 ?彈出之后就沒有了哦
????lrem mylist count value 刪除
????????|-COUNT 的值可以是以下幾種:
????????????|--count > 0 : 從表頭開始向表尾搜索,移除與 VALUE 相等的元素,數(shù)量為 COUNT 。
????????????|--count < 0 : 從表尾開始向表頭搜索,移除與 VALUE 相等的元素,數(shù)量為 COUNT 的絕對(duì)值。
????????????|--count = 0 : 移除表中所有與 VALUE 相等的值。
????lindex mylist 2 指定索引的值
????llen mylist 長度 ?
????lset mylist 2 n 索引設(shè)值
????ltrim mylist 0 4 ??
????????????|--對(duì)一個(gè)列表進(jìn)行修剪(trim),就是說,讓列表只保留指定區(qū)間內(nèi)的元素,不在指定區(qū)間之內(nèi)的元素都將被刪除。
下標(biāo) 0 表示列表的第一個(gè)元素,以 1 表示列表的第二個(gè)元素,以此類推。
你也可以使用負(fù)數(shù)下標(biāo),以 -1 表示列表的最后一個(gè)元素, -2 表示列表的倒數(shù)第二個(gè)元素,以此類推。
????linsert mylist before a 插入
????linsert mylist after a 插入
????????????|--命令用于在列表的元素前或者后插入元素。 當(dāng)指定元素不存在于列表中時(shí),不執(zhí)行任何操作。
當(dāng)列表不存在時(shí),被視為空列表,不執(zhí)行任何操作。 如果 key 不是列表類型,返回一個(gè)錯(cuò)誤。
????rpoplpush list list2 轉(zhuǎn)移列表的數(shù)據(jù)
????????????|--命令用于移除列表的最后一個(gè)元素,并將該元素添加到另一個(gè)列表并返回。
8.4?Hash???Map<String,Map<String,Value>>
語法:hset ??key ??key ?value
?
????hset myhash name cxx
?????????|--命令用于為哈希表中的字段賦值 。
????????????|--如果哈希表不存在,一個(gè)新的哈希表被創(chuàng)建并進(jìn)行 HSET 操作。
????????????|--如果字段已經(jīng)存在于哈希表中,舊值將被覆蓋。
????hget myhash name
????hmset myhash name cxx age 25 note "i am notes"??批量插入hmset key k1 v1 k2 v2
????hmget myhash name age note ???批量獲取 hmget key k1 k2
????hgetall myhash 獲取所有的
????hexists myhash name 是否存在
hdel myhash name 刪除
????hsetnx myhash score 100 設(shè)置不存在的 ?如果存在,不做處理
????hincrby myhash id 1 遞增
????hkeys myhash 只取key
????hvals myhash 只取value
????hlen myhash 長度
8.5?set(無序且唯一)
????sadd key value [value2 value3]??添加一個(gè)或者多個(gè)成員
????smembers key 返回集合中的所有成員
????srem key value [value2 value3]?移除集合中一個(gè)或多個(gè)成員
????scard key?獲取當(dāng)前key下的元素個(gè)數(shù)
????spop 從集合中隨機(jī)彈出一個(gè)元素?就從集合中刪掉了
????sismember myset set1 判斷元素是否在集合中?
????sdiff key1 key2 …… | sinter | sunion 操作:集合間運(yùn)算:差集 | 交集 | 并集
????srandmember key count 隨機(jī)獲取集合中的元素
8.6?zset(排序和隱藏分?jǐn)?shù)--排序碼)
zadd key score value ?添加元素key 并且設(shè)置分?jǐn)?shù)
????zrange key?0 -1 withscores 返回集合中所有的元素 按照分?jǐn)?shù)從小到大排序
zrevrange key?0 -1 withscores 返回集合中所有的元素 按照分?jǐn)?shù)從大到小排序
zrangebyscore key 10 25 withscores 取指定分?jǐn)?shù)范圍的值
????zcard key 元素?cái)?shù)量
zrem key value1 value2?刪除一個(gè)或多個(gè)元素
????zincrby zset 1 one 增長分?jǐn)?shù)
????zscore zset two 獲取分?jǐn)?shù)
????zrangebyscore zset 10 25 withscores 指定范圍的值
????zrangebyscore zset 10 25 withscores limit 1 2 分頁
????zrevrangebyscore zset 10 25 withscores 指定范圍的值
????zcount zset 獲得指定分?jǐn)?shù)范圍內(nèi)的元素個(gè)數(shù)
9.?【重點(diǎn)】解析配置文件redis.conf
9.1?配置文件在哪
?

9.2?Units單位
?

1 配置大小單位,開頭定義了一些基本的度量單位,只支持bytes,不支持bit
2 對(duì)大小寫不敏感
9.3?INCLUDES包含
?

9.4?NETWORK通用【常用】
?

默認(rèn)情況下,如果沒有指定“bind”配置指令,則Redis偵聽用于連接服務(wù)器上所有可用的網(wǎng)絡(luò)接口。
可以只監(jiān)聽一個(gè)或多個(gè)選擇的接口 "bind"配置指令,后面跟著一個(gè)或多個(gè)IP地址。
1,bind ??
默認(rèn)情況下,redis 在 server 上所有有效的網(wǎng)絡(luò)接口上監(jiān)聽客戶端連接。如果只想讓它在一個(gè)或多個(gè)網(wǎng)絡(luò)接口上監(jiān)聽,那你就綁定一個(gè)IP或者多個(gè)IP。多個(gè)ip空格分隔即可。
?
2,prot運(yùn)行端口
?
3,Tcp-backlog
設(shè)置tcp的backlog,backlog其實(shí)是一個(gè)連接隊(duì)列,backlog隊(duì)列總和=未完成三次握手隊(duì)列 + 已經(jīng)完成三次握手隊(duì)列。
在高并發(fā)環(huán)境下你需要一個(gè)高backlog值來避免慢客戶端連接問題。注意Linux內(nèi)核會(huì)將這個(gè)值減小到/proc/sys/net/core/somaxconn的值,所以需要確認(rèn)增大somaxconn和tcp_max_syn_backlog兩個(gè)值
來達(dá)到想要的效果
4,timeout?
?
當(dāng)客戶端閑置多少秒后關(guān)閉連接,如果設(shè)置為0表示關(guān)閉該功能。
5,tcp-keepalive 300
單位是秒,表示將周期性的使用SO_KEEPALIVE檢測(cè)客戶端是否還處于健康狀態(tài),避免服務(wù)器一直阻塞,官方給出的建議值是300S
9.5?GRNERAL通用【了解】
?

daemonize no ??是否以守護(hù)模式啟動(dòng),默認(rèn)為no,配置為yes時(shí)以守護(hù)模式啟動(dòng),這時(shí)redis instance會(huì)將進(jìn)程號(hào)pid寫入默認(rèn)文件/var/run/redis.pid。
supervised no?可以通過upstart和systemd管理Redis守護(hù)進(jìn)程,這個(gè)參數(shù)是和具體的操作系統(tǒng)相關(guān)的。
pidfile /var/run/redis_6379.pid?配置pid文件路徑。當(dāng)redis以守護(hù)模式啟動(dòng)時(shí),如果沒有配置pidfile,pidfile默認(rèn)值是/var/run/redis.pid 。
loglevel notice??日志級(jí)別??蛇x項(xiàng)有:debug(記錄大量日志信息,適用于開發(fā)、測(cè)試階段); verbose(較多日志信息); notice(適量日志信息,使用于生產(chǎn)環(huán)境);warning(僅有部分重要、關(guān)鍵信息才會(huì)被記錄)。
logfile "" ??日志文件的位置,當(dāng)指定為空字符串時(shí),為標(biāo)準(zhǔn)輸出,如果redis已守護(hù)進(jìn)程模式運(yùn)行,那么日志將會(huì)輸出到 /dev/null(linux的無底洞文件)?。
syslog-enabled no????是否把日志記錄到系統(tǒng)日志。
syslog-ident???設(shè)置系統(tǒng)日志的id ? ? 如 ?syslog-ident redis
databases 16?? 設(shè)置數(shù)據(jù)庫的數(shù)目。默認(rèn)的數(shù)據(jù)庫是DB 0 ,可以在每個(gè)連接上使用select <dbid> 命令選擇一個(gè)不同的數(shù)據(jù)庫,dbid是一個(gè)介于0到databases - 1 之間的數(shù)值。
always-show-logo yes??是否一直顯示日志
?
9.6?SNAPSHOTTING快照【重點(diǎn)】
?

save??保存數(shù)據(jù)到磁盤。格式是:save <seconds> <changes> ,含義是在 seconds 秒之內(nèi)至少有 changes個(gè)keys 發(fā)生改變則保存一次。
如 ? ? ? ??save 900 1 ? ? ?900秒有一條數(shù)據(jù)改變就保存
? ? ? ? ? ? save 300 10 ? ???300秒有10條數(shù)據(jù)改變就保存
? ? ? ? ? ? save 60 10000 ? 600秒有10000條數(shù)據(jù)改變就保存
stop-writes-on-bgsave-error?yes ?默認(rèn)情況下,如果 redis 最后一次的后臺(tái)保存失敗,redis 將停止接受寫操作,這樣以一種強(qiáng)硬的方式讓用戶知道數(shù)據(jù)不能正確的持久化到磁盤, 否則就會(huì)沒人注意到災(zāi)難的發(fā)生。 如果后臺(tái)保存進(jìn)程重新啟動(dòng)工作了,redis 也將自動(dòng)的允許寫操作。然而你要是安裝了靠譜的監(jiān)控,你可能不希望 redis 這樣做,那你就改成 no 好了。
rdbcompression?yes ?是否在dump .rdb數(shù)據(jù)庫的時(shí)候壓縮字符串,默認(rèn)設(shè)置為yes。如果你想節(jié)約一些cpu資源的話,可以把它設(shè)置為no,這樣的話數(shù)據(jù)集就可能會(huì)比較大。
rdbchecksum?yes ?是否CRC64校驗(yàn)rdb文件,會(huì)有一定的性能損失(大概10%)
dbfilename?dump.rdb ? rdb文件的名字。
dir ./?數(shù)據(jù)文件保存路徑指redis.conf配置文件所在的路徑
9.7?SECURITY安全
?

主要用于訪問密碼和查看,設(shè)置和取消
?

9.8?LIMITS限制【淘汰策略】【重點(diǎn)】
maxclients?10000 ??
設(shè)置redis同時(shí)可以與多少個(gè)客戶端進(jìn)行連接。默認(rèn)情況下為10000個(gè)客戶端。當(dāng)你
無法設(shè)置進(jìn)程文件句柄限制時(shí),redis會(huì)設(shè)置為當(dāng)前的文件句柄限制值減去32,因?yàn)閞edis會(huì)為自身內(nèi)部處理邏輯留一些句柄出來。如果達(dá)到了此限制,redis則會(huì)拒絕新的連接請(qǐng)求,并且向這些連接請(qǐng)求方發(fā)出“max number of clients reached”以作回應(yīng)。
maxmemory
設(shè)置redis可以使用的內(nèi)存量。一旦到達(dá)內(nèi)存使用上限,redis將會(huì)試圖移除內(nèi)部數(shù)據(jù),移除規(guī)則可以通過maxmemory-policy來指定。如果redis無法根據(jù)移除規(guī)則來移除內(nèi)存中的數(shù)據(jù),或者設(shè)置了“不允許移除”,那么redis則會(huì)針對(duì)那些需要申請(qǐng)內(nèi)存的指令返回錯(cuò)誤信息,比如SET、LPUSH等。
?但是對(duì)于無內(nèi)存申請(qǐng)的指令,仍然會(huì)正常響應(yīng),比如GET等。如果你的redis是主redis(說明你的redis有從redis),那么在設(shè)置內(nèi)存使用上限時(shí),需要在系統(tǒng)中留出一些內(nèi)存空間給同步隊(duì)列緩存,只有在你設(shè)置的是“不移除”的情況下,才不用考慮這個(gè)因素
maxmemory-policy
??noeviction:當(dāng)內(nèi)存使用超過配置的時(shí)候會(huì)返回錯(cuò)誤,不會(huì)驅(qū)逐任何鍵
??allkeys-lru:加入鍵的時(shí)候,如果過限,首先通過LRU算法驅(qū)逐最近最久沒有使用的鍵
??volatile-lru:加入鍵的時(shí)候如果過限,首先從設(shè)置了過期時(shí)間的鍵集合中驅(qū)逐最久沒有使用的鍵
??allkeys-random:加入鍵的時(shí)候如果過限,從所有key隨機(jī)刪除
??volatile-random:加入鍵的時(shí)候如果過限,從過期鍵的集合中隨機(jī)驅(qū)逐
??volatile-ttl:從配置了過期時(shí)間的鍵中驅(qū)逐馬上就要過期的鍵
??volatile-lfu:從所有配置了過期時(shí)間的鍵中驅(qū)逐使用頻率最少的鍵
??allkeys-lfu:從所有鍵中驅(qū)逐使用頻率最少的鍵
?
LRU?: 最近最久沒有使用的算法(對(duì)最近的表現(xiàn)做總結(jié),考慮不完善,但是很容易實(shí)現(xiàn))
如果一個(gè)數(shù)據(jù)最近一段時(shí)間都沒有被訪問到,那么認(rèn)為這個(gè)數(shù)據(jù)在將來訪問的可能性也比較小,因此,當(dāng)空間滿時(shí),最久沒有訪問的數(shù)據(jù)最先被淘汰
?
LFU?: 使用頻率最少的算法(對(duì)歷史數(shù)據(jù)做總結(jié),考慮更全面一些,但是會(huì)耗費(fèi)總結(jié)歷史的時(shí)間)
如果一個(gè)數(shù)據(jù)很少被訪問到,那么認(rèn)為這個(gè)數(shù)據(jù)在將來訪問的可能性也比較小,因此,當(dāng)空間滿時(shí),最小頻率訪問的數(shù)據(jù)最先被淘汰
?
maxmemory-samples
設(shè)置樣本數(shù)量,LRU算法和最小TTL算法都并非是精確的算法,而是估算值,所以你可以設(shè)置樣本的大小,
redis默認(rèn)會(huì)檢查這么多個(gè)key并選擇其中LRU的那個(gè)
9.9?REPLICATION復(fù)制
講主從復(fù)制再說
9.10?APPEND ONLY MODE 追加[持久化再說]【重點(diǎn)】
9.11?常見配置redis.conf總結(jié)
參數(shù)說明
redis.conf 配置項(xiàng)說明如下:
1. Redis默認(rèn)不是以守護(hù)進(jìn)程的方式運(yùn)行,可以通過該配置項(xiàng)修改,使用yes啟用守護(hù)進(jìn)程
? daemonize no
2. 當(dāng)Redis以守護(hù)進(jìn)程方式運(yùn)行時(shí),Redis默認(rèn)會(huì)把pid寫入/var/run/redis.pid文件,可以通過pidfile指定
??pidfile /var/run/redis.pid
3. 指定Redis監(jiān)聽端口,默認(rèn)端口為6379,作者在自己的一篇博文中解釋了為什么選用6379作為默認(rèn)端口,因?yàn)?379在手機(jī)按鍵上MERZ對(duì)應(yīng)的號(hào)碼,而MERZ取自意大利歌女Alessia Merz的名字
? port 6379
4. 綁定的主機(jī)地址
? bind 127.0.0.1 ??0.0.0.0
5.當(dāng) 客戶端閑置多長時(shí)間后關(guān)閉連接,如果指定為0,表示關(guān)閉該功能
? timeout 300
6. 指定日志記錄級(jí)別,Redis總共支持四個(gè)級(jí)別:debug、verbose、notice、warning,默認(rèn)為verbose
? loglevel verbose
7. 日志記錄方式,默認(rèn)為標(biāo)準(zhǔn)輸出,如果配置Redis為守護(hù)進(jìn)程方式運(yùn)行,而這里又配置為日志記錄方式為標(biāo)準(zhǔn)輸出,則日志將會(huì)發(fā)送給/dev/null
? logfile stdout
8. 設(shè)置數(shù)據(jù)庫的數(shù)量,默認(rèn)數(shù)據(jù)庫為0,可以使用SELECT <dbid>命令在連接上指定數(shù)據(jù)庫id
? databases 16
9. 指定在多長時(shí)間內(nèi),有多少次更新操作,就將數(shù)據(jù)同步到數(shù)據(jù)文件,可以多個(gè)條件配合
? save <seconds> <changes>
? Redis默認(rèn)配置文件中提供了三個(gè)條件:
? save 900 1
? save 300 10
? save 60 10000
? 分別表示900秒(15分鐘)內(nèi)有1個(gè)更改,300秒(5分鐘)內(nèi)有10個(gè)更改以及60秒內(nèi)有10000個(gè)更改。
?
10. 指定存儲(chǔ)至本地?cái)?shù)據(jù)庫時(shí)是否壓縮數(shù)據(jù),默認(rèn)為yes,Redis采用LZF壓縮,如果為了節(jié)省CPU時(shí)間,可以關(guān)閉該選項(xiàng),但會(huì)導(dǎo)致數(shù)據(jù)庫文件變的巨大
? rdbcompression yes
11. 指定本地?cái)?shù)據(jù)庫文件名,默認(rèn)值為dump.rdb
? dbfilename dump.rdb
12. 指定本地?cái)?shù)據(jù)庫存放目錄
? dir ./ ???/redis的安裝目錄/bin
13. 設(shè)置當(dāng)本機(jī)為slav服務(wù)時(shí),設(shè)置master服務(wù)的IP地址及端口,在Redis啟動(dòng)時(shí),它會(huì)自動(dòng)從master進(jìn)行數(shù)據(jù)同步
? slaveof <masterip> <masterport>
14. 當(dāng)master服務(wù)設(shè)置了密碼保護(hù)時(shí),slav服務(wù)連接master的密碼
? masterauth <master-password>
15. 設(shè)置Redis連接密碼,如果配置了連接密碼,客戶端在連接Redis時(shí)需要通過AUTH <password>命令提供密碼,默認(rèn)關(guān)閉
? requirepass foobared
16. 設(shè)置同一時(shí)間最大客戶端連接數(shù),默認(rèn)無限制,Redis可以同時(shí)打開的客戶端連接數(shù)為Redis進(jìn)程可以打開的最大文件描述符數(shù),如果設(shè)置 maxclients 0,表示不作限制。當(dāng)客戶端連接數(shù)到達(dá)限制時(shí),Redis會(huì)關(guān)閉新的連接并向客戶端返回max number of clients reached錯(cuò)誤信息
? maxclients 128
17. 指定Redis最大內(nèi)存限制,Redis在啟動(dòng)時(shí)會(huì)把數(shù)據(jù)加載到內(nèi)存中,達(dá)到最大內(nèi)存后,Redis會(huì)先嘗試清除已到期或即將到期的Key,當(dāng)此方法處理 后,仍然到達(dá)最大內(nèi)存設(shè)置,將無法再進(jìn)行寫入操作,但仍然可以進(jìn)行讀取操作。Redis新的vm機(jī)制,會(huì)把Key存放內(nèi)存,Value會(huì)存放在swap區(qū)
? maxmemory <bytes>
18. 指定是否在每次更新操作后進(jìn)行日志記錄,Redis在默認(rèn)情況下是異步的把數(shù)據(jù)寫入磁盤,如果不開啟,可能會(huì)在斷電時(shí)導(dǎo)致一段時(shí)間內(nèi)的數(shù)據(jù)丟失。因?yàn)?redis本身同步數(shù)據(jù)文件是按上面save條件來同步的,所以有的數(shù)據(jù)會(huì)在一段時(shí)間內(nèi)只存在于內(nèi)存中。默認(rèn)為no
? appendonly no
19. 指定更新日志文件名,默認(rèn)為appendonly.aof
? ?appendfilename appendonly.aof
20. 指定更新日志條件,共有3個(gè)可選值:?
? no:表示等操作系統(tǒng)進(jìn)行數(shù)據(jù)緩存同步到磁盤(快)?
? always:表示每次更新操作后手動(dòng)調(diào)用fsync()將數(shù)據(jù)寫到磁盤(慢,安全)?
? everysec:表示每秒同步一次(折衷,默認(rèn)值)
? appendfsync everysec
?
21. 指定是否啟用虛擬內(nèi)存機(jī)制,默認(rèn)值為no,簡(jiǎn)單的介紹一下,VM機(jī)制將數(shù)據(jù)分頁存放,由Redis將訪問量較少的頁即冷數(shù)據(jù)swap到磁盤上,訪問多的頁面由磁盤自動(dòng)換出到內(nèi)存中(在后面的文章我會(huì)仔細(xì)分析Redis的VM機(jī)制)
? ?vm-enabled no
22. 虛擬內(nèi)存文件路徑,默認(rèn)值為/tmp/redis.swap,不可多個(gè)Redis實(shí)例共享
? ?vm-swap-file /tmp/redis.swap
23. 將所有大于vm-max-memory的數(shù)據(jù)存入虛擬內(nèi)存,無論vm-max-memory設(shè)置多小,所有索引數(shù)據(jù)都是內(nèi)存存儲(chǔ)的(Redis的索引數(shù)據(jù) 就是keys),也就是說,當(dāng)vm-max-memory設(shè)置為0的時(shí)候,其實(shí)是所有value都存在于磁盤。默認(rèn)值為0
? ?vm-max-memory 0
24. Redis swap文件分成了很多的page,一個(gè)對(duì)象可以保存在多個(gè)page上面,但一個(gè)page上不能被多個(gè)對(duì)象共享,vm-page-size是要根據(jù)存儲(chǔ)的 數(shù)據(jù)大小來設(shè)定的,作者建議如果存儲(chǔ)很多小對(duì)象,page大小最好設(shè)置為32或者64bytes;如果存儲(chǔ)很大大對(duì)象,則可以使用更大的page,如果不 確定,就使用默認(rèn)值
? ?vm-page-size 32
25. 設(shè)置swap文件中的page數(shù)量,由于頁表(一種表示頁面空閑或使用的bitmap)是在放在內(nèi)存中的,,在磁盤上每8個(gè)pages將消耗1byte的內(nèi)存。
? ?vm-pages 134217728
26. 設(shè)置訪問swap文件的線程數(shù),最好不要超過機(jī)器的核數(shù),如果設(shè)置為0,那么所有對(duì)swap文件的操作都是串行的,可能會(huì)造成比較長時(shí)間的延遲。默認(rèn)值為4
? ?vm-max-threads 4
27. 設(shè)置在向客戶端應(yīng)答時(shí),是否把較小的包合并為一個(gè)包發(fā)送,默認(rèn)為開啟
? glueoutputbuf yes
28. 指定在超過一定的數(shù)量或者最大的元素超過某一臨界值時(shí),采用一種特殊的哈希算法
? hash-max-zipmap-entries 64
? hash-max-zipmap-value 512
29. 指定是否激活重置哈希,默認(rèn)為開啟(后面在介紹Redis的哈希算法時(shí)具體介紹)
? activerehashing yes
30. 指定包含其它的配置文件,可以在同一主機(jī)上多個(gè)Redis實(shí)例之間使用同一份配置文件,而同時(shí)各個(gè)實(shí)例又擁有自己的特定配置文件
? include /path/to/local.conf
10.?【掌握】Redis的刪除策略(重點(diǎn))
LRU --根據(jù)使用時(shí)間
LFU --根據(jù)使用頻率
我們給一個(gè)key設(shè)置了一個(gè)過期時(shí)間(expire key time),在未來的某個(gè)時(shí)間獲取這個(gè)key的時(shí)候,發(fā)現(xiàn)key已經(jīng)被刪除了
這就是說一個(gè)操作將在未來的時(shí)間點(diǎn)發(fā)生
10.1?惰性刪除(取數(shù)據(jù)的時(shí)候刪除)
?
10.2?定時(shí)刪除(定時(shí)任務(wù))
?
10.3?定期刪除(鬧鐘定期)
10.4?最終方案(惰性+定期)
?
11.?【掌握】Redis的持久化
11.1?概述
https://redis.io/topics/persistence
?

11.2?RDB【Redis DataBase】
11.2.1?什么是RDB
?

save 900 1
save 300 10
save 60 ? 10000
在指定的時(shí)間間隔內(nèi)將內(nèi)存中的數(shù)據(jù)集快照寫入磁盤, 也就是行話講的Snapshot快照,它恢復(fù)時(shí)是將快照文件直接讀到內(nèi)存里
Redis會(huì)單獨(dú)創(chuàng)建(fork)一個(gè)子進(jìn)程來進(jìn)行持久化,會(huì)先將數(shù)據(jù)寫入到 一個(gè)臨時(shí)文件中,待持久化過程都結(jié)束了,再用這個(gè)臨時(shí)文件替換上次持久化好的文件。 整個(gè)過程中,主進(jìn)程是不進(jìn)行任何IO操作的,這就確保了極高的性能 如果需要進(jìn)行大規(guī)模數(shù)據(jù)的恢復(fù),且對(duì)于數(shù)據(jù)恢復(fù)的完整性不是非常敏感,那RDB方 式要比AOF方式更加的高效。RDB的缺點(diǎn)是最后一次持久化后的數(shù)據(jù)可能丟失。
優(yōu)點(diǎn):RDB 數(shù)據(jù)很穩(wěn)定 文件比較小
缺點(diǎn):最后一次持久化后的數(shù)據(jù)可能丟失
11.2.2?什么是FORK
Fork的作用是復(fù)制一個(gè)與當(dāng)前進(jìn)程一樣的進(jìn)程。新進(jìn)程的所有數(shù)據(jù)(變量、環(huán)境變量、程序計(jì)數(shù)器等) 數(shù)值都和原進(jìn)程一致,但是是一個(gè)全新的進(jìn)程,并作為原進(jìn)程的子進(jìn)程
11.2.3?保存位置及配置位置
Rdb 保存的是dump.rdb文件
?

11.2.4?如何觸發(fā)RDB快照


執(zhí)行flushall命令,也會(huì)產(chǎn)生dump.rdb文件,但里面是空的,無意義
注意不要在生產(chǎn)環(huán)境去手動(dòng)save拍照
11.2.5?如何恢復(fù)數(shù)據(jù)
將備份文件 (dump.rdb) 移動(dòng)到 redis 安裝目錄并啟動(dòng)服務(wù)即可
CONFIG GET dir獲取目錄
?

11.2.6?優(yōu)點(diǎn)
1.?備份的文件小
2.?適合大規(guī)模的數(shù)據(jù)恢復(fù)
3.?恢復(fù)速度快
4.?提高redis的性能
11.2.7?缺點(diǎn)
1.?數(shù)據(jù)不完整,可能會(huì)丟失最后一次save的數(shù)據(jù)
2.?在持久化時(shí)需要fork子進(jìn)程,需要考慮內(nèi)存消耗問題
11.2.8?RDB的關(guān)閉
save “”
11.3?AOF
11.3.1?概述
?

11.3.2?原理
set ?k1 v1
set ?k2 v2
del k2
以日志的形式來記錄每個(gè)寫[添加 修改 刪除]操作,將Redis執(zhí)行過的所有寫指令記錄下來(讀操作不記錄),只許追加文件但不可以改寫文件,redis啟動(dòng)之初會(huì)讀取該文件重新構(gòu)建數(shù)據(jù),換言之,redis重啟的話就根據(jù)日志文件的內(nèi)容將寫指令從前到后執(zhí)行一次以完成數(shù)據(jù)的恢復(fù)工作
11.3.3?保存位置及位置配置
Aof保存的是appendonly.aof文件
?

11.3.4?AOF啟動(dòng)/修復(fù)/恢復(fù)
正?;謴?fù)
? 啟動(dòng):設(shè)置Yes ?修改默認(rèn)的appendonly no,改為yes
? 將有數(shù)據(jù)的aof文件復(fù)制一份保存到對(duì)應(yīng)目錄(config get dir)
? 恢復(fù):重啟redis然后重新加載
異?;謴?fù)
? 啟動(dòng):設(shè)置Yes?? 修改默認(rèn)的appendonly no,改為yes
? 備份被寫壞的AOF文件
??修復(fù):??redis-check-aof --fix?appendonly.aof ?(修復(fù)文件)
? 恢復(fù):重啟redis然后重新加載
11.3.5?AOF持久化模式
? 每修改同步:appendfsync always 同步持久化 每次發(fā)生數(shù)據(jù)變更會(huì)被立即記錄到磁盤 性能較差但數(shù)據(jù)完整性比較好
? 每秒同步:appendfsync everysec 異步操作,每秒記錄 如果一秒內(nèi)宕機(jī),有數(shù)據(jù)丟失
? 不同步:appendfsync no 從不同步
11.3.6?優(yōu)勢(shì)
1.?AOF更持久,數(shù)據(jù)完整性更高
2.?AOF是追加文件的方式,可以進(jìn)行文件重寫
3.?AOF本身是日志文件,該日志文件包含所有的寫操作,我們可以直接打開觀看
11.3.7?劣勢(shì)
1.?AOF文件比較大
2.?AOF的持久化方案會(huì)導(dǎo)致性能不好
3.?AOF官方承認(rèn)可能有一些bug,可能數(shù)據(jù)和原來的不一致
11.4?說了那么多,我們選擇哪一個(gè)呢
11.4.1?官方建議
?

4.2,整理我們的理解及處理方式
RDB持久化方式能夠在指定的時(shí)間間隔能對(duì)你的數(shù)據(jù)進(jìn)行快照存儲(chǔ)
AOF持久化方式記錄每次對(duì)服務(wù)器寫的操作,當(dāng)服務(wù)器重啟的時(shí)候會(huì)重新執(zhí)行這些 命令來恢復(fù)原始的數(shù)據(jù),AOF命令以redis協(xié)議追加保存每次寫的操作到文件末尾. Redis還能對(duì)AOF文件進(jìn)行后臺(tái)重寫,使得AOF文件的體積不至于過大
1.?只做緩存(RDB)
2.?做用戶登錄保存session會(huì)話(RDB+AOF)
3.?極致追求性能(關(guān)閉RDB,關(guān)閉AOF)
4.?極致追求安全性(RDB+AOF (appendfsync always))
RDB(拍照)+AOF(日志)就是制定的redis持久化方案
只做緩存:如果你只希望你的數(shù)據(jù)在服務(wù)器運(yùn)行的時(shí)候存在,你也可以不使用任何持久化方式.
同時(shí)開啟兩種持久化方式
??在這種情況下,當(dāng)redis重啟的時(shí)候會(huì)優(yōu)先載入AOF文件來恢復(fù)原始的數(shù)據(jù), 因?yàn)樵谕ǔG闆r下AOF文件保存的數(shù)據(jù)集要比RDB文件保存的數(shù)據(jù)集要完整.
? RDB的數(shù)據(jù)不實(shí)時(shí),同時(shí)使用兩者時(shí)服務(wù)器重啟也只會(huì)找AOF文件。那要不要只使用AOF呢? 作者建議不要,因?yàn)镽DB更適合用于備份數(shù)據(jù)庫(AOF在不斷變化不好備份), 快速重啟,而且不會(huì)有AOF可能潛在的bug,留著作為一個(gè)萬一的手段。
性能建議
因?yàn)镽DB文件只用作后備用途,建議只在Slave上持久化RDB文件,而且只要15分鐘備份一次就夠了,只保留save 900 1這條規(guī)則。
如果Enalbe AOF,好處是在最惡劣情況下也只會(huì)丟失不超過兩秒數(shù)據(jù),啟動(dòng)腳本較簡(jiǎn)單只load自己的AOF文件就可以了。代價(jià)一是帶來了持續(xù)的IO,二是AOF rewrite的最后將rewrite過程中產(chǎn)生的新數(shù)據(jù)寫到新文件造成的阻塞幾乎是不可避免的。只要硬盤許可,應(yīng)該盡量減少AOF rewrite的頻率,AOF重寫的基礎(chǔ)大小默認(rèn)值64M太小了,可以設(shè)到5G以上。默認(rèn)超過原大小100%大小時(shí)重寫可以改到適當(dāng)?shù)臄?shù)值。
如果不Enable AOF ,僅靠Master-Slave Replication 實(shí)現(xiàn)高可用性也可以。能省掉一大筆IO也減少了rewrite時(shí)帶來的系統(tǒng)波動(dòng)。代價(jià)是如果Master/Slave同時(shí)倒掉,會(huì)丟失十幾分鐘的數(shù)據(jù),啟動(dòng)腳本也要比

由于字?jǐn)?shù)限制本文只分享了一半哦
完整版獲取可私信小動(dòng)~
更多干貨我們下期再說!
下期會(huì)分享
第十七章節(jié)
Vue
相關(guān)知識(shí)~
下期見!
