1. 程式人生 > 程式設計 >Java使用RedisTemplate模糊刪除key操作

Java使用RedisTemplate模糊刪除key操作

Redis模糊匹配批量刪除操作,使用RedisTemplate操作:

 public void deleteByPrex(String prex) {
  Set<String> keys = redisTemplate.keys(prex);
  if (CollectionUtils.isNotEmpty(keys)) {
   redisTemplate.delete(keys);
  }
 }

prex為迷糊匹配的key,如cache:user:*

這裡需要判斷keys是否存在,如果一個都匹配不到會報錯:

ERR wrong number of arguments for 'del' command

當然,如果要直接在linux裡面操作的話,在命令列執行以下命令:

redis-cli keys "keys" | xargs redis-cli del

keys 是要匹配的規則,和上面的prex一樣。

補充知識:Redis怎麼用 - (一)基礎命令介紹、常見應用場景說明

最新穩定版本5.x

官方文件:https://redis.io/documentation

登入資料庫

遠端連線命令:redis-cli -h host -p port -n database -a password

示例: redis-cli -h xxx.com -p 8879 -n 14 -a pwd

-n表示登入的資料庫索引號

預設埠號:6379

基本操作

命令 示例 用途
get get $key 獲取某個快取項的值
set set $key $value 為某個快取項賦值 * 若該項已存在,新值會覆蓋原值 * 若該快取項之前設定了生存時間,set命令執行後會清除之前設定的生存時間
expire expire $key $seconds 設定某個快取項的生存時間(幾秒後過期) * 要設定ms,可使用pexpire
ttl ttl $key 獲取某個快取項的剩餘生存時間(秒) * 要獲取ms,可使用pttl * 返回-1表示永久有效,-2表示已過期
setex setex $key $seconds $value 設定某個快取項的值,並指定生存時間(秒) * 原子操作 * 可用於分散式鎖實現 * 等同於set + expire,但後者不是原子操作
setnx setnx $key $value setnx = set if not exist 當某個快取項不存在時,設定其為指定值;若該快取項已存在,則不做操作 * 原子操作 * 如果key不存在就執行set建立,並返回1;否則返回0
del del $key 刪除指定快取項

原子計數

Redis提供了幾個對快取值進行運算的命令、且這些命令底層是原子操作(類似Java的AtomicLong)、不需要擔心併發問題,因為該特性、原子技術在併發控制上有較多應用。

Redis數字值範圍為 64 位(bit)有符號數字,等同於signed long

計數命令實際上操作的是字串,因為Redis沒有專用的整數型別,快取值在執行計數命令時、會解釋為十進位制64位有符號整數

命令 示例 用途
set set $key $integer 使用set命令直接設定數字值
incr incr $key 將快取項的值加1,並返回加1後的值 * 該項不存在,則先設為0、再加1 * 該項已存在、但值不是數字,返回錯誤 (error) ERR value is not an integer or out of range
incrby incrby $key $integer 將快取項的值加指定數字,並返回增加後的值。 其他特性與incr相同
decr decr $key 將快取項的值減1,並返回減1後的值 其他特性與incr相同
decrby decrby $key $integer 將快取項的值減指定數字,並返回減去後的值。 其他特性與incr相同

原子計數有兩種主要應用場景:

分散式鎖

incr $key返回1,認為是爭搶到鎖;其他值為失敗

未獲取鎖,或獲取鎖成功處理業務後,要decr;

可能遇到的問題:

decr未執行怎麼辦?即使加了finally,也可能程式宕機或斷電,導致redis裡值永遠不更新,所有執行緒都被鎖住

如果加了expires,如果任務還未完成快取到期了,鎖就失效了

秒殺庫存控制

一直decr,小於0後表示未秒殺到;如果發生取消訂單、庫存通過incr增加

快取減掉後,建立資料庫訂單扣減庫存報錯的話,快取和資料庫數量不一致

因此異常處理時要記得呼叫incr

秒殺和分散式鎖相關還有很多要考慮,另行組織文章分享

批量操作

命令 示例 用途
mget mget $key1 $key2 . . . 批量獲取快取值
keys keys rex 按正則表示式過濾快取鍵,列出匹配的快取項 資料量大的時候效能很差
scan scan ${cursor} match ${rex} count ${limit} eg. scan 0 match key99* count 1000 漸進式遍歷鍵 * 遍歷完成會返回遊標0
del del $key 刪除指定快取項
`` ``
`` ``

批量刪需自行實現:

可用redis-cli+lua指令碼實現批量模糊化刪除:redis-cli eval "redis.call('del',unpack(redis.call('keys','$pattern')))" 0

維護

flushdb:清除當前資料庫的所有Key

info:檢視伺服器情況

檢視連線數:info clients

檢視連結列表:CLIENT LIST

kill指定連結:CLIENT KILL ip:port

以上這篇Java使用RedisTemplate模糊刪除key操作就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。