为什么Spring-data-redis在缓存驱逐时使用keys命令

hon*_*wei 5 redis spring-data-redis spring-boot

当我使用springboot时,我使用redis作为我的缓存服务器。但是我读了 spring-data-redis 源代码,当逐出缓存时,代码是

byte[][] keys = Optional.ofNullable(connection.keys(pattern)).orElse(Collections.emptySet())
                    .toArray(new byte[0][]);
Run Code Online (Sandbox Code Playgroud)

Redis 建议将keys 命令替换为scan 命令。为什么Spring团队不这样做呢?

Ale*_*sov 1

此功能在当前发布的版本 ( 2.5.5 ) 中不可用,很可能会包含在下一版本 ( 2.6.* )中

缓存实现默认使用KEYS和DEL来清除缓存。KEYS 可能会导致较大密钥空间的性能问题。因此,可以使用 BatchStrategy 创建默认的 RedisCacheWriter 以切换到基于 SCAN 的批处理策略。SCAN 策略需要批量大小以避免过多的 Redis 命令往返:

RedisCacheManager cm = RedisCacheManager.build(RedisCacheWriter.nonLockingRedisCacheWriter(
  connectionFactory, 
  BatchStrategies.scan(1000))
).cacheDefaults(defaultCacheConfig())
Run Code Online (Sandbox Code Playgroud)

注意:使用任何驱动程序和 Redis 操作模式(独立、集群)完全支持 KEYS 批处理策略。使用 Lettuce 驱动程序时完全支持 SCAN。Jedis仅在非集群模式下支持SCAN。

https://github.com/spring-projects/spring-data-redis/blob/main/src/main/asciidoc/reference/redis-cache.adoc