redis删除数据的三种方法,redis删除数据库
由于需求的变化,以前的一个项目需要修改redis中存储的数据格式。以防止在新包发布后由于旧数据而插入新数据。因此,发布前必须删除所有旧数据。目前redis是一个公共集群,涉及几个业务。那么问题来了,如何在不影响其他业务使用的情况下,删除大量的旧数据(目前数据库中的总键数为1200w)。
如何解决写爬虫IP受阻的问题?立即使用。
###常见批量删除redis数据的方法:
如果知道要删除的数据的key,可以使用redis-cli的del命令/usr/local/redis/bin/Redis-CLI delkey或者其他高级语言对应的Redis包或库。比如java下的jedis,python下的redis库
java: jdeis.del(key)
Python: redis.delete(key)如果要删除的数据的键未知,则只知道满足特定模式的键。在这种情况下,您需要使用redis的keys命令来找出满足特定模式的键。
找到满足前缀video的所有键。
/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-cliflush db。
###几种方法的说明
第一种方法需要明确知道特定的密钥。
使用keys命令。当库中的数据量过大时,keys命令将阻塞redis的所有其他请求。毫无疑问,这种方法对于公共redis集群是不可取的。当然,还必须考虑业务的具体需求。不可以,也可以把删除脚本放在流量比较小的时候。
使用flushdb,整个库中的数据将被清理。
# # #我的解决方案online redis集群采用matser-slave的结构。因此,您可以将阻止请求的键命令放在从节点上执行,并找出满足特定前缀的所有键。然后使用shell脚本或高级语言删除主节点上的数据。
#获取前缀为video、album、actor actor的所有关键字,并将这些关键字导出到文件/data/keys.txt中。
#!/bin/bash
keys=(视频 专辑 演员);
host=“localhost”;
port= 6378
对于${keys[@]}中的密钥;
做
cmd=/usr/local/redis/bin/redis-CLI-h $ { host }-p $ { port } keys gal . video . $ { key } */data/keys . txt ;
echo $ { cmd };
eval $ { cmd };
搞定;
#根据之前生成的密钥删除数据。
#!/bin/bash
host=“localhost”;
port= 6378
file=/data/keys . txt ;
I=0;
cat ${file} 在读取密钥时;
做
设I=I 1;
cmd=/usr/local/redis/bin/redis-CLI-h $ { host }-p $ { port } del $ { key } ;
“echo”行:“${i}”,cmd:“$ { cmd }”。
eval $ { cmd };
搞定;因为脚本是一条一条的发送del命令,所以执行效率相当低。在测试中,大约一个小时内删除了120w条数据。1200w需要删10个小时!考虑到发送每个请求的耗时,认为可以利用redis的管道实现批量提交。
__作者__=李涛
从redis导入Redis
主机=127.0.0.1
端口=6379
db=0
r=Redis(主机、端口、数据库)
pl=r.pipeline()
每管道尺寸=10000
计数=0
file=open(/data/keys.txt )
打印“开始删除文件中的所有密钥”
而1:
lines=file.readlines(10000)
如果不是线条:
破裂
对于键入行:
key=key.strip(\n )
删除(键)
计数=计数1
if(count==per_pipe_size):
计数=0
执行()
执行()
file.close()
打印完成删除所有键改进脚本2只需要大约2分钟在线执行!redis就是这样删除数据的。更多详情请关注我们的其他相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。