0
点赞
收藏
分享

微信扫一扫

golang中redis模糊删除

  • 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)
	}


举报

相关推荐

0 条评论