旗下导航:搜·么
当前位置:网站首页 > JAVA教程 > 正文

redis怎样删除数据?【JAVA教程】,redis删除数据

作者:搜教程发布时间:2019-11-27分类:JAVA教程浏览:68评论:0


导读:因为需求的变动,之前做的一个项目须要对redis中存储的数据格式举行修正。为防备新包宣布后,老数据会致使新数据没法插进去。所以,必须在宣布前删撤除一切的老数据。当前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怎样删除数据?的细致内容,更多请关注ki4网别的相干文章!

标签:redis删除数据


欢迎 发表评论: