redis的使用(四)spring boot 整合redis单机版

本次记录spring boot 整合redis的配置

1. 引入redis和jedis依赖包

    <!-- redis依赖和jedis -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
</dependency>

2. 环境配置

applicaltion.yml

# redis配置
redis:
  host: XX.XX.XX.XX
  port: XXXX
  database: 0 #数据库索引
  timeout: 60000 #连接超时
  password: XXXXXXX #口令
  pool: 
    maxActive: 300 #最大连接数
    maxWait: -1 #最大等待时间
    maxIdle: 30
    minIdle: 10
    testOnBorrow: true #连接时检查
    testWhileIdle: true #空闲时检查

3. config配置

import java.time.Duration;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.jedis.JedisClientConfiguration;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;

import redis.clients.jedis.JedisPoolConfig;

/**
 * @Title: redis配置
 * @Description:
 * @author zch
 * @date 2019年6月26日 下午2:50:28
 */
@Configuration
@EnableCaching
@EnableAutoConfiguration
public class RedisConfiguration
{
    // redis地址ip 
	@Value("${redis.host}")
	private String host;
    // 端口
	@Value("${redis.port}")
	private int port;
	// redis口令
	@Value("${redis.password}")
	private String password;
	// 索引
	@Value("${redis.database}")
	private int database;
	// 连接超时
	@Value("${redis.timeout}")
	private int timeout;
	// 最大 连接数
	@Value("${redis.pool.maxActive}")
	private int maxActive;
	// 最大等待时间
	@Value("${redis.pool.maxWait}")
	private long maxWait;
	// 最大空闲连接数
	@Value("${redis.pool.maxIdle}")
	private int maxIdle;
	// 最小空闲连接数
	@Value("${redis.pool.minIdle}")
	private int minIdle;
    // 连接时测试
	@Value("${redis.pool.testOnBorrow}")
	private boolean testOnBorrow;
    // 空闲时测试
	@Value("${redis.pool.testWhileIdle}")
	private boolean testWhileIdle;

	/**
	 * @Title: 连接池
	 * @Description:
	 * @author zch
	 * @date 2019年6月26日 下午3:22:40
	 */
	@Bean
	public JedisPoolConfig jedisPoolConfig()
	{
		JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
		jedisPoolConfig.setMaxIdle(maxIdle);
		jedisPoolConfig.setMaxTotal(maxActive);
		jedisPoolConfig.setMaxWaitMillis(maxWait);
		jedisPoolConfig.setMinIdle(minIdle);
		jedisPoolConfig.setTestOnBorrow(testOnBorrow);
		jedisPoolConfig.setTestWhileIdle(testWhileIdle);
		return jedisPoolConfig;
	}

	/**
	 * @Title: 连接工厂
	 * @Description:
	 * @author zch
	 * @date 2019年6月26日 下午2:51:38
	 */
	@SuppressWarnings("deprecation")
	@Bean
	public JedisConnectionFactory jedisConnectionFactory(JedisPoolConfig jedisPoolConfig)
	{
		JedisClientConfiguration.JedisClientConfigurationBuilder jedisClientConfigurationBuilder = JedisClientConfiguration
				.builder();
		jedisClientConfigurationBuilder.readTimeout(Duration.ofMillis(timeout));// 读取超时单位毫秒
		JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory();
		jedisConnectionFactory.setDatabase(database);
		jedisConnectionFactory.setHostName(host);
		jedisConnectionFactory.setPassword(password);
		jedisConnectionFactory.setPort(port);
		jedisConnectionFactory.setPoolConfig(jedisPoolConfig);

		return jedisConnectionFactory;
	}

	/**
	 * @Title: 对象操作
	 * @Description: 操作对象类型数据
	 * @author zch
	 * @date 2019年6月26日 下午2:51:55
	 */
	@Bean
	public RedisTemplate<String, Object> redisTemplate(JedisConnectionFactory jedisConnectionFactory)
	{
		RedisTemplate<String, Object> template = new RedisTemplate<String, Object>();
		RedisSerializer<String> redisSerializer = new StringRedisSerializer();
		Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<Object>(
				Object.class);
		ObjectMapper om = new ObjectMapper();
		om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
		om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
		jackson2JsonRedisSerializer.setObjectMapper(om);
		template.setConnectionFactory(jedisConnectionFactory);
		// key序列化方式
		template.setKeySerializer(redisSerializer);
		// value序列化
		template.setValueSerializer(jackson2JsonRedisSerializer);
		// value hashmap序列化
		template.setHashValueSerializer(jackson2JsonRedisSerializer);
		// 自行百度查找更完善的序列化设置
        return template;

	}

	/**
	 * @Title: 字符串操作
	 * @Description: 操作字符串类型数据
	 * @author zch
	 * @date 2019年6月26日 下午2:52:09
	 */
	@Bean
	public StringRedisTemplate stringRedisTemplate(JedisConnectionFactory jedisConnectionFactory)
	{
		StringRedisTemplate stringRedisTemplate = new StringRedisTemplate();
		stringRedisTemplate.setConnectionFactory(jedisConnectionFactory);
		return stringRedisTemplate;
	}

}

4. 使用RedisTemplate和StringRedisTemplate进行操作

注入使用

RedisTemplate对5种数据结构的操作
redisTemplate.opsForValue();  //操作字符串
redisTemplate.opsForHash();   //操作hash
redisTemplate.opsForList();   //操作list
redisTemplate.opsForSet();    //操作set
redisTemplate.opsForZSet();   //操作有序set

stringRedisTemplate.opsForValue().set("test", "100",60*10,TimeUnit.SECONDS);//向redis里存入数据和设置缓存时间  
stringRedisTemplate.boundValueOps("test").increment(-1);//val做-1操作
stringRedisTemplate.opsForValue().get("test")//根据key获取缓存中的val
stringRedisTemplate.boundValueOps("test").increment(1);//val +1
stringRedisTemplate.getExpire("test")//根据key获取过期时间
stringRedisTemplate.getExpire("test",TimeUnit.SECONDS)//根据key获取过期时间并换算成指定单位 
stringRedisTemplate.delete("test");//根据key删除缓存
stringRedisTemplate.hasKey("546545");//检查key是否存在,返回boolean值 
stringRedisTemplate.opsForSet().add("red_123", "1","2","3");//向指定key中存放set集合
stringRedisTemplate.expire("red_123",1000 , TimeUnit.MILLISECONDS);//设置过期时间
stringRedisTemplate.opsForSet().isMember("red_123", "1")//根据key查看集合中是否存在指定数据
stringRedisTemplate.opsForSet().members("red_123");//根据key获取set集合

补充:

应业务场景要求,配置多数据库的redis

使用@Bean( name = "xxxx")区分多个RedisTemplate

    @Bean(name = "xxxxRedisTemplate")
	public RedisTemplate<String, Object> dataRedisTemplate(JedisPoolConfig jedisPoolConfig)
	{
		JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory();
		jedisConnectionFactory.setDatabase(database);
		jedisConnectionFactory.setHostName(host);
		jedisConnectionFactory.setPassword(password);
		jedisConnectionFactory.setPort(port);
		jedisConnectionFactory.setTimeout(timeout);
		jedisConnectionFactory.setPoolConfig(jedisPoolConfig);
		RedisTemplate<String, Object> template = new RedisTemplate<String, Object>();
		RedisSerializer<String> redisSerializer = new StringRedisSerializer();
		Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<Object>(
				Object.class);
		ObjectMapper om = new ObjectMapper();
		om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
		om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
		jackson2JsonRedisSerializer.setObjectMapper(om);
		template.setConnectionFactory(jedisConnectionFactory);
		// key序列化方式
		template.setKeySerializer(redisSerializer);
		// value序列化
		template.setValueSerializer(jackson2JsonRedisSerializer);
		// value hashmap序列化
		template.setHashValueSerializer(jackson2JsonRedisSerializer);
		return template;

	}
发布了73 篇原创文章 · 获赞 44 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/qq_34928194/article/details/93747110