簡介
一、爲什麼使用
解決應用服務器的cpu和內存壓力
減少io的讀操作,減輕io的壓力
關係型數據庫的擴展性不強,難以改變表結構
二、優點:
nosql數據庫沒有關聯關係,數據結構簡單,拓展表比較容易
nosql讀取速度快,對較大數據處理快
三、適用場景:
數據高併發的讀寫
海量數據的讀寫
對擴展性要求高的數據
四、不適場景:
需要事務支持(非關係型數據庫)
基於sql結構化查詢儲存,關係複雜
五、Redis結構:
Redis是一個開源的key—value型數據庫,支持string、list、set、zset和hash類型數據。對這些數據的操作都是原子性的,redus爲了保證效率會定期持久化數據。
六、使用場景:
配合關係型數據庫做高速緩存
緩存高頻次訪問的數據,降低數據庫io
分佈式架構,做session共享
可以持久化特定數據。
利用zset類型可以存儲排行榜
利用list的自然時間排序存儲最新n個數據
七、Linux下redis:
redis目錄:usr/local/bin
linux下redis常用命令:
redis-benchmark:性能測試工具
redis-server:啓動redis服務器
redis-cli:啓動redis客戶端,操作入口
八、Redis基礎知識
端口:6379
默認16個數據庫,下標從0開始
單線程:redis是單線程+io多路複用:檢查文件描述的就緒狀態
Memchached:多線程+鎖
redis數據類型:String set list hash zset
九。基本操作
1.0開啓服務
在redis目錄下的cmd窗口執行
redis-server.exe redis.windows.conf
開啓redis服務,監聽6379端口
2.執行指令(增刪改查)
再開一個窗口同樣在redis目錄下,如果設置了環境變量就直接運行
redis-cli
啓動客戶端口 再輸入auth 密碼 或者在上面的代碼後面加 -a 密碼就可以直接進入客戶端了
驗證是否成功:執行指令
ping
返回 PONG則完成
注意操作前先選定使用哪個庫
seclect num
更多操作命令和釋義可以參考:http://redis.cn/commands.html
@字符串的操作
set name bill //設置鍵值
setex name 20 bill //鍵值20秒後過期 --ttl name方法可以查看值還剩餘多少秒纔會過期
mset age 60 gender male //一次性存儲多個鍵值
get name //不存在則返回null (獲取該key的value)
mget name age //一次性拿取多個鍵值 (查看多個value)
incr/decr age //將age加減1
incrby/decrby age 20 //將age加減20
append name gates //向原有value追加內容
strlen key //獲取值長度
@key鍵操作舉例
- 單鍵多值
Redis列表是簡單的字符串列表,從左或者從右插入
底層是雙向鏈表,對兩端的操作性能很高,通過下標查詢性能很低
keys * //顯示所有鍵,慎用,數據量大時導致卡死
keys a* // 顯示所有以a開頭的鍵
exists name age //判斷name和age這兩個鍵存在幾個
type name //查看值的類型
del name age //刪除鍵
expire name 30 //name鍵值30秒過期
ttl name //查看鍵值的過期時間(-2表示已經過去 -1是永久存在)
persist name // 取消鍵的過期時間
rename name nickname // 重命名鍵(這樣做不安全,容易覆蓋已有數據)
renamenx name nickname // 確保不會覆蓋其它鍵才重命名(nx=not exists,x後綴=exists)
@哈希hash操作舉例
- hash是將多個字段和值存儲在一個鍵中,類似對象
- 鍵值對集合,類似
map<String,Object>
hset p1 name bill // 設置p1對象的name爲bill
hset p1 age 18 // 設置p1對象的age爲18
hmset p2 name jobs age -1 //設置p2對象的name爲jobs,age爲-1
hget p1 name // 獲取p1的name屬性值
hmget p1 name age // 同時獲取p1的name和age
hgetall p1 // 獲取p1的全部字段和值
hkeys p1 // 獲取p1的全部字段
hvals p1 // 獲取p1的全部字段值
hlen p1 // 獲取p1中所有字段數(鍵值對的個數)
hexists p1 name // 判斷p1中是否有name字段
hdel p1 name // 刪除p1中的name字段
hdel p2 name age // 刪除p2中的name和age字段
hstrlen p1 age // p1中的age的長度
@列表list操作舉例
- 在redis中也稱隊列,可按下標獲取元素,也可從頭尾彈出或放入
- 單鍵多值
- Redis列表是簡單的字符串列表,從左或者從右插入
底層是雙向鏈表,對兩端的操作性能很高,通過下標查詢性能很低
`lpush mlist 2 // 從左側向列表mlist追加元素2 rpush mlist 3 // 從右側向列表mlist追加元素3 linsert mlist after 3 4 // 在列表mlist中3的後邊追加元素4 lset mlist 1 200 // 設置列表mlist中的第1個元素爲200(下標從0開始) lrange mlist 0 3 // 查看列表mlist中下標[0到3]的元素 lrange mlist 0 -1 //從頭看到尾 lpop mlist // 從列表左側彈出一個值 rpop mlist // 從列表右側彈出一個值 ltrim mlist 0 1 // 修剪掉mlist下標[0,1]以外的元素 llen mlist // 列表元素個數 lindex mlist 0 // 獲取mlist中下標0的元素 `
@集合set操作舉例
- 無序元素集,經常用於求交集、並集、差集等;
- 類似list的無序集合,保證列表中不會有重複數據,底層是一個value爲null的hash表
sadd mset 1 2 3 4 // 向集合mset中添加元素1,2,3,4
smembers mset // 查看集合mset中的元素
scard mset // 查詢集合元素個數
sinter mset mset2 //求mset和mset2的交集
sdiff mset mset2 //求mset相比mset2的差集(mset有而mset2無的部分)
sunion mset mset2 // 求mset和mset2的並集
sismember mset 3 //判斷3是否是mset中的元素
@有序集合zset
- 可按權重對元素進行排列;
- 與set集合非常相似,每個成員都關聯了score,可以用來排序
zadd mzset 10 bill 9 jobs 6 jackma // 添加多個值及相應權重
zrange mzset 0 -1 // 返回第一個到最後一個之間所有的元素,按權重升序排列
zcard mzset // 元素個數
zcount mzset 6 10 // 權重6-10之間的元素個數
zscore mzset jackma // 返回 jackma在mzset中的權重
十、redis持久化:
兩種方式:rdb(redis database)和aof(append of file)
RDB:在指定時間間隔內,將內存中的數據作爲一個快照文件(snapshot)寫入到磁盤,讀取的時候也是直接讀取snapshot文件到內存中
- ①持久化過程:redis單獨創建(fork)一個進程來持久化,會先將數據寫入臨時文件中,待上次持久化結束後,會將該臨時文件替換上次持久化文件,比aof高效,但是最後一次數據可能會丟失
- ②Fork:在linux中,fork()會產生一個跟主進程一樣的子進程,出於效率考慮,主進程和子進程會公用一段物理內存,當發生改變的時候,纔會把主進程“”寫時複製”一份給子進程
- ③Redis備份的文件:在redis.conf中設置,dbfilename默認爲:dump.rdb
- ④ Rdb保存策略:
900s 1 file change
300s 10file change
60s 10000file change
⑤Rdb的備份:
config get dir 得到備份的文件夾
複製備份文件
⑥Rdb恢復:
關閉redis
將備份文件複製到工作目錄下
啓動redis,自動加載
AOF : 以日誌形式記錄每個寫操作,啓動時通過日誌恢復操作
開啓AOF:默認不開啓,進入redis.conf找到appendonly yes打開
修復AOF:redis-check-aof –fix appendonly.aof
同步頻率:每秒記錄一次,如果宕機該秒記可能失效
Rewrite:bgrewriteaof 因爲日誌是追加方式,文件會越來越大,當超過了設置的閾值時,日誌文件會壓縮,保留僅可以恢復的日誌
RDB和AOF對比
節省磁盤空間
恢復速度快
RDB優點:
ROD缺點:
數據太大時,比較消耗性能
一段時間保存一次快照,宕機時最後一次可能沒有保存
c) AOF優點:
i. 備份機制更加穩健
ii. 可讀的日誌文件,通過aof恢復更加穩健,可以處理失誤
d) AOF缺點:
i. 比RDB更佔磁盤
ii. 備份速度較慢
iii每次都同步日誌,有性能壓力
RDB和AOF哪個好
官方推薦都啓用
對數據不敏感,單獨用RDB
不建議單獨使用AOF
若作爲純緩存使用,可以都不開啓
十一、Redis事務:
- 輸入multi,輸入的命令都會依次進入到隊列中,但不會執行,直到輸入exec,redis會將之前命令隊列中的命令依次執行,通過discard可以放棄組隊。
主要作用:序列化操作,串聯多個命令防止別的命令插隊
- 悲觀鎖:每次拿到數據的時候都會上鎖,或者等待別人處理完再去拿鎖,傳統的關係型數據庫裏邊很多用到了這種鎖機制,比如行鎖、表鎖、讀鎖、寫鎖
- 樂觀鎖:每次拿數據的時候總認爲別人不會修改數據,所以不會上鎖。但是更新的時候回去判斷別人有沒有更改數據,使用版本號機制。樂觀鎖適用於多讀的應用類型,可以提高吞吐量。
- Redis使用樂觀鎖:redis就是利用check-and-set機制實現事務
三大特性:
- 單獨的隔離操作:事務中的所有命令都會序列化,按順序執行。不會被其他客戶端打斷
- 沒有隔離級別概念:隊列中的命令沒有提交之前不會被執行,事務外不能查看事務內的更新
- 不能保證原子性:跳過錯誤,依舊執行,沒有回滾
十二、Redis訂閱/發佈:
- 是進程中的一種消息通信模式,發送者pub發送消息,訂閱者sub接收消息 剩下的略。。。
十三、Redis主從複製:
是什麼:主從複製就是主機數據更新後根據配置和策略,自動同步到備份機的master/slaver機制,master寫爲主,slave讀爲主
用處:
讀寫分離,性能拓展。
容災快速恢復
配置服務器(配從不配主):
拷貝多個redis.conf文件
開啓daemonize yes
Pid文件名字
指定端口
Log文件名字
Dump.rdb名字
Appendonly 關掉或者換名字
十四、Jedis:
所需jar包:
common-pool-1.6jar包
jedis-2.1
獲取jedis對象:Jedis jedis = new Jedis(“ip” ,端口號);
十五、集羣分佈:
實現對redis的水平拓展,啓動n’的redis節點,將整個數據分佈在這n個節點中
配置conf文件:
拷貝多個redis.conf文件
開啓daemonize yes
Pid文件名字
指定端口
Log文件名字
Dump.rdb名字
Appendonly 關掉或者換名字
配置cluster文件:
cluster-enable yes 打開集羣模式
cluster-config-file xxx.conf 設置生成的節點配置文件名
cluster-node-timeout 15000設置節點失聯時間,超多該時間(毫秒),集羣自動進入主從切換
轉載自https://blog.csdn.net/u010986776/article/details/79796203
還有https://blog.csdn.net/u011277123/article/details/78692603