Alice52 / database

ddf13ad8d4be76a80a336418b5cf5727bf6e3059
gitee.com
MIT License
0 stars 0 forks source link

[redis] remove by match #56

Closed Alice52 closed 1 year ago

Alice52 commented 1 year ago

match

  1. remove by shell command
    redis-cli KEYS "unkey*" | xargs redis-cli DEL
  2. scan --> keys: scan 不会一次获取所有数据导致线程的阻塞和网络的占用
  3. unlink --> del: unlink 会在另一个线程中执行内存的回收,不会阻塞正常的 get set 请求
  4. lua脚本是原子的: 因此每次删除一部分并返回游标, 在代码里传入游标再次调用
  5. code

    -- ARGV[1]: 游标开始的位置
    -- ARGV[2]: 匹配的模式
    -- ARGV[3]: 扫描个数
    local keys = {};
    local cursor = "0"
    
    local result = redis.call("SCAN", ARGV[1], "match", ARGV[2], "count", ARGV[3])
    cursor = result[1];
    keys = result[2];
    
    -- 等价于 for: 
    -- for i, key in ipairs(keys) do
    --     redis.call("unlink", key);
    -- end
    redis.call('unlink',unpack(keys));
    
    return cursor;

reference

  1. https://xie.infoq.cn/article/0e34856ec9a88d749e7b1ae7a