springboot-整合redis时使用JedisConnectionFactory 提示该错误,以添加redis.clients 版本为 2.9.0和spring-boot-starter-data-redis 版本为 2.5.14
Parameter 0 of method redisTemplate in com.ruoyi.framework.config.RedisConfig required a bean of type 'org.springframework.data.redis.connection.jedis.JedisConnectionFactory' that could not be found.
The injection point has the following annotations:
org.springframework.beans.factory.annotation.Autowired(required=true)
Consider defining a bean of type 'org.springframework.data.redis.connection.jedis.JedisConnectionFactory' in your configuration.
@Configuration
@EnableCaching
public class RedisConfig extends CachingConfigurerSupport
{
@Bean
public RedisTemplate<Serializable, Serializable> redisTemplate(
JedisConnectionFactory connectionFactory)
{
RedisTemplate<Serializable, Serializable> template = new RedisTemplate<>();
template.setConnectionFactory(connectionFactory);
FastJson2JsonRedisSerializer serializer = new FastJson2JsonRedisSerializer(Object.class);
// 使用StringRedisSerializer来序列化和反序列化redis的key值
template.setKeySerializer(new StringRedisSerializer());
template.setValueSerializer(serializer);
// Hash的key也采用StringRedisSerializer的序列化方式
template.setHashKeySerializer(new StringRedisSerializer());
template.setHashValueSerializer(serializer);
template.afterPropertiesSet();
return template;
}
@Bean
public DefaultRedisScript<Long> limitScript()
{
DefaultRedisScript<Long> redisScript = new DefaultRedisScript<>();
redisScript.setScriptText(limitScriptText());
redisScript.setResultType(Long.class);
return redisScript;
}
/**
* 限流脚本
*/
private String limitScriptText()
{
return "local key = KEYS[1]\n" +
"local count = tonumber(ARGV[1])\n" +
"local time = tonumber(ARGV[2])\n" +
"local current = redis.call('get', key);\n" +
"if current and tonumber(current) > count then\n" +
" return tonumber(current);\n" +
"end\n" +
"current = redis.call('incr', key)\n" +
"if tonumber(current) == 1 then\n" +
" redis.call('expire', key, time)\n" +
"end\n" +
"return tonumber(current);";
}
}
这是我的redisConfig的代码
该回答通过自己思路及引用到GPTᴼᴾᴱᴺᴬᴵ搜索,得到内容具体如下:
根据您提供的错误信息,可以看出Spring Boot应用在注入RedisTemplate
时无法找到名为JedisConnectionFactory
的bean。
这通常是由于Spring Boot版本升级导致的,新版本的Spring Boot不再支持JedisConnectionFactory
,而改为了使用LettuceConnectionFactory
。因此,您需要将代码中的JedisConnectionFactory
替换为LettuceConnectionFactory
,或者在您的配置中提供一个名为JedisConnectionFactory
的bean。
如果您仍然想使用JedisConnectionFactory
,则需要在您的项目中添加jedis
和spring-boot-starter-data-redis
的依赖,并且将应用程序配置中的JedisConnectionFactory
的bean定义为以下方式:
@Bean
public JedisConnectionFactory jedisConnectionFactory() {
RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration("localhost", 6379);
return new JedisConnectionFactory(redisStandaloneConfiguration);
}
请注意,这里的RedisStandaloneConfiguration
应该替换为您的实际Redis服务器配置。
如果以上回答对您有所帮助,点击一下采纳该答案~谢谢
redis starter在 2.x.x 底层使用的客户端是lettuce 不是jedis,如果使用jedis需要导入相关依赖并且配置
默认连接端口:6379
默认连接地址:localhost
需要修改则可以使用JedisConnectionFactory的setPort()方法和setHostName()方法来修改默认的端口和连接地址
根据错误提示缺少一个类型为'org.springframework.data.redis.connection.jedis.JedisConnectionFactory'的bean,可以尝试在RedisConfig中添加一个JedisConnectionFactory的bean,代码如下:
@Bean public JedisConnectionFactory jedisConnectionFactory() { RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration(); redisStandaloneConfiguration.setHostName("localhost"); redisStandaloneConfiguration.setPort(6379); redisStandaloneConfiguration.setDatabase(0);
JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory(redisStandaloneConfiguration);
return jedisConnectionFactory;
}
同时,在RedisTemplate中指定该连接工厂即可,修改后的RedisConfig代码如下:
@Configuration @AutoConfigureAfter(RedisAutoConfiguration.class) public class RedisConfig {
/**
* 配置自定义redisTemplate
*
* @return
*/
@Bean
RedisTemplate<String, Object> redisTemplate(JedisConnectionFactory jedisConnectionFactory) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(jedisConnectionFactory);
//使用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值
Jackson2JsonRedisSerializer serializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper mapper = new ObjectMapper();
mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
mapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
serializer.setObjectMapper(mapper);
template.setValueSerializer(serializer);
//使用StringRedisSerializer来序列化和反序列化redis的key值
template.setKeySerializer(new StringRedisSerializer());
template.setHashKeySerializer(new StringRedisSerializer());
template.setHashValueSerializer(serializer);
template.afterPropertiesSet();
return template;
}
@Bean
public JedisConnectionFactory jedisConnectionFactory() {
RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration();
redisStandaloneConfiguration.setHostName("localhost");
redisStandaloneConfiguration.setPort(6379);
redisStandaloneConfiguration.setDatabase(0);
JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory(redisStandaloneConfiguration);
return jedisConnectionFactory;
}
}