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