1. 程式人生 > >redis 學習2

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 的 分散式分片功能了。

具體怎麼使用就根據具體情況進行 使用了