介紹Redis的各種用途以及使用場景
Redis
一、為什麼使用
-
解決應用伺服器的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
九、Redis命令:
-
key操作
keys * | 檢視當前庫所有的鍵 |
exists <key> | 判斷是否存在key |
del <key> | 刪除某個鍵 |
expire <key> <second> | 設定鍵過期時間 單位是s秒 |
ttl <key> | 檢視還有多少秒過期 -1表示用不過期 -2表示已經過期 |
move <key> <db> | 把鍵移到另一個庫下 |
dbsize | 檢視資料庫key的數量 |
flushdb | 清空當前庫 |
flushall | 通殺所有庫 |
-
String型別:String是二進位制安全的,可以包含任何資料來源,最大512m
get <key> | 檢視對應的鍵值 |
set <key> <value> | 新增鍵值對 |
append <key> <value> | 將給定的value 追加到原值的末尾 |
strlen < key > | 獲取值得長度 |
setnx <key> <value> | 當key 不存在的時候設定key值 |
incr <key> | 將key中儲存的數字加1,如果為空,則值為1 |
decr <key> | 將key中儲存的數字減1,如果為空,則值為-1 |
incrby/decrby <key> <步長> | 將key中的數字增減 |
String批量處理:
mset <key1> <value1> <key2> <value2> | 同時設定多個鍵值對 |
mget <key1> <key 2> | 同時獲得多個值 |
msetnx <key1> <value1> <key2> <value2> | 當給定的key都不存在 |
getrange <key> <start> <stop> | 類似sunstring |
setrange <key> <start> <stop> | 類似sunstring覆蓋原始值 |
setex <key> <過期時間> <value> | 設定鍵值的同時,給定過期時間 |
getset <key> <value> | 以舊換新,設定了新的值同時得到舊值 |
-
List:連結串列
1、特點:
單鍵多值
Redis列表是簡單的字串列表,從左或者從右插入
底層是雙向連結串列,對兩端的操作效能很高,通過下標查詢效能很低
lpush/rpush <key> <value1> <value2> .. | 從左或從右插入多個值 |
lpop/rpop <key> | 從左邊或右邊吐出一個值,值光鍵亡 |
rpoplpush <key1> <key2> | 從key1 右邊吐出一個值到key2的左邊 |
lrange <key> <index> | 按照索引下標獲取元素 從左到右 |
lindex <key> <index> | 按照索引下標獲取元素 從左到右 |
llen <key> 獲取列表長度 | 獲取列表長度 |
linsert <key> before <value> <newvalue> | 在key中value前插入newvalue |
-
Set:類似list的無序集合,保證列表中不會有重複資料,底層是一個value為null的hash表
sadd <key> <value1> <value2> | 將多個元素加入到key中,重複值忽略 |
smembers <key> | 取出該集合的所有值 |
sismember <key> <value> | 判斷集合key中是否有該value值 有就1 沒有0 |
scard <key> | 返回該集合的元素個數 |
srem <key> <value1> <value2> | 刪除集合中的某個元素 |
spop <key> | 隨機吐出該集合一個值 |
srandmember <key> <n> | 隨機從集合中取出n個值,不會從集合中刪除 |
smove <key1> <key2> <value> | 將key1中的value 移動到key2 中 |
sinter <key1> <key2> | 返回兩個集合的交集元素 |
sunion <key1> <key2> | 返回兩個集合的並集 |
-
hash:鍵值對集合,類似map<String,Object>
hset <key> <filed> <value> | 給key 集合中的file 鍵賦值value |
hget <key1> <field> | 從key1 集合file取出value |
hmset <key1> <field1> <value1> <field2> <value2> | 批量設定hash的值 |
hexists <key> <field> | 檢視key中的field 是否存在 |
hkeys <key> | 列出key中所有的filed |
hvals <key> | 列出該hash集合中所有的value |
-
zset:與set集合非常相似,每個成員都關聯了score,可以用來排序
zadd<key><score1><value1><score2><value2> | 將一個或多個元素以及score加入zset |
zrange<key><start><stop> withscore | 返回下標在區間內的集合,帶有score |
zrangebyscore <ket> <min> <max>[withscore] [limit offset count] | 返回key中 score介於min和max中的成員,升序排列 |
zrevrangerbyscore <key> <min> <max> [withscore] [limit offset count] | 降序 |
zincrby <key> <increment> <value> | 在key集合中的value上增加increment |
zrem <key> <value> | 刪除key集合下的指定元素 |
zcount <key> <min><max> | 統計 區間內的元素個數 |
zcord <key> | 獲取集合中的元素個數 |
zrank <key><value> | 查詢value在key中的排名,從0開始 |
十、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設定節點失聯時間,超多該時間(毫秒),叢集自動進入主從切換
-