spring-boot - 为什么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 命令。为什么春天的团队不这样做。
解决方案
此功能在当前发布的版本 ( 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。