0%

命令

Redis 命令

1. scan

1
SCAN cursor [MATCH pattern] [COUNT count]

参考网址

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

scan cursor 命令相当于从各个节点随机去拿数据,迭代并不保证每一次都返回相同数量的元素,甚至可能返回 0 个元素,同一个元素可能会被返回多次,通过返回的游标来看,只要返回的游标不是 0,迭代就没有结束。

count 默认是 10,设置多少并不能保证一定返回多少,对于大量集合来说,通常返回数据量和 count 一致,或稍微多于 count

2. hgetall

画像获取多个标签值的时候,如果用 pipeline 一个个取,可能会堵塞管道;如果用 hgetall,底层会一个个 key 遍历,如果 redis 里保存了特别多的 field,那么就会消耗大量时间去获取其他的无用的标签。

优化方式:使用 dump 指令

3. expire

需求:把 redis1 的数据迁移到 redis2 的数据,redis1 里的 key 有过期时间,需要同时将过期时间同步过来

过程:

a. 通过 scanParam 批量获取key

b. 通过 ttl 来获取key 的过期时间

c. 写 key 的时候同时去把 ttl 时间也设置上

问题:有很多 key 没有写入

原因:expire(int) 指令参数只能是 大于0 的整数值,如果是 0 或者负数,会自动过期,不会写入到 redis

我们在软件看到的那个 过期时间 = -1 是 redis 自己给 key 打上的,我们不能打这个-1

参考资料 https://blog.csdn.net/wojiuguowei/article/details/85096609

如果 key 的大小在一定范围内,unlink 和 del 可以理解为一样的,是同步删除

如果 key 比较大,用 unlink 会好很多,会启动一个异步线程删除,不会堵塞 redis

删除的话是一样的,是遍历整个 key 的集合来删除,如果是 string 的话就是单纯的删除