Rumah > pangkalan data > Redis > redis实现批量删除的命令介绍

redis实现批量删除的命令介绍

Lepaskan: 2020-05-06 09:12:44
ke hadapan
4356 orang telah melayarinya

redis实现批量删除的命令介绍

redis实现批量删除:

1、访问redis根目录    cd  /usr/local/redis-2.8.19

2、登录redis:redis-cli -h 127.0.0.1 -p 6379 (其中,127.0.0.1可以写成服务器的IP地址,6379为端口号)

3、查看所有key值:keys *

4、删除指定索引的值:del key

5、清空整个 Redis 服务器的数据:flushall 

6、清空当前库中的所有 key:flushdb 

【第一种方式】:

下面是批量删除以“key_”开头的所有redis数据 数量为100个

redis-cli -h (IP地址) -p 6379 (端口号:6379) KEYS key_* | xargs redis-cli (-h (IP地址) -p 6379 (端口号:6379)) del 
 
=>[执行后返回的结果影响数量]:(integer) 100[数量100个]
Salin selepas log masuk

【上述命令中 DEL函数的具体用法】:

DEL key [key ...]

删除给定的一个或多个 key 。

不存在的 key 会被忽略。

时间复杂度:

O(N), N 为被删除的 key 的数量。

删除单个字符串类型的 key ,时间复杂度为O(1)。

删除单个列表、集合、有序集合或哈希表类型的 key ,时间复杂度为O(M), M 为以上数据结构内的元素数量。

返回值:

被删除 key 的数量。

【举例说明】:

#  删除单个 key
redis> SET name huangz
OK
 
redis> DEL name
(integer) 1
 
# 删除一个不存在的 key
redis> EXISTS phone
(integer) 0
 
redis> DEL phone # 失败,没有 key 被删除
(integer) 0
 
# 同时删除多个 key
redis> SET name "redis"
OK
 
redis> SET type "key-value store"
OK
 
redis> SET website "redis.com"
OK
 
redis> DEL name type website
(integer) 3
Salin selepas log masuk

【第二种方式】:

第一种方式弊端:这样一个坏处每次都要建立一个连接,量小的话还可以接受,量大的话,效率不行。

通过内置的 Lua 解释器,可以使用 EVAL 命令对 Lua 脚本:

redis-cli -h(IP地址) -p 6379(端口号:6379) --EVAL "return redis.call('del', unpack(redis.call('keys', ARGV[1])))" 0 'Volume:*'
Salin selepas log masuk

【注】:但这种处理方式,量大的情况下,lua函数unpack会出现问题,会报错误

'''
(error) ERR Error running script (call to f_e177a091510d969af3b388ee986dbe6658df6b57): @user_script:1: user_script:1: too many results to unpack
'''
Salin selepas log masuk

【第二种方式优化后】:

【注释】:首先定义一个数组 keys,里面存储了模式匹配的所有的以 ‘Volume:’的key,然后for循环,每次处理5000个key,也就是说每次del 5000个key

redis-cli -h(IP地址) -p 6379(端口号:6379) --EVAL "local keys = redis.call('keys', ARGV[1]) 
	for i=1,#keys,5000 
		do 
			redis.call('del', unpack(keys, i, math.min(i+4999, #keys))) 
		end 
		return #keys" 0 'Volume:*'
Salin selepas log masuk

【第二种方式弊端】:

KEYS操作在线上是禁止使用的!

Redis是单线程的,如果量很大的话,keys是遍历key的,会导致阻塞,这样其他的客户端就没法连接了!

【第三种方式】:

自从redis2.8以后就开始支持scan命令,模式匹配可以采取下面的形式来批删除大量的key

redis-cli -a youpassowrd -n 0 -p 6379 --scan --pattern "Volume:*" | xargs -L 5000 redis-cli -a youpassword -n 0 -p 6379 DEL
Salin selepas log masuk

【结果】:

'''
 /work/app/redis/bin/redis-cli -a youpassword -n 0 -p 6379 --scan --pattern "Volume:*" | xargs -L 5000 /work/app/redis/bin/redis-cli -a youpassword -n 0 -p 6379 DEL
(integer) 5000
(integer) 5000
(integer) 5000
(integer) 5000
(integer) 5000
(integer) 5000
(integer) 5000
(integer) 207
'''
Salin selepas log masuk

更多redis知识请关注redis入门教程栏目。

Atas ialah kandungan terperinci redis实现批量删除的命令介绍. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:csdn.net
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan