跳到主要内容

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());
}
}