中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

redis刪除數據的方法

發布時間:2020-09-16 14:16:04 來源:億速云 閱讀:262 作者:小新 欄目:編程語言

這篇文章給大家分享的是有關redis刪除數據的方法的內容。小編覺得挺實用的,因此分享給大家做個參考。一起跟隨小編過來看看吧。

 由于需求的更改,之前做的一個項目需要對redis中存儲的數據格式進行修改。為防止新包發布后,老數據會導致新數據無法插入。所以,必須在發布前刪除掉所有的老數據。當前redis是一個公用的集群,里面涉及好幾個業務。那么問題來了,如何刪除大量的老數據(目前庫中的key總數為1200w),而又不影響其他業務的使用。

###常見批量刪除redis數據的方法:

如果待刪除數據的key是已知的,可以使用redis-cli的del命令 /usr/local/redis/bin/redis-cli del key 或者也可以使用其他高級語言對應的redis包或庫。如java下的jedis,python下的redis庫

java:   jdeis.del(key)
python: redis.delete(key)

如果待刪除數據的key是未知的,只知道滿足特定模式的key。 這種情況下,就需要使用redis的keys 命令找出滿足特定模式的key

找到滿足前綴是video的所有key

/usr/local/redis/bin/redis-cli keys video_*

可以使用linux的xargs來完成批量刪除 /usr/local/redis/bin/redis-cli keys video* | xargs /usr/local/redis/bin/redis-cli del 3. 如果待刪除的數據是庫中所有的數據,可以使用flushdb清除整個庫 /usr/local/redis/bin/redis-cli flushdb

###幾種方法的說明

第一種方法需要明確知道特定的key

使用keys命令,當庫中數據量過大,keys命令會阻塞redis的其他所有請求。無疑,這種方式對公用redis集群是不可取的。當然,具體還得考慮業務的需要。實在不行,也可以把刪除腳本放到業務訪問量比較小的時間點上執行。

使用flushdb這種方式,會對整個庫中的數據進行清理。

###我的解決方法 線上redis集群使用的是matser-slave的結構。所以可以把阻塞請求的keys命令放到slave節點上執行,找出所有滿足特定前綴的key。然后使用shell腳本或高級語言在master節點上刪除數據。

#獲取前綴是video,album,actor所有的key,并把這些key追加導出到文件/data/keys.txt中

#!/bin/bash

keys=('video' 'album' 'actor');
host='localhost';
port='6378';
for key in ${keys[@]};
do
  cmd="/usr/local/redis/bin/redis-cli -h ${host} -p ${port} keys gal.video.${key}*  >> /data/keys.txt";
  echo ${cmd}; 
  eval ${cmd};
done;
# 根據前面生成的key,刪除數據
#!/bin/bash
host='localhost';
port='6378';
file="/data/keys.txt";
i=0;
cat ${file} | while read key;
do
  let i=i+1;
  cmd="/usr/local/redis/bin/redis-cli -h ${host} -p ${port} del ${key}";
  echo "line:"${i}",cmd:"${cmd};
  eval ${cmd}; 
done;

腳本2由于是逐條發送del命令,執行效率相當的低。測試中大概是1小時刪除120w條數據。1200w條需要刪除10小時!!! 考慮到每次發送請求的耗時,想到可以使用redis的pipeline來實現批量提交。

__author__ = 'litao'
from redis import Redis
host="127.0.0.1"
port=6379
db=0
r =Redis(host,port,db)
pl=r.pipeline()
per_pipe_size=10000
count=0
file = open("/data/keys.txt")
print "start del all keys in "+file.name
while 1:
    lines = file.readlines(10000)
    if not lines:
        break
    for key in lines:
        key=key.strip('\n')
        pl.delete(key)
        count=count+1
        if(count==per_pipe_size):
            count=0
            pl.execute()
pl.execute()
file.close()
print 'finish del all keys'

改進后的腳本2在線上執行時間僅需要2min左右!!

感謝各位的閱讀!關于redis刪除數據的方法就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

囊谦县| 瑞昌市| 东宁县| 金门县| 射阳县| 平定县| 乐至县| 五常市| 梅州市| 乌审旗| 监利县| 怀仁县| 九寨沟县| 南陵县| 台南市| 峡江县| 松阳县| 阿拉善右旗| 蒙自县| 鄂尔多斯市| 临沭县| 黎川县| 莱州市| 屯昌县| 博客| 荃湾区| 西和县| 三台县| 凭祥市| 新兴县| 池州市| 宁城县| 祁连县| 沈丘县| 建平县| 高雄市| 冷水江市| 龙岩市| 大关县| 扎兰屯市| 博湖县|