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