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