Redis 簡介
Redis 是完全開源的,遵守 BSD 協(xié)議,是一個(gè)高性能的 key-value 數(shù)據(jù)庫。
Redis 與其他 key - value 緩存產(chǎn)品有以下三個(gè)特點(diǎn):
- Redis支持?jǐn)?shù)據(jù)的持久化,可以將內(nèi)存中的數(shù)據(jù)保存在磁盤中,重啟的時(shí)候可以再次加載進(jìn)行使用。
- Redis不僅僅支持簡單的key-value類型的數(shù)據(jù),同時(shí)還提供list,set,zset,hash等數(shù)據(jù)結(jié)構(gòu)的存儲。
- Redis支持?jǐn)?shù)據(jù)的備份,即master-slave模式的數(shù)據(jù)備份。
一、為什么使用redis
1. 解決應(yīng)用服務(wù)器的cpu和內(nèi)存壓力
2. 減少io的讀操作,減輕io的壓力
3.關(guān)系型數(shù)據(jù)庫的擴(kuò)展性不強(qiáng),難以改變表結(jié)構(gòu)
二、優(yōu)點(diǎn)
1.性能極高 – Redis能讀的速度是110000次/s,寫的速度是81000次/s 。
2.豐富的數(shù)據(jù)類型 – Redis支持二進(jìn)制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 數(shù)據(jù)類型操作。
3.原子 – Redis的所有操作都是原子性的,意思就是要么成功執(zhí)行要么失敗完全不執(zhí)行。單個(gè)操作是原子性的。多個(gè)操作也支持事務(wù),即原子性,通過MULTI和EXEC指令包起來。
4.豐富的特性 – Redis還支持 publish/subscribe, 通知, key 過期等等特性。
三、適用場景
1. 數(shù)據(jù)高并發(fā)的讀寫
2. 海量數(shù)據(jù)的讀寫
3. 對擴(kuò)展性要求高的數(shù)據(jù)
四、不適場景
1. 需要事務(wù)支持(非關(guān)系型數(shù)據(jù)庫)
2. 基于sql結(jié)構(gòu)化查詢儲存,關(guān)系復(fù)雜
五、Redis結(jié)構(gòu)
Redis是一個(gè)開源的key—value型數(shù)據(jù)庫,支持string、list、set、zset和hash類型數(shù)據(jù)。對這些數(shù)據(jù)的操作都是原子性的,redus為了保證效率會定期持久化數(shù)據(jù)。
六、使用場景
1. 配合關(guān)系型數(shù)據(jù)庫做高速緩存 ,緩存高頻次訪問的數(shù)據(jù),降低數(shù)據(jù)庫io, 分布式架構(gòu),做session共享
2. 可以持久化特定數(shù)據(jù)。利用zset類型可以存儲排行榜 利用list的自然時(shí)間排序存儲最新n個(gè)數(shù)據(jù)
七、Linux下redis
1.redis目錄:usr/local/bin
2.linux下redis常用命令:
redis-benchmark:性能測試工具
redis-server:啟動redis服務(wù)器
redis-cli:啟動redis客戶端,操作入口
八、Redis基礎(chǔ)知識
1. 端口:6379
2. 默認(rèn)16個(gè)數(shù)據(jù)庫,下標(biāo)從0開始
3. 單線程:redis是單線程+io多路復(fù)用:檢查文件描述的就緒狀態(tài) ,Memchached:多線程+鎖
1. redis數(shù)據(jù)類型:String set list hash zset
九、Redis命令
1. key操作
String類型:String是二進(jìn)制安全的,可以包含任何數(shù)據(jù)源,最大512m
String批量處理:
1. List:鏈表
特點(diǎn):單鍵多值
Redis列表是簡單的字符串列表,從左或者從右插入
底層是雙向鏈表,對兩端的操作性能很高,通過下標(biāo)查詢性能很低
Set:類似list的無序集合,保證列表中不會有重復(fù)數(shù)據(jù),底層是一個(gè)value為null的hash表
hash:鍵值對集合,類似map
zset:與set集合非常相似,每個(gè)成員都關(guān)聯(lián)了score,可以用來排序
十、redis持久化
1. 兩種方式:rdb(redis database)和aof(append of file)
2. RDB:在指定時(shí)間間隔內(nèi),將內(nèi)存中的數(shù)據(jù)作為一個(gè)快照文件(snapshot)寫入到磁盤,讀取的時(shí)候也是直接讀取snapshot文件到內(nèi)存中
①持久化過程:redis單獨(dú)創(chuàng)建(fork)一個(gè)進(jìn)程來持久化,會先將數(shù)據(jù)寫入臨時(shí)文件中,待上次持久化結(jié)束后,會將該臨時(shí)文件替換上次持久化文件,比aof高效,但是最后一次數(shù)據(jù)可能會丟失
②Fork:在linux中,fork()會產(chǎn)生一個(gè)跟主進(jìn)程一樣的子進(jìn)程,出于效率考慮,主進(jìn)程和子進(jìn)程會公用一段物理內(nèi)存,當(dāng)發(fā)生改變的時(shí)候,才會把主進(jìn)程“”寫時(shí)復(fù)制”一份給子進(jìn)程
③Redis備份的文件:在redis.conf中設(shè)置,dbfilename默認(rèn)為:dump.rdb
④ Rdb保存策略:
1. 900s 1 file change
2. 300s 10file change
3. 60s 10000file change
⑤Rdb的備份:
1. config get dir 得到備份的文件夾
2. 復(fù)制備份文件
⑥Rdb恢復(fù):
1. 關(guān)閉redis
2. 將備份文件復(fù)制到工作目錄下
3. 啟動redis,自動加載
5.
1. AOF : 以日志形式記錄每個(gè)寫操作,啟動時(shí)通過日志恢復(fù)操作 , 開啟AOF:默認(rèn)不開啟,進(jìn)入redis.conf找到appendonly yes打開
2. 修復(fù)AOF:redis-check-aof –fix appendonly.aof
3. 同步頻率:每秒記錄一次,如果宕機(jī)該秒記可能失效
4. Rewrite:bgrewriteaof 因?yàn)槿罩臼亲芳臃绞?,文件會越來越大,?dāng)超過了設(shè)置的閾值時(shí),日志文件會壓縮,保留僅可以恢復(fù)的日志
RDB和AOF對比 1. 節(jié)省磁盤空間 2恢復(fù)速度快
ROD缺點(diǎn):
1. 數(shù)據(jù)太大時(shí),比較消耗性能
2. 一段時(shí)間保存一次快照,宕機(jī)時(shí)最后一次可能沒有保存
AOF優(yōu)點(diǎn):
1.備份機(jī)制更加穩(wěn)健
2.可讀的日志文件,通過aof恢復(fù)更加穩(wěn)健,可以處理失誤
AOF缺點(diǎn):
1.比RDB更占磁盤
2.備份速度較慢
3.iii每次都同步日志,有性能壓力
RDB和AOF哪個(gè)好
1. 官方推薦都啟用
2. 對數(shù)據(jù)不敏感,單獨(dú)用RDB
3. 不建議單獨(dú)使用AOF
4. 若作為純緩存使用,可以都不開啟
十一、Redis事務(wù):
輸入multi,輸入的命令都會依次進(jìn)入到隊(duì)列中,但不會執(zhí)行,直到輸入exec,redis會將之前命令隊(duì)列中的命令依次執(zhí)行,通過discard可以放棄組隊(duì)。
1. 主要作用:序列化操作,串聯(lián)多個(gè)命令防止別的命令插隊(duì)
2. 悲觀鎖:每次拿到數(shù)據(jù)的時(shí)候都會上鎖,或者等待別人處理完再去拿鎖,傳統(tǒng)的關(guān)系型數(shù)據(jù)庫里邊很多用到了這種鎖機(jī)制,比如行鎖、表鎖、讀鎖、寫鎖
3. 樂觀鎖:每次拿數(shù)據(jù)的時(shí)候總認(rèn)為別人不會修改數(shù)據(jù),所以不會上鎖。但是更新的時(shí)候回去判斷別人有沒有更改數(shù)據(jù),使用版本號機(jī)制。樂觀鎖適用于多讀的應(yīng)用類型,可以提高吞吐量。
4. Redis使用樂觀鎖:redis就是利用check-and-set機(jī)制實(shí)現(xiàn)事務(wù)
5.三大特性: 1.單獨(dú)的隔離操作:事務(wù)中的所有命令都會序列化,按順序執(zhí)行。不會被其他客戶端打斷
2.沒有隔離級別概念:隊(duì)列中的命令沒有提交之前不會被執(zhí)行,事務(wù)外不能查看事務(wù)內(nèi)的更新
3.不能保證原子性:跳過錯(cuò)誤,依舊執(zhí)行,沒有回滾
十二、Redis訂閱/發(fā)布
是進(jìn)程中的一種消息通信模式,發(fā)送者pub發(fā)送消息,訂閱者sub接收消息
十三、Redis主從復(fù)制
1. 是什么:主從復(fù)制就是主機(jī)數(shù)據(jù)更新后根據(jù)配置和策略,自動同步到備份機(jī)的master/slaver機(jī)制,master寫為主,slave讀為主
2.用處:
1. 讀寫分離,性能拓展。
2. 容災(zāi)快速恢復(fù)
3. 配置服務(wù)器(配從不配主):
1. 拷貝多個(gè)redis.conf文件
2. 開啟daemonize yes
3. Pid文件名字
4. 指定端口
5. Log文件名字
6. Dump.rdb名字
7. Appendonly 關(guān)掉或者換名字
十四、Jedis
1. 所需jar包:
1. common-pool-1.6jar包
2. jedis-2.1
- 獲取jedis對象:Jedis jedis = new Jedis(“ip” ,端口號);
十五、集群分布:
實(shí)現(xiàn)對redis的水平拓展,啟動n’的redis節(jié)點(diǎn),將整個(gè)數(shù)據(jù)分布在這n個(gè)節(jié)點(diǎn)中
配置conf文件:
1. 拷貝多個(gè)redis.conf文件
2. 開啟daemonize yes
3. Pid文件名字
4. 指定端口
5. Log文件名字
6. Dump.rdb名字
7. Appendonly 關(guān)掉或者換名字
配置cluster文件:
- cluster-enable yes 打開集群模式
- cluster-config-file xxx.conf 設(shè)置生成的節(jié)點(diǎn)配置文件名
- cluster-node-timeout 15000設(shè)置節(jié)點(diǎn)失聯(lián)時(shí)間,超多該時(shí)間(毫秒),集群自動進(jìn)入主從切換