Redis Scan使用问题记录

一、背景

最近要上线一个黑名单统计脚本,由于数据是在redis中,所以涉及到了一个python redis的api使用问题,可能有点特别,专门记录下。

二、问题说明

2.1 命令行调用

python3 xx.py prod online

2.2 问题代码

def search_keys_by_prefix(prefix, redis):
    keys = []
    cursor = '0'
    while cursor != 0:
        cursor, data = redis.scan(cursor=cursor, match=prefix + '*')
        keys.extend(data)
    return keys

2.3 问题现象&排查过程

  1. 执行脚本命令长时间没有输出日志
  2. 怀疑是服务器没有加白名单导致获取链接失败
  3. 手动停止命令,抛出异常如下

Redis Scan使用问题记录针对第二点已经联系运维确认过了,白名单已经加了,那么就很可能是获取的数据太多,导致长时间无法输出日志,脚本实际上是一直在执行的。因此,可以基本判断是脚本的业务代码有问题。

三、分析

3.1 scan命令

SCAN cursor [MATCH pattern] [COUNT count]
SCAN 命令用于迭代当前数据库中的数据库键。
SSCAN 命令用于迭代集合键中的元素。
HSCAN 命令用于迭代哈希键中的键值对。
ZSCAN 命令用于迭代有序集合中的元素(包括元素成员和元素分值)。

说明:

  1. 如果没有传count,默认会是10,
  2. 如果scan的key比较多,就会出现文中的问题
  3. scan的count值不能设置的太大,因为每次扫描都可能涉及到redis服务端的稳定性,如果count值与key的数量一样那效果类似于keys命令,可能会引起阻塞。
  4. 根据经验看count=10000比较合适

3.2 源码说明

  def scan(self, cursor=0, match=None, count=None, _type=None):
        """
        Incrementally return lists of key names. Also return a cursor
        indicating the scan position.

        ``match`` allows for filtering the keys by pattern

        ``count`` provides a hint to Redis about the number of keys to
            return per batch.

        ``_type`` filters the returned values by a particular Redis type.
            Stock Redis instances allow for the following types:
            HASH, LIST, SET, STREAM, STRING, ZSET
            Additionally, Redis modules can expose other types as well.
        """
        pieces = [cursor]
        if match is not None:
            pieces.extend([b'MATCH', match])
        if count is not None:
            pieces.extend([b'COUNT', count])
        if _type is not None:
            pieces.extend([b'TYPE', _type])
        return self.execute_command('SCAN', *pieces)

3.3 优化代码

经过上述排查和分析,代码改动非常简单,只需要设置一下scan的参数即可,如下:

        cursor, data = redis.scan(cursor=cursor, match=prefix + '*', count=10000)

四、总结

4.1 当你用了scan说明你用到了redis的相对较高级的场景了,同时你也可能会踩到本文中的坑

4.2 针对不了解的api或者方法,用之前要先了解下方法注释或者说明,最后百度下也行。

五、参考

https://blog.csdn.net/weixin_44799217/article/details/128695238


原文始发于微信公众号(神帅的架构实战):Redis Scan使用问题记录

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/289795.html

(0)
葫芦侠五楼的头像葫芦侠五楼

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!