SpringBoot配置多个redis实战

一、背景

如果业务需要一个应用链接不同的redis,就不能用SpringBoot的默认配置了,以下是SpringBoot配置多个redis实战教程,有需要的同学可以作为参考。

二、相关配置

1.整体的相关目录结构 

 2.pom.xml 依赖添加redis及jedis依赖
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-redis</artifactId>
			<exclusions>
				<exclusion>
					<groupId>io.lettuce</groupId>
					<artifactId>lettuce-core</artifactId>
				</exclusion>
			</exclusions>
		</dependency>
		<dependency>
			<groupId>redis.clients</groupId>
			<artifactId>jedis</artifactId>
		</dependency>
		<!-- spring2.X集成redis所需common-pool2-->
		<dependency>
			<groupId>org.apache.commons</groupId>
			<artifactId>commons-pool2</artifactId>
			<version>2.6.0</version>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
3.application.yam配置
spring:
  redis:
    redis-user:
      host: 127.0.0.1
      port: 6379
      password:
      timeout: 10000
      jedis:
        pool:
          max-idle: 8
          min-idle: 10
          max-active: 100
          max-wait: -1
    redis-order:
      host: 127.0.0.1
      port: 7777
      password:
      timeout: 10000
      jedis:
        pool:
          max-idle: 8
          min-idle: 10
          max-active: 100
          max-wait: -1
4.redis配置加载类

 RedisConfigOrder.java

package com.spell.config.redis;

import java.net.UnknownHostException;

import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.RedisStandaloneConfiguration;
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.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

import redis.clients.jedis.JedisPoolConfig;

@Configuration
public class RedisConfigOrder {

	@Value("${spring.redis.redis-order.host}")
	private String host;

	@Value("${spring.redis.redis-order.port}")
	private Integer port;

	@Primary
	@Bean(name = "jedisPoolConfigOrder")
	@ConfigurationProperties(prefix = "spring.redis.redis-order.jedis.pool")
	public JedisPoolConfig jedisPoolConfig() {
		JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
		jedisPoolConfig.setMaxWaitMillis(10000);
		return jedisPoolConfig;
	}

	@Bean("redisConnectionFactoryOrder")
	public RedisConnectionFactory redisConnectionFactory(
			@Qualifier("jedisPoolConfigOrder") JedisPoolConfig jedisPoolConfig) {
		RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration();
		redisStandaloneConfiguration.setHostName(host);
		// redisStandaloneConfiguration.setPassword(pwd);
		redisStandaloneConfiguration.setPort(port);
		JedisClientConfiguration.JedisPoolingClientConfigurationBuilder jpcb = (JedisClientConfiguration.JedisPoolingClientConfigurationBuilder) JedisClientConfiguration
				.builder();
		jpcb.poolConfig(jedisPoolConfig);
		JedisClientConfiguration jedisClientConfiguration = jpcb.build();
		return new JedisConnectionFactory(redisStandaloneConfiguration, jedisClientConfiguration);
	}

	/**
	 * @name: redisTemplate
	 * @description: RedisTemplate
	 * @param redisConnectionFactory
	 * @return: org.springframework.data.redis.core.RedisTemplate<java.lang.String,java.lang.Object>
	 * @date: 2020-12-04 13:19
	 *
	 */
	@Bean("redisTemplateOrder")
	public RedisTemplate<String, Object> redisTemplate(
			@Qualifier("redisConnectionFactoryOrder") RedisConnectionFactory redisConnectionFactory)
			throws UnknownHostException {
		RedisTemplate<String, Object> redisTemplate = new RedisTemplate();
		redisTemplate.setConnectionFactory(redisConnectionFactory);
		Jackson2JsonRedisSerializer<Object> serializer = new Jackson2JsonRedisSerializer(Object.class);
		// 设置键(key)的序列化
		redisTemplate.setKeySerializer(new StringRedisSerializer());
		// 设置value序列化
		redisTemplate.setValueSerializer(serializer);
		// 设置HashKey序列化 为啥要hashkey
		redisTemplate.setHashKeySerializer(new StringRedisSerializer());
		// 设置HashValue序列化
		redisTemplate.setHashValueSerializer(serializer);
		// 默认序列化
		redisTemplate.setDefaultSerializer(new StringRedisSerializer());
		return redisTemplate;

	}
}

RedisConfigUser.java

package com.spell.config.redis;

import java.net.UnknownHostException;

import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.RedisStandaloneConfiguration;
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.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

import redis.clients.jedis.JedisPoolConfig;

@Configuration
public class RedisConfigUser {

	@Value("${spring.redis.redis-user.host}")
	private String host;

	@Value("${spring.redis.redis-user.port}")
	private Integer port;

	@Primary
	@Bean(name = "jedisPoolConfigUser")
	@ConfigurationProperties(prefix = "spring.redis.redis-user.jedis.pool")
	public JedisPoolConfig jedisPoolConfig() {
		JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
		jedisPoolConfig.setMaxWaitMillis(10000);
		return jedisPoolConfig;
	}

	@Bean("redisConnectionFactoryUser")
	public RedisConnectionFactory redisConnectionFactory(
			@Qualifier("jedisPoolConfigUser") JedisPoolConfig jedisPoolConfig) {
		RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration();
		redisStandaloneConfiguration.setHostName(host);
		// redisStandaloneConfiguration.setPassword(pwd);
		redisStandaloneConfiguration.setPort(port);
		JedisClientConfiguration.JedisPoolingClientConfigurationBuilder jpcb = (JedisClientConfiguration.JedisPoolingClientConfigurationBuilder) JedisClientConfiguration
				.builder();
		jpcb.poolConfig(jedisPoolConfig);
		JedisClientConfiguration jedisClientConfiguration = jpcb.build();
		return new JedisConnectionFactory(redisStandaloneConfiguration, jedisClientConfiguration);
	}

	/**
	 * @name: redisTemplate
	 * @description: RedisTemplate
	 * @param redisConnectionFactory
	 * @return: org.springframework.data.redis.core.RedisTemplate<java.lang.String,java.lang.Object>
	 * @date: 2020-12-04 13:19
	 *
	 */
	@Bean("redisTemplateUser")
	public RedisTemplate<String, Object> redisTemplate(
			@Qualifier("redisConnectionFactoryUser") RedisConnectionFactory redisConnectionFactory)
			throws UnknownHostException {
		RedisTemplate<String, Object> redisTemplate = new RedisTemplate();
		redisTemplate.setConnectionFactory(redisConnectionFactory);
		Jackson2JsonRedisSerializer<Object> serializer = new Jackson2JsonRedisSerializer(Object.class);
		// 设置键(key)的序列化
		redisTemplate.setKeySerializer(new StringRedisSerializer());
		// 设置value序列化
		redisTemplate.setValueSerializer(serializer);
		// 设置HashKey序列化 为啥要hashkey
		redisTemplate.setHashKeySerializer(new StringRedisSerializer());
		// 设置HashValue序列化
		redisTemplate.setHashValueSerializer(serializer);
		// 默认序列化
		redisTemplate.setDefaultSerializer(new StringRedisSerializer());
		return redisTemplate;

	}
}
5.redis操作做下简单封装

RedisOrderUtil和RedisUserUtil都比较类似,  关键是上面配置的RedisTemplate被注入正确即可,例如:

 @Qualifier("redisTemplateOrder")
    private RedisTemplate redisTemplateUser;

/**
 * 
 */
package com.spell.redis;

import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

/**
 * @className: RedisUtil
 * @description:
 * @date: 2022-03-09 14:07
 */
@Component
public class RedisOrderUtil {

	@Autowired
	@Qualifier("redisTemplateOrder")
	private RedisTemplate redisTemplateUser;
	
	/**
	 * 给一个指定的 key 值附加过期时间
	 *
	 * @param key
	 * @param time
	 * @return
	 */
	public boolean expire(String key, long time) {
		return redisTemplateUser.expire(key, time, TimeUnit.SECONDS);
	}

	/**
	 * 根据key 获取过期时间
	 *
	 * @param key
	 * @return
	 */
	public long getTime(String key) {
		return redisTemplateUser.getExpire(key, TimeUnit.SECONDS);
	}

	/**
	 * 根据key 获取过期时间
	 *
	 * @param key
	 * @return
	 */
	public boolean hasKey(String key) {
		return redisTemplateUser.hasKey(key);
	}

	/**
	 * 移除指定key 的过期时间
	 *
	 * @param key
	 * @return
	 */
	public boolean persist(String key) {
		return redisTemplateUser.boundValueOps(key).persist();
	}

	// - - - - - - - - - - - - - - - - - - - - - String类型 - - - - - - - - - - - - -
	// - - - - - - -

	/**
	 * 根据key获取值
	 *
	 * @param key 键
	 * @return 值
	 */
	public Object get(String key) {
		return key == null ? null : redisTemplateUser.opsForValue().get(key);
	}

	/**
	 * 将值放入缓存
	 *
	 * @param key   键
	 * @param value 值
	 * @return true成功 false 失败
	 */
	public void set(String key, String value) {
		redisTemplateUser.opsForValue().set(key, value);
	}

	/**
	 * 设置Long数值
	 * 
	 * @param key
	 * @param value
	 */
	public void set(String key, Long value) {
		redisTemplateUser.opsForValue().set(key, value);
	}

	/**
	 * 设置Integer数值
	 * 
	 * @param key
	 * @param value
	 */
	public void set(String key, Integer value) {
		redisTemplateUser.opsForValue().set(key, value);
	}

	/**
	 * 将值放入缓存并设置时间
	 *
	 * @param key   键
	 * @param value 值
	 * @param time  时间(秒) -1为无期限, 过期时间单位为秒
	 * @return true成功 false 失败
	 */
	public void set(String key, String value, long time) {
		if (time > 0) {
			redisTemplateUser.opsForValue().set(key, value, time, TimeUnit.SECONDS);
		} else {
			redisTemplateUser.opsForValue().set(key, value);
		}
	}

	/**
	 * 批量添加 key (重复的键会覆盖)
	 *
	 * @param keyAndValue
	 */
	public void batchSet(Map<String, String> keyAndValue) {
		redisTemplateUser.opsForValue().multiSet(keyAndValue);
	}

	/**
	 * 批量添加 key-value 只有在键不存在时,才添加 map 中只要有一个key存在,则全部不添加
	 *
	 * @param keyAndValue
	 */
	public void batchSetIfAbsent(Map<String, String> keyAndValue) {
		redisTemplateUser.opsForValue().multiSetIfAbsent(keyAndValue);
	}

	/**
	 * 对一个 key-value 的值进行加减操作, 如果该 key 不存在 将创建一个key 并赋值该 number 如果 key 存在,但 value
	 * 不是长整型 ,将报错
	 *
	 * @param key
	 * @param number
	 */
	public Long increment(String key, long number) {
		return redisTemplateUser.opsForValue().increment(key, number);

	}

	/**
	 * 减少 number
	 * 
	 * @param key
	 * @param number
	 * @return
	 */
	public Long decrement(String key, long number) {
		Object value = redisTemplateUser.opsForValue().decrement(key, number);
		return Long.valueOf(value.toString());
	}

	/**
	 * 减少1
	 * 
	 * @param key
	 * @return
	 */
	public Long decrement(String key) {
		Object value = redisTemplateUser.opsForValue().decrement(key);
		return Long.valueOf(value.toString());
	}

	/**
	 * 对一个 key-value 的值进行加减操作, 如果该 key 不存在 将创建一个key 并赋值该 number 如果 key 存在,但 value 不是
	 * 纯数字 ,将报错
	 *
	 * @param key
	 * @param number
	 */
	public Double increment(String key, double number) {
		return redisTemplateUser.opsForValue().increment(key, number);
	}

	// - - - - - - - - - - - - - - - - - - - - - set类型 - - - - - - - - - - - - - - -
	// - - - - -

	/**
	 * 将数据放入set缓存
	 *
	 * @param key 键
	 * @return
	 */
	public void sSet(String key, String value) {
		redisTemplateUser.opsForSet().add(key, value);
	}

	/**
	 * 获取变量中的值
	 *
	 * @param key 键
	 * @return
	 */
	public Set<Object> members(String key) {
		return redisTemplateUser.opsForSet().members(key);
	}

	/**
	 * 随机获取变量中指定个数的元素
	 *
	 * @param key   键
	 * @param count 值
	 * @return
	 */
	public void randomMembers(String key, long count) {
		redisTemplateUser.opsForSet().randomMembers(key, count);
	}

	/**
	 * 随机获取变量中的元素
	 *
	 * @param key 键
	 * @return
	 */
	public Object randomMember(String key) {
		return redisTemplateUser.opsForSet().randomMember(key);
	}

	/**
	 * 弹出变量中的元素
	 *
	 * @param key 键
	 * @return
	 */
	public Object pop(String key) {
		return redisTemplateUser.opsForSet().pop("setValue");
	}

	/**
	 * 获取变量中值的长度
	 *
	 * @param key 键
	 * @return
	 */
	public long size(String key) {
		return redisTemplateUser.opsForSet().size(key);
	}

	/**
	 * 根据value从一个set中查询,是否存在
	 *
	 * @param key   键
	 * @param value 值
	 * @return true 存在 false不存在
	 */
	public boolean sHasKey(String key, Object value) {
		return redisTemplateUser.opsForSet().isMember(key, value);
	}

	/**
	 * 检查给定的元素是否在变量中。
	 *
	 * @param key 键
	 * @param obj 元素对象
	 * @return
	 */
	public boolean isMember(String key, Object obj) {
		return redisTemplateUser.opsForSet().isMember(key, obj);
	}

	/**
	 * 转移变量的元素值到目的变量。
	 *
	 * @param key     键
	 * @param value   元素对象
	 * @param destKey 元素对象
	 * @return
	 */
	public boolean move(String key, String value, String destKey) {
		return redisTemplateUser.opsForSet().move(key, value, destKey);
	}

	/**
	 * 批量移除set缓存中元素
	 *
	 * @param key    键
	 * @param values 值
	 * @return
	 */
	public void remove(String key, Object... values) {
		redisTemplateUser.opsForSet().remove(key, values);
	}

	/**
	 * 通过给定的key求2个set变量的差值
	 *
	 * @param key     键
	 * @param destKey 键
	 * @return
	 */
	public Set<Set> difference(String key, String destKey) {
		return redisTemplateUser.opsForSet().difference(key, destKey);
	}

	// - - - - - - - - - - - - - - - - - - - - - hash类型 - - - - - - - - - - - - - -
	// - - - - - -

	/**
	 * 加入缓存
	 *
	 * @param key 键
	 * @param map 键
	 * @return
	 */
	public void add(String key, Map<String, String> map) {
		redisTemplateUser.opsForHash().putAll(key, map);
	}

	/**
	 * 获取 key 下的 所有 hashkey 和 value
	 *
	 * @param key 键
	 * @return
	 */
	public Map<Object, Object> getHashEntries(String key) {
		return redisTemplateUser.opsForHash().entries(key);
	}

	/**
	 * 验证指定 key 下 有没有指定的 hashkey
	 *
	 * @param key
	 * @param hashKey
	 * @return
	 */
	public boolean hashKey(String key, String hashKey) {
		return redisTemplateUser.opsForHash().hasKey(key, hashKey);
	}

	/**
	 * 获取指定key的值string
	 *
	 * @param key  键
	 * @param key2 键
	 * @return
	 */
	public String getMapString(String key, String key2) {
		return redisTemplateUser.opsForHash().get("map1", "key1").toString();
	}

	/**
	 * 获取指定的值Int
	 *
	 * @param key  键
	 * @param key2 键
	 * @return
	 */
	public Integer getMapInt(String key, String key2) {
		return (Integer) redisTemplateUser.opsForHash().get("map1", "key1");
	}

	/**
	 * 弹出元素并删除
	 *
	 * @param key 键
	 * @return
	 */
	public String popValue(String key) {
		return redisTemplateUser.opsForSet().pop(key).toString();
	}

	/**
	 * 删除指定 hash 的 HashKey
	 *
	 * @param key
	 * @param hashKeys
	 * @return 删除成功的 数量
	 */
	public Long deleteHash(String key, String... hashKeys) {
		return redisTemplateUser.opsForHash().delete(key, hashKeys);
	}

	public void del(String key) {
		redisTemplateUser.delete(key);
	}

	/**
	 * 给指定 hash 的 hashkey 做增减操作
	 *
	 * @param key
	 * @param hashKey
	 * @param number
	 * @return
	 */
	public Long increment(String key, String hashKey, long number) {
		return redisTemplateUser.opsForHash().increment(key, hashKey, number);
	}

	/**
	 * 给指定 hash 的 hashkey 做增减操作
	 *
	 * @param key
	 * @param hashKey
	 * @param number
	 * @return
	 */
	public Double increment(String key, String hashKey, Double number) {
		return redisTemplateUser.opsForHash().increment(key, hashKey, number);
	}

	/**
	 * 获取 key 下的 所有 hashkey 字段
	 *
	 * @param key
	 * @return
	 */
	public Set<Object> hashKeys(String key) {
		return redisTemplateUser.opsForHash().keys(key);
	}

	/**
	 * 获取指定 hash 下面的 键值对 数量
	 *
	 * @param key
	 * @return
	 */
	public Long hashSize(String key) {
		return redisTemplateUser.opsForHash().size(key);
	}

	// - - - - - - - - - - - - - - - - - - - - - list类型 - - - - - - - - - - - - - -
	// - - - - - -

	/**
	 * 在变量左边添加元素值
	 *
	 * @param key
	 * @param value
	 * @return
	 */
	public void leftPush(String key, Object value) {
		redisTemplateUser.opsForList().leftPush(key, value);
	}

	/**
	 * 获取集合指定位置的值。
	 *
	 * @param key
	 * @param index
	 * @return
	 */
	public Object index(String key, long index) {
		return redisTemplateUser.opsForList().index("list", 1);
	}

	/**
	 * 获取指定区间的值。
	 *
	 * @param key
	 * @param start
	 * @param end
	 * @return
	 */
	public List<Object> range(String key, long start, long end) {
		return redisTemplateUser.opsForList().range(key, start, end);
	}

	/**
	 * 把最后一个参数值放到指定集合的第一个出现中间参数的前面, 如果中间参数值存在的话。
	 *
	 * @param key
	 * @param pivot
	 * @param value
	 * @return
	 */
	public void leftPush(String key, String pivot, String value) {
		redisTemplateUser.opsForList().leftPush(key, pivot, value);
	}

	/**
	 * 向左边批量添加参数元素。
	 *
	 * @param key
	 * @param values
	 * @return
	 */
	public void leftPushAll(String key, String... values) {
//        redisTemplate.opsForList().leftPushAll(key,"w","x","y");
		redisTemplateUser.opsForList().leftPushAll(key, values);
	}

	/**
	 * 向集合最右边添加元素。
	 *
	 * @param key
	 * @param value
	 * @return
	 */
	public void leftPushAll(String key, String value) {
		redisTemplateUser.opsForList().rightPush(key, value);
	}

	/**
	 * 向左边批量添加参数元素。
	 *
	 * @param key
	 * @param values
	 * @return
	 */
	public void rightPushAll(String key, String... values) {
		// redisTemplate.opsForList().leftPushAll(key,"w","x","y");
		redisTemplateUser.opsForList().rightPushAll(key, values);
	}

	/**
	 * 向已存在的集合中添加元素。
	 *
	 * @param key
	 * @param value
	 * @return
	 */
	public void rightPushIfPresent(String key, Object value) {
		redisTemplateUser.opsForList().rightPushIfPresent(key, value);
	}

	/**
	 * 向已存在的集合中添加元素。
	 *
	 * @param key
	 * @return
	 */
	public long listLength(String key) {
		return redisTemplateUser.opsForList().size(key);
	}

	/**
	 * 移除集合中的左边第一个元素。
	 *
	 * @param key
	 * @return
	 */
	public void leftPop(String key) {
		redisTemplateUser.opsForList().leftPop(key);
	}

	/**
	 * 移除集合中左边的元素在等待的时间里,如果超过等待的时间仍没有元素则退出。
	 *
	 * @param key
	 * @return
	 */
	public void leftPop(String key, long timeout, TimeUnit unit) {
		redisTemplateUser.opsForList().leftPop(key, timeout, unit);
	}

	/**
	 * 移除集合中右边的元素。
	 *
	 * @param key
	 * @return
	 */
	public void rightPop(String key) {
		redisTemplateUser.opsForList().rightPop(key);
	}

	/**
	 * 移除集合中右边的元素在等待的时间里,如果超过等待的时间仍没有元素则退出。
	 *
	 * @param key
	 * @return
	 */
	public void rightPop(String key, long timeout, TimeUnit unit) {
		redisTemplateUser.opsForList().rightPop(key, timeout, unit);
	}

	/**
	 * 复杂操作,可能需要直接拿到redisTemplate进行。
	 * 
	 * @return
	 */
	public RedisTemplate getRedisTemplate() {
		return redisTemplateUser;
	}
}

RedisUserUtil.java 

package com.spell.redis;

import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

/**
 * @className: RedisUtil
 * @description:
 * @date: 2022-03-09 14:07
 */
@Component
public class RedisUserUtil {

	@Autowired
	@Qualifier("redisTemplateUser")
	private RedisTemplate redisTemplateUser;
	
	/**
	 * 给一个指定的 key 值附加过期时间
	 *
	 * @param key
	 * @param time
	 * @return
	 */
	public boolean expire(String key, long time) {
		return redisTemplateUser.expire(key, time, TimeUnit.SECONDS);
	}

	/**
	 * 根据key 获取过期时间
	 *
	 * @param key
	 * @return
	 */
	public long getTime(String key) {
		return redisTemplateUser.getExpire(key, TimeUnit.SECONDS);
	}

	/**
	 * 根据key 获取过期时间
	 *
	 * @param key
	 * @return
	 */
	public boolean hasKey(String key) {
		return redisTemplateUser.hasKey(key);
	}

	/**
	 * 移除指定key 的过期时间
	 *
	 * @param key
	 * @return
	 */
	public boolean persist(String key) {
		return redisTemplateUser.boundValueOps(key).persist();
	}

	// - - - - - - - - - - - - - - - - - - - - - String类型 - - - - - - - - - - - - -
	// - - - - - - -

	/**
	 * 根据key获取值
	 *
	 * @param key 键
	 * @return 值
	 */
	public Object get(String key) {
		return key == null ? null : redisTemplateUser.opsForValue().get(key);
	}

	/**
	 * 将值放入缓存
	 *
	 * @param key   键
	 * @param value 值
	 * @return true成功 false 失败
	 */
	public void set(String key, String value) {
		redisTemplateUser.opsForValue().set(key, value);
	}

	/**
	 * 设置Long数值
	 * 
	 * @param key
	 * @param value
	 */
	public void set(String key, Long value) {
		redisTemplateUser.opsForValue().set(key, value);
	}

	/**
	 * 设置Integer数值
	 * 
	 * @param key
	 * @param value
	 */
	public void set(String key, Integer value) {
		redisTemplateUser.opsForValue().set(key, value);
	}

	/**
	 * 将值放入缓存并设置时间
	 *
	 * @param key   键
	 * @param value 值
	 * @param time  时间(秒) -1为无期限, 过期时间单位为秒
	 * @return true成功 false 失败
	 */
	public void set(String key, String value, long time) {
		if (time > 0) {
			redisTemplateUser.opsForValue().set(key, value, time, TimeUnit.SECONDS);
		} else {
			redisTemplateUser.opsForValue().set(key, value);
		}
	}

	/**
	 * 批量添加 key (重复的键会覆盖)
	 *
	 * @param keyAndValue
	 */
	public void batchSet(Map<String, String> keyAndValue) {
		redisTemplateUser.opsForValue().multiSet(keyAndValue);
	}

	/**
	 * 批量添加 key-value 只有在键不存在时,才添加 map 中只要有一个key存在,则全部不添加
	 *
	 * @param keyAndValue
	 */
	public void batchSetIfAbsent(Map<String, String> keyAndValue) {
		redisTemplateUser.opsForValue().multiSetIfAbsent(keyAndValue);
	}

	/**
	 * 对一个 key-value 的值进行加减操作, 如果该 key 不存在 将创建一个key 并赋值该 number 如果 key 存在,但 value
	 * 不是长整型 ,将报错
	 *
	 * @param key
	 * @param number
	 */
	public Long increment(String key, long number) {
		return redisTemplateUser.opsForValue().increment(key, number);

	}

	/**
	 * 减少 number
	 * 
	 * @param key
	 * @param number
	 * @return
	 */
	public Long decrement(String key, long number) {
		Object value = redisTemplateUser.opsForValue().decrement(key, number);
		return Long.valueOf(value.toString());
	}

	/**
	 * 减少1
	 * 
	 * @param key
	 * @return
	 */
	public Long decrement(String key) {
		Object value = redisTemplateUser.opsForValue().decrement(key);
		return Long.valueOf(value.toString());
	}

	/**
	 * 对一个 key-value 的值进行加减操作, 如果该 key 不存在 将创建一个key 并赋值该 number 如果 key 存在,但 value 不是
	 * 纯数字 ,将报错
	 *
	 * @param key
	 * @param number
	 */
	public Double increment(String key, double number) {
		return redisTemplateUser.opsForValue().increment(key, number);
	}

	// - - - - - - - - - - - - - - - - - - - - - set类型 - - - - - - - - - - - - - - -
	// - - - - -

	/**
	 * 将数据放入set缓存
	 *
	 * @param key 键
	 * @return
	 */
	public void sSet(String key, String value) {
		redisTemplateUser.opsForSet().add(key, value);
	}

	/**
	 * 获取变量中的值
	 *
	 * @param key 键
	 * @return
	 */
	public Set<Object> members(String key) {
		return redisTemplateUser.opsForSet().members(key);
	}

	/**
	 * 随机获取变量中指定个数的元素
	 *
	 * @param key   键
	 * @param count 值
	 * @return
	 */
	public void randomMembers(String key, long count) {
		redisTemplateUser.opsForSet().randomMembers(key, count);
	}

	/**
	 * 随机获取变量中的元素
	 *
	 * @param key 键
	 * @return
	 */
	public Object randomMember(String key) {
		return redisTemplateUser.opsForSet().randomMember(key);
	}

	/**
	 * 弹出变量中的元素
	 *
	 * @param key 键
	 * @return
	 */
	public Object pop(String key) {
		return redisTemplateUser.opsForSet().pop("setValue");
	}

	/**
	 * 获取变量中值的长度
	 *
	 * @param key 键
	 * @return
	 */
	public long size(String key) {
		return redisTemplateUser.opsForSet().size(key);
	}

	/**
	 * 根据value从一个set中查询,是否存在
	 *
	 * @param key   键
	 * @param value 值
	 * @return true 存在 false不存在
	 */
	public boolean sHasKey(String key, Object value) {
		return redisTemplateUser.opsForSet().isMember(key, value);
	}

	/**
	 * 检查给定的元素是否在变量中。
	 *
	 * @param key 键
	 * @param obj 元素对象
	 * @return
	 */
	public boolean isMember(String key, Object obj) {
		return redisTemplateUser.opsForSet().isMember(key, obj);
	}

	/**
	 * 转移变量的元素值到目的变量。
	 *
	 * @param key     键
	 * @param value   元素对象
	 * @param destKey 元素对象
	 * @return
	 */
	public boolean move(String key, String value, String destKey) {
		return redisTemplateUser.opsForSet().move(key, value, destKey);
	}

	/**
	 * 批量移除set缓存中元素
	 *
	 * @param key    键
	 * @param values 值
	 * @return
	 */
	public void remove(String key, Object... values) {
		redisTemplateUser.opsForSet().remove(key, values);
	}

	/**
	 * 通过给定的key求2个set变量的差值
	 *
	 * @param key     键
	 * @param destKey 键
	 * @return
	 */
	public Set<Set> difference(String key, String destKey) {
		return redisTemplateUser.opsForSet().difference(key, destKey);
	}

	// - - - - - - - - - - - - - - - - - - - - - hash类型 - - - - - - - - - - - - - -
	// - - - - - -

	/**
	 * 加入缓存
	 *
	 * @param key 键
	 * @param map 键
	 * @return
	 */
	public void add(String key, Map<String, String> map) {
		redisTemplateUser.opsForHash().putAll(key, map);
	}

	/**
	 * 获取 key 下的 所有 hashkey 和 value
	 *
	 * @param key 键
	 * @return
	 */
	public Map<Object, Object> getHashEntries(String key) {
		return redisTemplateUser.opsForHash().entries(key);
	}

	/**
	 * 验证指定 key 下 有没有指定的 hashkey
	 *
	 * @param key
	 * @param hashKey
	 * @return
	 */
	public boolean hashKey(String key, String hashKey) {
		return redisTemplateUser.opsForHash().hasKey(key, hashKey);
	}

	/**
	 * 获取指定key的值string
	 *
	 * @param key  键
	 * @param key2 键
	 * @return
	 */
	public String getMapString(String key, String key2) {
		return redisTemplateUser.opsForHash().get("map1", "key1").toString();
	}

	/**
	 * 获取指定的值Int
	 *
	 * @param key  键
	 * @param key2 键
	 * @return
	 */
	public Integer getMapInt(String key, String key2) {
		return (Integer) redisTemplateUser.opsForHash().get("map1", "key1");
	}

	/**
	 * 弹出元素并删除
	 *
	 * @param key 键
	 * @return
	 */
	public String popValue(String key) {
		return redisTemplateUser.opsForSet().pop(key).toString();
	}

	/**
	 * 删除指定 hash 的 HashKey
	 *
	 * @param key
	 * @param hashKeys
	 * @return 删除成功的 数量
	 */
	public Long deleteHash(String key, String... hashKeys) {
		return redisTemplateUser.opsForHash().delete(key, hashKeys);
	}

	public void del(String key) {
		redisTemplateUser.delete(key);
	}

	/**
	 * 给指定 hash 的 hashkey 做增减操作
	 *
	 * @param key
	 * @param hashKey
	 * @param number
	 * @return
	 */
	public Long increment(String key, String hashKey, long number) {
		return redisTemplateUser.opsForHash().increment(key, hashKey, number);
	}

	/**
	 * 给指定 hash 的 hashkey 做增减操作
	 *
	 * @param key
	 * @param hashKey
	 * @param number
	 * @return
	 */
	public Double increment(String key, String hashKey, Double number) {
		return redisTemplateUser.opsForHash().increment(key, hashKey, number);
	}

	/**
	 * 获取 key 下的 所有 hashkey 字段
	 *
	 * @param key
	 * @return
	 */
	public Set<Object> hashKeys(String key) {
		return redisTemplateUser.opsForHash().keys(key);
	}

	/**
	 * 获取指定 hash 下面的 键值对 数量
	 *
	 * @param key
	 * @return
	 */
	public Long hashSize(String key) {
		return redisTemplateUser.opsForHash().size(key);
	}

	// - - - - - - - - - - - - - - - - - - - - - list类型 - - - - - - - - - - - - - -
	// - - - - - -

	/**
	 * 在变量左边添加元素值
	 *
	 * @param key
	 * @param value
	 * @return
	 */
	public void leftPush(String key, Object value) {
		redisTemplateUser.opsForList().leftPush(key, value);
	}

	/**
	 * 获取集合指定位置的值。
	 *
	 * @param key
	 * @param index
	 * @return
	 */
	public Object index(String key, long index) {
		return redisTemplateUser.opsForList().index("list", 1);
	}

	/**
	 * 获取指定区间的值。
	 *
	 * @param key
	 * @param start
	 * @param end
	 * @return
	 */
	public List<Object> range(String key, long start, long end) {
		return redisTemplateUser.opsForList().range(key, start, end);
	}

	/**
	 * 把最后一个参数值放到指定集合的第一个出现中间参数的前面, 如果中间参数值存在的话。
	 *
	 * @param key
	 * @param pivot
	 * @param value
	 * @return
	 */
	public void leftPush(String key, String pivot, String value) {
		redisTemplateUser.opsForList().leftPush(key, pivot, value);
	}

	/**
	 * 向左边批量添加参数元素。
	 *
	 * @param key
	 * @param values
	 * @return
	 */
	public void leftPushAll(String key, String... values) {
//        redisTemplate.opsForList().leftPushAll(key,"w","x","y");
		redisTemplateUser.opsForList().leftPushAll(key, values);
	}

	/**
	 * 向集合最右边添加元素。
	 *
	 * @param key
	 * @param value
	 * @return
	 */
	public void leftPushAll(String key, String value) {
		redisTemplateUser.opsForList().rightPush(key, value);
	}

	/**
	 * 向左边批量添加参数元素。
	 *
	 * @param key
	 * @param values
	 * @return
	 */
	public void rightPushAll(String key, String... values) {
		// redisTemplate.opsForList().leftPushAll(key,"w","x","y");
		redisTemplateUser.opsForList().rightPushAll(key, values);
	}

	/**
	 * 向已存在的集合中添加元素。
	 *
	 * @param key
	 * @param value
	 * @return
	 */
	public void rightPushIfPresent(String key, Object value) {
		redisTemplateUser.opsForList().rightPushIfPresent(key, value);
	}

	/**
	 * 向已存在的集合中添加元素。
	 *
	 * @param key
	 * @return
	 */
	public long listLength(String key) {
		return redisTemplateUser.opsForList().size(key);
	}

	/**
	 * 移除集合中的左边第一个元素。
	 *
	 * @param key
	 * @return
	 */
	public void leftPop(String key) {
		redisTemplateUser.opsForList().leftPop(key);
	}

	/**
	 * 移除集合中左边的元素在等待的时间里,如果超过等待的时间仍没有元素则退出。
	 *
	 * @param key
	 * @return
	 */
	public void leftPop(String key, long timeout, TimeUnit unit) {
		redisTemplateUser.opsForList().leftPop(key, timeout, unit);
	}

	/**
	 * 移除集合中右边的元素。
	 *
	 * @param key
	 * @return
	 */
	public void rightPop(String key) {
		redisTemplateUser.opsForList().rightPop(key);
	}

	/**
	 * 移除集合中右边的元素在等待的时间里,如果超过等待的时间仍没有元素则退出。
	 *
	 * @param key
	 * @return
	 */
	public void rightPop(String key, long timeout, TimeUnit unit) {
		redisTemplateUser.opsForList().rightPop(key, timeout, unit);
	}

	/**
	 * 复杂操作,可能需要直接拿到redisTemplate进行。
	 * 
	 * @return
	 */
	public RedisTemplate getRedisTemplate() {
		return redisTemplateUser;
	}
}
6.Application.java加载配置exclude

这里比较关键,记得不要使用redis自动加载的class:RedisAutoConfiguration.class 和RedisRepositoriesAutoConfiguration.class 。

package com.spell;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration;
import org.springframework.boot.autoconfigure.data.redis.RedisRepositoriesAutoConfiguration;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.context.annotation.ComponentScan;

/**
 * 
 * @author zhengsibi Application启动类文件的包必须是项目下的父路径,其他类的包路径必须是其子路径,
 *         虽然放在其它包下也能正常启动,但是就是在浏览器中访问不到,因为handleMapper扫描不到,可以在启动类上加上注解
 */
@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class, RedisAutoConfiguration.class,
		RedisRepositoriesAutoConfiguration.class })
@ComponentScan(basePackages = { "com.spell.*" })
public class Application {
	public static void main(String[] args) {
		SpringApplication.run(Application.class, args);
	}
}

三、启动redis并且进行测试

1.启动redis
#本地启动一个redis为7777的redis实例
nohup ./redis-server --port 7777 &

#本地启动一个redis为6379的redis实例
nohup ./redis-server --port 6379 &
2.开启单元测试

RedisOrderTest.java:

package com.spell;

import static org.assertj.core.api.Assertions.assertThat;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import com.spell.redis.RedisOrderUtil;

/**
 * 
 */
@RunWith(SpringRunner.class)
@SpringBootTest
public class RedisOrderTest {

	@Autowired
	private RedisOrderUtil redisUtil;

	@Test
	public void setAndGetTest() {
		// 设置一个库存
		String key = "stock_7777";
		redisUtil.set(key, 100);
		Integer value = Integer.valueOf(redisUtil.get(key).toString());
		assertThat(value == 100);
	}

	@Test
	public void decrement() {
		String key = "stock_99";
		redisUtil.set(key, 100);
		Long value = redisUtil.decrement(key);
		assertThat(99 == value.longValue());
	}
}

RedisUserTest.java 

package com.spell;

import static org.assertj.core.api.Assertions.assertThat;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import com.spell.redis.RedisOrderUtil;

/**
 * 
 */
@RunWith(SpringRunner.class)
@SpringBootTest
public class RedisUserTest {

	@Autowired
	private RedisOrderUtil redisUtil;

	@Test
	public void setAndGetTest() {
		// 设置一个库存
		String key = "stock_10000";
		redisUtil.set(key, "100");
		Integer value = Integer.valueOf(redisUtil.get(key).toString());
		assertThat(value == 100);
	}

	@Test
	public void decrement() {
		String key = "stock_99";
		redisUtil.set(key, 100);
		Long value = redisUtil.decrement(key);
		assertThat(99 == value.longValue());
	}
}

UT应该都可以正常绿色。

运行UT后,进入端口为7777 的redis 实例看看:

./redis-cli -p 7777

四、结束语:

技术就是要多自己去实践捣鼓,去验证,并且开个github进行实验性源码的管理,以后碰到这类问题,就可以手到擒来,减少二次探索的时间了。

欢迎大家点赞、收藏、订阅,你们的反馈是我持续输出的动力。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值