springboot-redis
spring redis 连接
参考bealdung的极简连接
没想到使用redis还需要配置一个redis conneciton factory才行, 在网上都没怎么搜索到官方文档, 配置信息也是2.x版本的, 导致被坑了好久. 最后还是靠bealdung的博客拯救了时间.
Spring Data Redis’s Property-Based Configuration
https://www.baeldung.com/spring-data-redis-properties
最简单的springboot redis连接
@Bean
public RedisTemplate<Long, Book> redisTemplate(RedisConnectionFactory connectionFactory) {
RedisTemplate<Long, Book> template = new RedisTemplate<>();
template.setConnectionFactory(connectionFactory);
// Add some specific configuration here. Key serializers, etc.
return template;
@Autowired
private RedisTemplate<Long, Book> redisTemplate;
public void save(Book book) {
redisTemplate.opsForValue().set(book.getId(), book);
}
public Book findById(Long id) {
return redisTemplate.opsForValue().get(id);
}
注意, springBoot 2.x版本的redis配置前缀为spring.redis, springBoot 3.x的配置前缀为 spring.data.redis. 网上搜到的都是前者, 一直以为哪里配置不对.
for Spring Boot 2.x, redis properties in application.properties file
spring.redis.database=0
spring.redis.host=localhost
spring.redis.port=16379
spring.redis.password=mypass
spring.redis.timeout=60000
For Spring Boot 3.x, we need to set the following properties instead:
spring.data.redis.database=0
spring.data.redis.host=localhost
spring.data.redis.port=16379
spring.data.redis.password=mypass
spring.data.redis.timeout=60000
自行定义redis配置并进行连接
除了使用spring自带的参数配置, 还可以在RedisStandaloneConfiguration里进行配置.
package com.example.demo.middleware;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.RedisStandaloneConfiguration;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
/**
*
* 根据参数自行连接redis
*/
@Configuration
class MyConfig {
@Bean
LettuceConnectionFactory redisConnectionFactory() {
RedisStandaloneConfiguration conf = new RedisStandaloneConfiguration("redis.gee.cool", 12345);
conf.setPassword("fakeit");
return new LettuceConnectionFactory(conf);
}
@Bean
RedisTemplate<String, String> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<String, String> template = new RedisTemplate<>();
template.setConnectionFactory(redisConnectionFactory);
return template;
}
}
spring redis 官方文档
找了好久才发现spring redis的官方说明文档, 但没有足够时间去阅读了, 还是用baeldung的简单.
Spring Data Redis
https://docs.spring.io/spring-data/data-redis/docs/current/reference/html/#redis:setup
- lettus 连接版本
@Configuration
class AppConfig {
@Bean
public LettuceConnectionFactory redisConnectionFactory() {
return new LettuceConnectionFactory(new RedisStandaloneConfiguration("server", 6379));
}
}
- jedis 连接版本
@Configuration
class AppConfig {
@Bean
public JedisConnectionFactory redisConnectionFactory() {
return new JedisConnectionFactory();
}
}
@Configuration
class RedisConfiguration {
@Bean
public JedisConnectionFactory redisConnectionFactory() {
RedisStandaloneConfiguration config = new RedisStandaloneConfiguration("server", 6379);
return new JedisConnectionFactory(config);
}
}
sentinal support
https://docs.spring.io/spring-data/data-redis/docs/current/reference/html/#redis:sentinel
没想到使用哨兵模式的redis集群, 客户端还需要额外的配置才能连接, 难怪有些redis客户端不支持
For dealing with high-availability Redis, Spring Data Redis has support for Redis Sentinel, using RedisSentinelConfiguration, as shown in the following example:
/**
* Lettuce
*/
@Bean
public RedisConnectionFactory lettuceConnectionFactory() {
RedisSentinelConfiguration sentinelConfig = new RedisSentinelConfiguration()
.master("mymaster")
.sentinel("127.0.0.1", 26379)
.sentinel("127.0.0.1", 26380);
return new LettuceConnectionFactory(sentinelConfig);
}
/**
* Jedis
*/
@Bean
public RedisConnectionFactory jedisConnectionFactory() {
RedisSentinelConfiguration sentinelConfig = new RedisSentinelConfiguration()
.master("mymaster")
.sentinel("127.0.0.1", 26379)
.sentinel("127.0.0.1", 26380);
return new JedisConnectionFactory(sentinelConfig);
}
RedisSentinelConfiguration can also be defined with a PropertySource, which lets you set the following properties:
Configuration Properties
- spring.redis.sentinel.master: name of the master node.
- spring.redis.sentinel.nodes: Comma delimited list of host:port pairs.
- spring.redis.sentinel.username: The username to apply when authenticating with Redis Sentinel (requires Redis 6)
- spring.redis.sentinel.password: The password to apply when authenticating with Redis Sentinel
redisTemplate的使用说明
https://docs.spring.io/spring-data/data-redis/docs/current/reference/html/#redis:template
@Configuration
class MyConfig {
@Bean
LettuceConnectionFactory redisConnectionFactory() {
return new LettuceConnectionFactory();
}
@Bean
RedisTemplate<String, String> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<String, String> template = new RedisTemplate<>();
template.setConnectionFactory(redisConnectionFactory);
return template;
}
}
public class Example {
// inject the actual template
@Autowired
private RedisTemplate<String, String> template;
// inject the template as ListOperations
@Resource(name="redisTemplate")
private ListOperations<String, String> listOps;
public void addLink(String userId, URL url) {
listOps.leftPush(userId, url.toExternalForm());
}
}