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

 

posted @   thep0st  阅读(32)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
点击右上角即可分享
微信分享提示