【redis】渐进式遍历(scan)和数据库数据库管理

发布于:2025-03-21 ⋅ 阅读:(15) ⋅ 点赞:(0)

概念

keys 可以一次性的把 redis 中所有的 key 都获取到

  • 比较危险,可能一下得到太多 key,从而堵塞 redis 服务器(无暇处理其他命令)

通过“渐进式遍历”,就可以做到,既能够获取到所有的 key,同时又不会卡死服务器

  • 不是一个命令,把所有的 key 都拿到
  • 而是每执行一次命令,只获取到其中一小部分。这样的话就能保证当前这一次操作不会太卡
  • 要想得到所有的 key 就需要多次便利,多次执行渐进式遍历命令

SCAN

渐进式遍历是一组命令,这一组命令的使用方法是一样的,其中代表的命令:scanimage.png

  • 此处涉及到关键概念:光标(cursor),就指向了当前遍历的位置
    • 光标设置成 0 了,就代表这次遍历是从头开始
    • 返回值的前半部分,是告诉你,下次继续遍历,光标要从哪里开始
    • cursor 不能理解成“下标”,不是一个连续递增的整数!仅仅就是一个“字符串”。光标这个概念,程序员/客户端是不认识的,只有 redis 服务器知道这个光标对应的位置

语法:

SCAN cursor [MATCH pattern] [COUNT count] [TYPE type]
  • [MATCH pattern] 和前面的 keys 命令是一样的
  • [COUNT count]:限制这一次遍历能够获取到多少元素,默认是 10
    • 此处的 countMySQL 里面的 limit 不一样。
    • limit 是精确的;此处的 count 只是给 redis 服务器一个“提示/建议”,写入的 count 和实际返回的 key 的个数不一定是完全相同的,但是不会差太多
  • [TYPE type]redis 里面的 key 都是 string,但是 value 的类型不一样,这里可以指定想获取的 key 类型

  • scan 指到 0 了,就代表遍历完了image.png|369
    image.png|341

  • count 这里的数字,不是每次遍历都得设置成一样

  • 这里的渐进式遍历,在遍历过程中,不会在服务器这边存储任何的状态信息

    • 这里的遍历是随时可以终止的,不会对服务器产生任何副作用
  • 去烧烤店。吃饱了,还没上的菜不想要了,但是已经在烤了,所以退不了
    • 如果想强行取消,此时服务器的状态仍然保留着,此时就会对服务器的运行造成一定影响
  • 去超市。结账,扫了一半后面的东西不想要了,可以直接走,不影响
    • redis 的服务器不保留任何状态,遍历是可以随时中断的

渐进式遍历 scan 虽然解决了阻塞的问题,但如果在遍历期间键有所变化(增加、修改、删除),可能导致遍历时键的重复遍历或者遗漏,这点务必在实际开发中考虑

  • 不仅仅是 redis ,遍历其他内容的时候,也是比较忌讳一边遍历一边修改的

数据库管理

MySQL 中有一个重要的概念—— database

  • 一个 MySQL 服务器上可以有很多歌 database
  • 一个 database 上可以有很多表

其实在 redis 中,也是有 database 这样的概念的,只不过不想 MySQL 那样随意

  • redis 中的 database 是现成的。我们用户不能创建新的数据库,也不能删除已有的数据库
  • 默认 redis 给我们提供了 16 个数据库(0-15),这 16 个数据库是相互隔离的,相互之间不会有影响(默认情况使用的数据库就是 0 号)

更改数据库——select

select dbIndex

image.png

不过我们实际使用 Redis 很少会关注到数据库,一般都是默认就用 0 号就可以了

获取数据库中 key 个数——DBSIZE

image.png

flushdb/flushall

  • flushdb:删除当前库的所有 key
  • flushall:删除所有库的所有 key