-
keys
当我们需要遍历redis所有key或者指定模式的key时,首先想到的是keys命令,例如:keys*,但是当redis中key数量越大,keys 命令执行越慢,而且最重要的会阻塞服务器,对单线程的redis来说,简直是灾难,所以生产环境建议不使用该命令
批量模糊删除key
defer conn.Close()
val, err := redis.Strings(conn.Do("KEYS", "*"+key+"*"))
conn.Send("MULTI")
for i, _ := range val {
conn.Send("DEL", val[i])
}
_, err = redis.Values(conn.Do("EXEC"))
if err != nil {
log.Error("error(%v)", err)
}
-
scan
从redis2.8版本开始,官方提供了一个新的命令scan来遍历key(参见)
defer con.Close()
//用于循环查询KEY
iter := 0
var keys []string
for {
if arr, err := red.MultiBulk(con.Do("SCAN", iter,"MATCH","*"+key+"*")); err != nil
{
panic(err)
} else {
iter, _ = red.Int(arr[0], nil)
key,_:=red.Strings(arr[1], nil)
for _, value := range key {
keys=append(keys,value)
}
}
if iter == 0 {
break
}
}
//开启事务
con.Send("MULTI")
for _, value := range keys {
//删除
con.Send("DEL", value)
}
_, err = redis.Values(con.Do("EXEC"))
if err != nil {
log.Error("error(%v)", err)
}