首页 > 数据库 >Redis 批量删除键

Redis 批量删除键

时间:2024-08-04 10:24:45浏览次数:11  
标签:批量 删除 keys Redis redis cursor delete

Redis 批量删除键

1. 简介

在Redis中批量优雅的删除大量键是一个很麻烦的问题,下面例举常用的方法和优缺点。

2. keys+del命令

使用keys使用查找所有匹配的键,然后在使用del一起批量删除。

优点

  1. 操作简单。

缺点

  1. 查找性能特别差,需要遍历所有键。如果redis key特别多,还有可能造成redis短时间无法提供服务。
  2. 网络性能占用多,所有匹配键都需要发送到redis客户端,如果匹配键特别多会占用大量网络带宽(这个问题可以通过Lua脚本来解决)。
  3. 占用内存多,需要大量内存暂存已经找到的键。
import redis

r = redis.Redis(host='127.0.0.1', port=6379, db=0)

# 查找
keys = r.keys("example-*")
# 删除
r.delete(*keys)

3. SCAN命令

  1. 使用SCAN命令迭代匹配特定模式的键。
  2. 对于每次SCAN迭代返回的键,使用DEL命令进行删除。
  3. 重复上述步骤,直到SCAN命令返回的游标为0,表示迭代完成。

优点

  1. 非阻塞,不会影响Redis服务器的其他操作。
  2. 可以控制每次迭代的键数量,减少内存占用。

缺点

  1. 在高并发场景下,很难保证所有匹配的键都完全删除,需要多次迭代。
import redis

r = redis.Redis(host='127.0.0.1', port=6379, db=0)

cursor = 0  # 以0开始
while True:
    cursor, keys = r.scan(cursor=cursor, match='example-*', count=100)
    if cursor == 0:  # 以0结束
        break

    if keys:
        r.delete(*keys)

4. UNLINK命令

UNLINK命令是Redis提供的一个异步删除命令,与DEL命令不同,UNLINK命令会立即返回,而删除操作将在后台异步进行。

  1. 使用SCAN命令或KEYS命令获取要删除的键列表。
  2. 使用UNLINK命令代替DEL命令进行删除。

优点

  1. 异步删除,不会阻塞Redis服务器。

缺点

  1. 删除的完成时间不可预测。
  2. 在某些情况下可能需要额外的逻辑,保证在需要删除的键已经删除。
import redis

r = redis.Redis(host='127.0.0.1', port=6379, db=0)

cursor = 0  # 以0开始
while True:
    cursor, keys = r.scan(cursor=cursor, match='example-*', count=100)
    if cursor == 0:  # 以0结束
        break

    if keys:
        r.unlink(*keys)

5. Lua脚本

上面所有的示例都可以转换成Lua脚本版本,下面只演示其中一个。

优点

  1. 大量降低redis客户端redis服务器的RTT时间。
  2. 大量节约了redis服务器的带宽。

缺点

  1. 提高操作的复杂。
import redis

r = redis.Redis(host='127.0.0.1', port=6379, db=0)

lua_script = """
local key1 = KEYS[1]
local delete_count = 0
local delete_keys = redis.call('keys', key1)
if #delete_keys > 0 then
    delete_count = redis.call('del',unpack(delete_keys))
end

return delete_count
"""

# 注册脚本
script = r.register_script(lua_script)

# 执行
result = script(keys=['example-*'])
print(result)

6. 总结

  1. 尽量避免在生产环境使用keys:使用keys不可避免的会出现性能问题。
  2. 分批次删除:不要一次删除防止redis服务端处理大量键进入阻塞状态。

标签:批量,删除,keys,Redis,redis,cursor,delete
From: https://blog.csdn.net/yimtcode/article/details/140902715

相关文章

  • 【Redis 进阶】哨兵 Sentinel(重点理解流程和原理)
    Redis的主从复制模式下,一旦主节点由于故障不能提供服务,需要人工进行主从切换,同时大量的客户端需要被通知切换到新的主节点上,对于上了一定规模的应用来说,这种方案是无法接受的,于是Redis从2.8开始提供了RedisSentinel(哨兵)加个来解决这个问题。一、基本概念由于对Red......
  • 【面试题解答】一个有序数组 nums ,原地删除重复出现的元素
    面试题解答仅供学习文章目录面试题解答题目一、python代码1.1代码1.2示例用法1.2.1示例11.2.2示例2二、讲解2.1初始化2.2遍历2.3返回题目要解决这个问题,可以使用双指针方法进行原地修改,以确保每个元素最多出现两次。一、python代码1.1代码defr......
  • redis缓存雪崩
    Redis缓存雪崩是指在短时间内大量缓存数据同时失效,导致原本应该由缓存承担的请求流量突然涌向后端数据库或其他数据源,从而给后端系统带来巨大压力,可能导致数据库超负荷甚至崩溃的现象。 缓存雪崩通常发生在以下几种情况:-大量数据设置了相同的过期时间,在同一时刻失效。-......
  • Redis - Smembers性能优化
    命令概述SMembers命令用于获取一个集合的所有成员。它的语法如下:SMEMBERSkey其中,key是集合的名称。SMembers命令返回一个包含所有集合成员的数组。如果集合不存在,返回空数组。关键因素内存占用:Redis是内存数据库,因此集合的大小直接影响到内存使用量。网络传输:当使用S......
  • leetcode 021:删除链表的倒数第 N 个结点
    LCR021.删除链表的倒数第N个结点给定一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。示例1:输入:head=[1,2,3,4,5],n=2输出:[1,2,3,5]示例2:输入:head=[1],n=1输出:[]示例3:输入:head=[1,2],n=1输出:[1]structListNode*removeNthF......
  • 锁撤销阈值达到20次批量重偏向是针对类还是线程?撤销阈值达到20次触发的20是指撤销偏向
    先说答案, 锁的批量重偏向是针对类的,且只能触发一次,撤销阈值20次是指撤销19个对象偏向锁后再来一个对象需要撤销才会触发锁的批量重偏向,实际会撤销19个。测试过程如下:建立spring项目,要有依赖<dependency><groupId>org.openjdk.jol</groupId>......
  • 如何理解先删除缓存还是先修改数据库。
        针对这个问题,其实反过来更好理解,即“先删除缓存还是先修改数据库能保证数据一致”变为“数据不一致的条件是什么”,好,现在就经过第一步转换了,接下来就解决这个问题。    数据不一致其实就是在经过缓存删除和数据库修改变化后缓存中是旧数据,数据库是新数据。更新......
  • 批量手机号归属地查询
    因为买不起归属地查询接口,于是自己爬了一个网站在爬取网站时有许多曲折,大部分网站都做了反爬,于是发现一个网站没做反爬,但爬取的是图片形式(属实666)我直接想到识别图片来获取文字,返回的形式是(省+市+通讯运营商)首先得下载paddle的各种库,其次在文件中添加一个result.txt文件代......
  • Java通过redis实线多线程多用户操作时添加锁
    背景由于项目中多出涉及同步数据,同步过程就是从设备上查询数据,将数据库中该设备数据删除,将新数据导入到数据库;多次同步数据或多用户操作,会导致数据库出现重复数据,例如,两个线程同时删除设备数据,同时导入数据,就会出现双倍数据;还有线程1正在导入数据,中途线程2将线程1导入数据之前删......
  • QT6,数据库批量添加数据方法
    //批量插入数据//odbc风格,预处理语句,其中?相当于占位符query.prepare("insertintostudent(name,age,score)values(?,?,?)");//将字段内容添加到指定list中QVariantListnamelist;namelist<<"zhao"<<"qian"<<"sun&quo......