redis集群中大key处理
1.
1.海量的数据里面怎么查询某一个固定前缀的key Redis SCAN 命令及其相关命令 SSCAN、HSCAN、 ZSCAN 命令都是用于增量遍历集合中的元素。 SCAN 用于遍历当前数据库中的键。 SSCAN 用于遍历集合键中的元素。 HSCAN 用于遍历哈希键中的键值对。 ZSCAN 用于遍历有序集合中的元素(包括元素成员和元素分值)。 scan非常特别,他不是从第一维数组的第0位一直遍历到末尾,而是采用了高位进位加法来遍历。之所以使用这样特殊的当时进行遍历,是考虑到字典的扩容和缩容时避免槽位的遍历重复和遗漏。 2.生产上如何限制keys */flush db/flush all等命令 # rename-commnds可以禁止这些命令的执行。 3.memory usage命令用过么 4.多大算big,如何发现,如何处理,如何删除 string类型控制在10Kb以内,hash。 eg: 最大512MB,超过10kb就是大key。 非字符串: eg: hash。list,set,zset元素个数不要超过5000. 非字符串的bigkey,不要使用del删除,使用hscan,sscan,zscan方式删除 同时要注意防止bigkey过期时间自动删除问题 eg: 一个200w的zset设置一小时过期时间,会出得del操作,造成阻塞,而且该操作不会出现慢查询中。 危害: 内存不均,集群迁移困难。 大key删除,会阻塞redis。 查询时会有网络抖动。 如何产生: 1.xxx粉丝列表,粉丝逐步递增。 2.xxx报表,逐年累月的累计。 如何发现大key: 1.redis-cli -h dba-test-single-002.3nhnxl.0001.apne1.cache.amazonaws.com --bigkeys -i 0.1 # 不能查询大于10bk的所有key,最好在从节点使用。 2.memory usage keys 命令给出一个 key 和它的值在 RAM 中所占用的字节数。 返回的结果是 key 的值以及为管理该 key 分配的内存总字节数。 如何删除大key: 如果一下子释放大量的内存,空闲内存块链表操作时间会增加,相应地就会造成Redis主线程阻塞,如果redis主线程发生了阻塞其他客户端的请求可能会超时,如果超时的连接越来越多会造成各自异常问题。 渐进式删除 # 大key逐步拆解,一点一点删,直到没有。 list: 使用ltrim渐进式逐步删除,直到全部删除完成 set: 使用sscan每次获取部分元素,在使用srem命令删除每个元素 zset: 使用zscan每次获取部分元素,在使用zremrangebyrank命令删除每个元素 hash:使用hscan每次获取少量field-value,再使用hdel删除每个field。 # hscan + hdel删除 字符串:一般用del或者unlink 异步删除(unlink) # 对于string类型可以使用del也可以使用unlink unlink命令是Redis提供的另一种删除键的命令。它的语法与del命令类似: UNLINK key [key ...] 其中,key是要删除的键名。可以指定多个键名,删除多个键。如果指定的键不存在,则会被忽略。 del: del命令是一种同步删除命令,会阻塞客户端,直到所有指定的键都被删除为止。而unlink命令是一种异步删除命令,会立即返回,不会阻塞客户端。 del命令返回被删除键的数量,而unlink命令不会返回被删除键的数量。这是因为unlink命令是异步执行的,Redis无法立即知道已经删除的键的数量。 5.bigkey做过调优么? 惰性释放lazyfree了解过么 redis.conf配置文件LAZY FREEING相关说明:阻塞和非阻塞删除命令 Redis 有两个原语来删除键。一种称为 DEL,是对象的阻塞删除这意味着服务器停止处理新命令,以便以同步方式回收与对象关联的所有内存。如果删除的键与一个小对象相关联,则执行 DEL 命令所需的时间非常短,可与大多数其他命令相媲美Redis 中的 0(1)或 o(log_N) 命令。 但是,如果键与包含数百万个元素的聚合值相关联,则服务器可能会阻塞很长时间(甚至几秒钟) 才能完成操作。 基于上述原因,Redis 还提供了非阻塞删除原语,例如 UNLINK (非阻塞 DEL) 以及 FLUSHALL和 FLUSHDB 命令的 ASYNC 选项,以便在后台回收内存。 这些命令在恒定时间内执行。另一个线程将尽可能快地逐步释放后台中的对象。 FLUSHALL和 FLUSHDB 的 DEL、UNLINK 和 ASYNC 选项是用户控制的。这取决于应用程序的设计,以了解何时使用其中一个是个好主意。然而,作为其他操作的副作用,Redis 服务器有时不得不删除键或刷新整个数据库。 具体而言,Redis 在以下场景中独立于用户调用删除对象。 优化配置: 我们可以将配置文件当中的这些参数设置为yes,也就是懒释放 lazyfree-lazy-server-del,lazyfree-lazy-user-del,lazyfree-lazy-flush 都设置为yes # 对于大key的删除处理都会采用非阻塞的。 6.morekey问题,生产上redis数据库有1000w记录,如何遍历,keys * ? scan 0 match xx* count 10
pass
上帝说要有光,于是便有了光;上帝说要有女人,于是便有了女人!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!