首页 > 解决方案 > 为什么Spring-data-redis在缓存驱逐时使用keys命令

问题描述

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

byte[][] keys = Optional.ofNullable(connection.keys(pattern)).orElse(Collections.emptySet())
                    .toArray(new byte[0][]);

Redis 建议将 keys 命令替换为 scan 命令。为什么春天的团队不这样做。

标签: spring-bootredisspring-data-redis

解决方案


此功能在当前发布的版本 ( 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())

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

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


推荐阅读