redis 學習2
網站
啟動
服務端
啟動redis 服務端
在redis 安裝目錄下 src 裡面
./redis-server &
可以指定 配置檔案或者埠
客戶端
在 redis 的安裝目錄裡面的 src 裡面
./redis-cli
可以指定 指定 連線 服務端的埠 或者 ip
預設連線的埠是6379
可以指定連線的 密碼
關閉
配置
redis 關閉
關閉伺服器端, 使用 kill -9 pid 即可,
當然了 關閉 redis 服務的時候並沒有將最近操作的給持久化到磁碟,
因此 客戶端要 執行 save 命令即可。
但是不建議這樣使用
應該在 redis 安裝目錄 下的 src 下面 使用 ./redis-cli shutdown
這樣 就可以保持 最近的記錄持久化到磁碟了, redis 服務也就關閉了
基礎命令
keyspace
用途:比如 多個測試環境, 每個測試環境存的資料就使用對應的 db 即可, 這樣 在程式碼裡面控制切換即可。
預設都是使用 db0
切換 DB命令: select index , 比如 select 10 就切換到 db10 了
flush
flushdb 清除當前的 db
flushall 清除當前所有的 keyspacce 裡面的db , 所有的key
dbsize
當前 db裡面有多少個 key 的數量
quit
退出 客戶端連線
鍵命令
ttl 查詢 剩餘生存時間
就是 查詢 對應的 key的剩餘生存時間
比如 ttl a 如果返回 -1 代表永久生存,沒有時間限制
如果返回值是 1 就是馬上結束了,如果是 -2 表示已過期,該key已被刪除
expire 設定過期時間
比如 expire a 10 即 10秒後過期
比如 在 儲存 session 這樣 ,模擬session 的有效期
type
返回key 的型別
比如 type b 返回 string
如果返回 none 就代表 不存在該key 即沒有型別了
rename 重新命名key
比如 rename a d 即將 key為 a 的重新命名為 d
但是如果 被重新命名的 key 已存在,舊值將會被刪除。
比如 存在 key a 和 d , rename a d 之後, a將被 d 覆蓋,而原來的 d 的值將 被 改為 對應 a的key的值。
會覆蓋已存在的。
renamenx 與nx
即 如果 對應的 key 已存在將 rename 失敗
renamenx a b , 因為 b 已存在 ,因此 renamenx 不成功。
就 nx 就去校驗,如果對應的 key 已存在則 不執行對應的命令
renamenx a m 將成功,因為不存在 key為 m的
setex
設定對應的key 並 給與有效期
比如 setex c 100 c 即 設定一個 key為c 值為 c ,有效期為 100秒
psetexx 設定過期時間為毫秒
psetex d 10000 d
這裡是 設定一個 key d 的 值為d 過期時間 為 10000 毫秒
monitor
可以通過 monitor 來 檢視redis 的日誌和記錄,排查問題時候,比較好用
資料結構
string
預設就是 字串型別
getrange 獲取對應 key的內容的 範圍
比如 getrange word 0 2
獲取 key 為 word 的內容 的 index 從 0到2 的內容,包括 2 的內容
getset
獲取並設定, 並且會將 舊的值給返回
mset 批量 設定 key
mset a1 a1 b1 b1 c1 c1
mget 批量獲取 key的值
比如 mget a1 b1 同時獲取 ba, b1 的內容
setnx
當 key 不存在才會 set 成功,存在則設定失敗
不會覆蓋存在的 key
msetnx 批量 設定 不存在的 key
同時它是具有 原子性的,要麼都設定成功,要麼都設定 失敗。 只要當某個設定 不成功,其餘都不成功
append 增加內容
即在 value 後面 加上 對應的內容
incr 自增
每次執行 都會將 對應 key 的value 是數字的 自增 1
value 必須為 數值,且沒有超出範圍, 比如 integer 型別
incrby 設定自增步長
比如 incrby 1 100 自增 100 ,將原值加上 100
decr 自減
減少 1 , 將 值 減 1
decrby 根據 幅度 自減
比如 decrby 1 100 自減 100
雜湊hash
hexists 判斷map是否存在
hexists map xx
hsestnx map xxkey xxvalue
即 如果 key 不存在才 設定成功,否則存在就不能設定
list 列表
lpush
lpush list 1 2 3 4 5 6 7 8 9 10
也就是 最後放入的 就在 最首位
lrange list 0 1 結果是 10 , 9
lpop 移除 列表第一個元素
lpop list 將list 移除 第一個 元素, 比如 10
rpop 移除列表最後一個
lrange 範圍 顯示,不會出現越界的情況
lrange list 0 100
如果 list 列表只有幾個元素,就將 list 內容都顯示出來,超過了100 才會只顯示 0到 100 的
set 集合 ,去重,無序
scard
將 set 集合所有內容數量都顯示出來
sdiff 差集, sinter 交集, sunion 並集
即獲取兩個集合的差集
sdiff set1 set2 即顯示 set1 相對 set2 的差集
srem 移除 元素
spop 隨機移除一個元素,並返回移除的元素
可以使用在一些隨機獲取內容的場景:比如 使用者下單的時候,從set 集合裡面隨機獲取一個訂單號給對應的訂單。
獲取也可以用於抽獎相關的場景
sortedset 有序集合
zadd
zadd sortedset1 100 a 200 b 300 c 即 一個集合 ,第一元素a的值是 100 ,第二是 200 ,第三個是 300
將會按照 值給排序,預設是從小到大排序
zincrby 新增對應的內容
zincrby soredset 1000 a
將 a的值 增加 1000
zrange 範圍取值,閉區間方式,不會出現越界
zrange sortedset 0 100
score 顯示分數
zrange sortedset 0 100 withscores
將 集合的內容 從 0到 100 顯示,並顯示分數
zscore sortedset b 現在 key 為 b的值 分數
key 命名可以 帶上 :
比如 set aa:bb:cc abc
這樣就 存在 key 為 aa:bb:cc 值為 abc 了。
將會 以 樹狀的 結構方式 儲存 內容的。
比如可以加上 set aa:bb:dd abd
這樣就比較規範,而且維護也比較好,比如來一個 商品的 good 之後接著其他屬性。
比如 good:name , good:price 等 ,
可以這樣方式來 命名 redis 的 key
分散式redis
可以將 已經 解壓安裝好的redis 資料夾 給 複製一份,就是另一個redis了,稍微配置一下,就可以做完另一個redis 來用了。
一致性hash演算法
環形hash空間
命中率公式: (1 - n/(n+m) )* 100%
n 代表 伺服器節點, m 代表 變動的伺服器數量。
隨著 分散式叢集的伺服器越多,當 伺服器節點變動的M越大,那麼命中率越高,受到的影響越低。
而且有虛擬節點,因此影響就更低了
redis 物理形態是叢集,工作方式是 分散式。
保證高可用就是 每一個分散式節點的 redis 配置 主從, 一般 可以不用 分散式的redis形式,
可以來一個 redis 主從即可 來保障高可用即可。除非 需要快取的資料量很大,需要使用分散式加主從的方式。
spring session
官網 https://spring.io/projects/spring-session
裡面就有一些使用 的 demo 了
總結
如果不想對之前的程式碼進行修改,可以使用 spring session 結合redis,
如果要自定義 ,和靈活性,則可以自己實現了
redis 分散式鎖
實現用的命令
setnx 不存在就設值 , getset 獲取舊對的值,獲取舊的值, expire 設值過期, del刪除
流程圖
優化版
參考程式碼 https://www.cnblogs.com/zuolun2017/p/8028208.html
redisson 框架
redis 主從
redis 配置主從很簡單, 從庫只能讀,不能寫
同時 主從的話,就不用 使用 redis 的 分散式分片功能了。
具體怎麼使用就根據具體情況進行 使用了