在Redis中,DEL命令本身不支持通配符,但可以通过结合SCAN命令或Lua脚本实现高效批量删除键值对。例如,使用以下Lua脚本实现通配符删除:
local cursor = '0'
local pattern = KEYS[1]
local matches = {}
repeat
local result = redis.call('SCAN', cursor, 'MATCH', pattern, 'COUNT', 100)
cursor = result[1]
local keys = result[2]
for i, key in ipairs(keys) do
table.insert(matches, key)
end
until cursor == '0'
if #matches > 0 then
return redis.call('DEL', unpack(matches))
else
return 0
end
使用方法:EVAL "脚本内容" 1 "prefix:*",这样就能高效删除所有匹配prefix:*的键,提升数据管理效率。
使用SCAN命令配合DEL批量删除
Redis的DEL命令不支持直接使用通配符(如*?),但我们可以使用SCAN命令迭代扫描键空间,匹配特定模式,然后批量删除。示例代码:
#!/usr/bin/env python
import redis
r = redis.Redis(host='localhost', port=6379, db=0)
cursor = 0
pattern = 'user:*'
while True:
cursor, keys = r.scan(cursor=cursor, match=pattern, count=100)
if keys:
r.delete(*keys)
if cursor == 0:
break
这种方式避免了KEYS命令的阻塞问题,适合生产环境批量清理数据。
Lua脚本实现高效通配删除
为了更高效地删除匹配通配符的键,可以使用Redis Lua脚本一次性完成扫描和删除:
redis-cli --eval scan_del.lua , prefix_key
脚本内容(scan_del.lua):
local pattern=ARGV[1]
local cursor=0
repeat
local res=redis.call('SCAN',cursor,'MATCH',pattern,'COUNT',1000)
cursor=res[1]
if #res[2]>0 then
redis.call('DEL',unpack(res[2]))
end
until cursor=='0'
return 'OK'
此方法原子性强,性能高,特别适合删除大量键如session:*。
Python中redis-py实现模糊删除
使用redis-py库,可以轻松实现DEL通配符删除:
def delete_keys(redis_client, pattern):
keys = redis_client.keys(pattern)
if keys:
redis_client.delete(*keys)
return len(keys)
# 使用
delete_keys(r, 'cache:*')
注意:在生产环境避免使用KEYS命令,改用SCAN迭代:
def delete_pattern_keys(redis_client, pattern):
cursor = 0
while True:
cursor, keys = redis_client.scan(cursor, match=pattern, count=100)
if keys:
redis_client.delete(*keys)
if cursor == 0:
break
注意事项与性能优化
1. 避免KEYS命令:KEYS会阻塞Redis主进程,生产环境禁用。
2. SCAN参数调优:COUNT值设为100-1000,避免内存爆炸。
3. Lua脚本优势:原子执行,减少网络往返。
4. 分片删除:大key数量时分批删除,防止内存峰值。
5. 监控删除效果:使用INFO commandstats查看命令执行情况。
FAQ
Q: DEL命令为什么不支持直接通配符?
A: Redis设计为高性能内存数据库,DEL针对具体key优化,通配符扫描会影响性能,故需SCAN配合。
Q: 生产环境推荐哪种删除方式?
A: 优先Lua脚本+SCAN,原子性好,不阻塞服务。
Q: 删除10万键需要多久?
A: 视机器配置,单机Redis约几秒到几十秒,建议分批。
Q: 有没有图形化工具支持批量删除?
A: RedisInsight、Redis Desktop Manager支持pattern搜索后批量删除。