1、首先配置application.yml
# 用户redis 配置
redis:
# 地址
host: 192.168.1.15
# 端口,默认为6379
port: 6379
# 数据库索引
database: 10
# 密码
password: 123456
# 连接超时时间 单位:s
timeout: 10
# 连接池中的最小空闲连接
lettuce-pool-min-idle: 0
# 连接池中的最大空闲连接
lettuce-pool-max-idle: 8
# 连接池的最大数据库连接数
lettuce-pool-max-active: 8
# #连接池最大阻塞等待时间(使用负值表示没有限制)单位:ms
lettuce-pool-max-wait: -1
# 订单redis 配置
redis-order:
# 地址
host: 192.168.1.15
# 端口,默认为6379
port: 6379
# 数据库索引
database: 11
# 密码
password: 123456
# 连接超时时间 单位:s
timeout: 10
# 连接池中的最小空闲连接
lettuce-pool-min-idle: 0
# 连接池中的最大空闲连接
lettuce-pool-max-idle: 8
# 连接池的最大数据库连接数
lettuce-pool-max-active: 8
# #连接池最大阻塞等待时间(使用负值表示没有限制)单位:ms
lettuce-pool-max-wait: -1
# 其他redis 配置
redis-other:
# 地址
host: 192.168.1.15
# 端口,默认为6379
port: 6379
# 数据库索引
database: 12
# 密码
password: 123456
# 连接超时时间 单位:s
timeout: 10
# 连接池中的最小空闲连接
lettuce-pool-min-idle: 0
# 连接池中的最大空闲连接
lettuce-pool-max-idle: 8
# 连接池的最大数据库连接数
lettuce-pool-max-active: 8
# #连接池最大阻塞等待时间(使用负值表示没有限制)单位:ms
lettuce-pool-max-wait: -1
2、配置连接参数信息Properties
package com.ruoyi.framework.config.properties;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Data
@Component
@ConfigurationProperties
public class RedisProperties {
//最大活跃数
private int lettucePoolMaxActive;
//最大等待数
private int lettucePoolMaxWait;
//最大核心线程数
private int lettucePoolMaxIdle;
//最小核心线程数
private int lettucePoolMinIdle;
//redis连接的超时时长
private int timeOut;
//redis连接的库
private int database;
//单节点情况下redis的ip
private String host;
//单节点情况下redis的端口
private Integer port;
//redis的连接密码
private String password;
}
3、配置Config文件
package com.ruoyi.framework.config;
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.jsontype.impl.LaissezFaireSubTypeValidator;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.framework.config.properties.RedisProperties;
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.data.redis.connection.RedisStandaloneConfiguration;
import org.springframework.data.redis.connection.lettuce.LettuceClientConfiguration;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
import org.springframework.data.redis.connection.lettuce.LettucePoolingClientConfiguration;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.script.DefaultRedisScript;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import org.springframework.stereotype.Component;
import java.time.Duration;
@Configuration
@EnableCaching
@Component
public class RedisConfig extends CachingConfigurerSupport
{
@Bean
@ConfigurationProperties(prefix = "spring.redis-other")
public RedisProperties otherProperties() {
return new RedisProperties();
}
@Bean
@ConfigurationProperties(prefix = "spring.redis")
public RedisProperties defaultProperties() {
return new RedisProperties();
}
@Bean
@ConfigurationProperties(prefix = "spring.redis-order")
public RedisProperties orderProperties() {
return new RedisProperties();
}
/**
* 用户
*/
@Primary
@Bean
@Qualifier("defaultConnectionFactory")
public RedisTemplate<String, Object> redisTemplate(@Qualifier("defaultConnectionFactory") LettuceConnectionFactory userConnectionFactory) {
return getTemplate(userConnectionFactory);
}
/**
* 订单
*/
@Bean
@Qualifier("orderConnectionFactory")
public RedisTemplate<String, Object> redisOrderTemplate(@Qualifier("orderConnectionFactory") LettuceConnectionFactory orderConnectionFactory) {
return getTemplate(orderConnectionFactory);
}
/**
* 其他
*/
@Bean
@Qualifier("otherConnectionFactory")
public RedisTemplate<String, Object> redisOtherTemplate(@Qualifier("otherConnectionFactory") LettuceConnectionFactory otherConnectionFactory) {
return getTemplate(otherConnectionFactory);
}
private RedisTemplate<String, Object> getTemplate(LettuceConnectionFactory factory) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(factory);
Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);
ObjectMapper om = new ObjectMapper();
om.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES,false);
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.activateDefaultTyping(LaissezFaireSubTypeValidator.instance ,
ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY);
jackson2JsonRedisSerializer.setObjectMapper(om);
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
// key采用String的序列化方式
template.setKeySerializer(stringRedisSerializer);
// hash的key也采用String的序列化方式
template.setHashKeySerializer(stringRedisSerializer);
// value序列化方式采用jackson
template.setValueSerializer(jackson2JsonRedisSerializer);
// hash的value序列化方式采用jackson
template.setHashValueSerializer(jackson2JsonRedisSerializer);
template.afterPropertiesSet();
return template;
}
/**
* 用户连接配置
*/
@Primary
@Bean
public LettuceConnectionFactory defaultConnectionFactory(@Qualifier("defaultConnectionFactory") RedisProperties defaultProperties) {
return getFactory(defaultProperties);
}
/**
* 其他连接配置
*/
@Bean
public LettuceConnectionFactory otherConnectionFactory(@Qualifier("otherConnectionFactory") RedisProperties otherProperties) {
return getFactory(otherProperties);
}
/**
* 订单连接配置
*/
@Bean
public LettuceConnectionFactory orderConnectionFactory(@Qualifier("orderConnectionFactory") RedisProperties orderProperties) {
return getFactory(orderProperties);
}
private LettuceConnectionFactory getFactory(RedisProperties redisProperties) {
RedisStandaloneConfiguration redisStandaloneConfiguration;
//连接池配置
GenericObjectPoolConfig genericObjectPoolConfig =
new GenericObjectPoolConfig();
genericObjectPoolConfig.setMaxTotal(redisProperties.getLettucePoolMaxActive());
genericObjectPoolConfig.setMaxWaitMillis(redisProperties.getLettucePoolMaxWait());
genericObjectPoolConfig.setMaxIdle(redisProperties.getLettucePoolMaxIdle());
genericObjectPoolConfig.setMinIdle(redisProperties.getLettucePoolMinIdle());
//redis客户端配置
LettucePoolingClientConfiguration.LettucePoolingClientConfigurationBuilder
builder = LettucePoolingClientConfiguration.builder().
commandTimeout(Duration.ofSeconds(redisProperties.getTimeOut()));
builder.poolConfig(genericObjectPoolConfig);
LettuceClientConfiguration lettuceClientConfiguration = builder.build();
//单机模式
redisStandaloneConfiguration = new RedisStandaloneConfiguration(redisProperties.getHost(),redisProperties.getPort());
redisStandaloneConfiguration.setDatabase(redisProperties.getDatabase());
if(!StringUtils.isEmpty(redisProperties.getPassword())){
redisStandaloneConfiguration.setPassword(redisProperties.getPassword());
}
//根据配置和客户端配置创建连接工厂
LettuceConnectionFactory lettuceConnectionFactory = new
LettuceConnectionFactory(redisStandaloneConfiguration,lettuceClientConfiguration);
// 关闭共享链接
lettuceConnectionFactory.setShareNativeConnection(false);
return lettuceConnectionFactory;
}
@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);";
}
}
4、创建自定义注解
(1)RedisStaticDataSource静态注解
package com.ruoyi.common.annotation;
import java.lang.annotation.*;
/**
* redis根据指定名称切换注解
*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RedisStaticDataSource {
/**
* redis库
*/
String value() default "";
}
(2)RedisDynamicDataSource动态注解
package com.ruoyi.common.annotation;
import java.lang.annotation.*;
/**
* redis动态识别入参,读取不同的缓存实例
*/
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RedisDynamicDataSource {
}
5、创建ContextHolder
package com.ruoyi.common.utils;
import com.alibaba.ttl.TransmittableThreadLocal;
import org.springframework.data.redis.core.RedisTemplate;
public class RedisThreadLocalUtils {
private static final TransmittableThreadLocal<RedisTemplate<String, Object>> TEMPLATE_THREAD_LOCAL =
new TransmittableThreadLocal<>();
public static RedisTemplate<String, Object> getTemplate() {
return TEMPLATE_THREAD_LOCAL.get();
}
public static void setTemplate(RedisTemplate<String, Object> template) {
TEMPLATE_THREAD_LOCAL.set(template);
}
public static void remove() {
TEMPLATE_THREAD_LOCAL.remove();
}
}
6、创建AOP切面
package com.ruoyi.framework.config;
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.jsontype.impl.LaissezFaireSubTypeValidator;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.framework.config.properties.RedisProperties;
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.data.redis.connection.RedisStandaloneConfiguration;
import org.springframework.data.redis.connection.lettuce.LettuceClientConfiguration;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
import org.springframework.data.redis.connection.lettuce.LettucePoolingClientConfiguration;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.script.DefaultRedisScript;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import org.springframework.stereotype.Component;
import java.time.Duration;
@Configuration
@EnableCaching
@Component
public class RedisConfig extends CachingConfigurerSupport
{
@Bean
@ConfigurationProperties(prefix = "spring.redis-other")
public RedisProperties otherProperties() {
return new RedisProperties();
}
@Bean
@ConfigurationProperties(prefix = "spring.redis")
public RedisProperties defaultProperties() {
return new RedisProperties();
}
@Bean
@ConfigurationProperties(prefix = "spring.redis-order")
public RedisProperties orderProperties() {
return new RedisProperties();
}
/**
* 用户
*/
@Primary
@Bean
@Qualifier("redisTemplate")
public RedisTemplate<String, Object> redisTemplate(@Qualifier("defaultConnectionFactory") LettuceConnectionFactory userConnectionFactory) {
return getTemplate(userConnectionFactory);
}
/**
* 订单
*/
@Bean
@Qualifier("redisOrderTemplate")
public RedisTemplate<String, Object> redisOrderTemplate(@Qualifier("orderConnectionFactory") LettuceConnectionFactory orderConnectionFactory) {
return getTemplate(orderConnectionFactory);
}
/**
* 其他
*/
@Bean
@Qualifier("redisOtherTemplate")
public RedisTemplate<String, Object> redisOtherTemplate(@Qualifier("otherConnectionFactory") LettuceConnectionFactory otherConnectionFactory) {
return getTemplate(otherConnectionFactory);
}
private RedisTemplate<String, Object> getTemplate(LettuceConnectionFactory factory) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(factory);
Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);
ObjectMapper om = new ObjectMapper();
om.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES,false);
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.activateDefaultTyping(LaissezFaireSubTypeValidator.instance ,
ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY);
jackson2JsonRedisSerializer.setObjectMapper(om);
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
// key采用String的序列化方式
template.setKeySerializer(stringRedisSerializer);
// hash的key也采用String的序列化方式
template.setHashKeySerializer(stringRedisSerializer);
// value序列化方式采用jackson
template.setValueSerializer(jackson2JsonRedisSerializer);
// hash的value序列化方式采用jackson
template.setHashValueSerializer(jackson2JsonRedisSerializer);
template.afterPropertiesSet();
return template;
}
/**
* 用户连接配置
*/
@Primary
@Bean
public LettuceConnectionFactory defaultConnectionFactory(@Qualifier("defaultProperties") RedisProperties defaultProperties) {
return getFactory(defaultProperties);
}
/**
* 其他连接配置
*/
@Bean
public LettuceConnectionFactory otherConnectionFactory(@Qualifier("otherProperties") RedisProperties otherProperties) {
return getFactory(otherProperties);
}
/**
* 订单连接配置
*/
@Bean
public LettuceConnectionFactory orderConnectionFactory(@Qualifier("orderProperties") RedisProperties orderProperties) {
return getFactory(orderProperties);
}
private LettuceConnectionFactory getFactory(RedisProperties redisProperties) {
RedisStandaloneConfiguration redisStandaloneConfiguration;
//连接池配置
GenericObjectPoolConfig genericObjectPoolConfig =
new GenericObjectPoolConfig();
genericObjectPoolConfig.setMaxTotal(redisProperties.getLettucePoolMaxActive());
genericObjectPoolConfig.setMaxWaitMillis(redisProperties.getLettucePoolMaxWait());
genericObjectPoolConfig.setMaxIdle(redisProperties.getLettucePoolMaxIdle());
genericObjectPoolConfig.setMinIdle(redisProperties.getLettucePoolMinIdle());
//redis客户端配置
LettucePoolingClientConfiguration.LettucePoolingClientConfigurationBuilder
builder = LettucePoolingClientConfiguration.builder().
commandTimeout(Duration.ofSeconds(redisProperties.getTimeOut()));
builder.poolConfig(genericObjectPoolConfig);
LettuceClientConfiguration lettuceClientConfiguration = builder.build();
//单机模式
redisStandaloneConfiguration = new RedisStandaloneConfiguration(redisProperties.getHost(),redisProperties.getPort());
redisStandaloneConfiguration.setDatabase(redisProperties.getDatabase());
if(!StringUtils.isEmpty(redisProperties.getPassword())){
redisStandaloneConfiguration.setPassword(redisProperties.getPassword());
}
//根据配置和客户端配置创建连接工厂
LettuceConnectionFactory lettuceConnectionFactory = new
LettuceConnectionFactory(redisStandaloneConfiguration,lettuceClientConfiguration);
// 关闭共享链接
lettuceConnectionFactory.setShareNativeConnection(false);
return lettuceConnectionFactory;
}
@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);";
}
}
7、创建RedisCache模版
package com.ruoyi.common.core.redis;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import com.ruoyi.common.utils.RedisThreadLocalUtils;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.data.redis.core.BoundSetOperations;
import org.springframework.data.redis.core.HashOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.stereotype.Component;
@SuppressWarnings(value = { "unchecked", "rawtypes" })
@Component
public class RedisCache
{
private final RedisTemplate<String, Object> redisTemplate;
public RedisCache(@Qualifier("redisTemplate") RedisTemplate<String, Object> redisTemplate) {
this.redisTemplate = redisTemplate;
}
private RedisTemplate<String, Object> getRedsTemplate() {
RedisTemplate<String, Object> template = RedisThreadLocalUtils.getTemplate();
if (null == template) {
return redisTemplate;
}
return template;
}
/**
* 缓存基本的对象,Integer、String、实体类等
*
* @param key 缓存的键值
* @param value 缓存的值
*/
public <T> void setCacheObject(final String key, final T value) {
getRedsTemplate().opsForValue().set(key, value);
}
/**
* 缓存基本的对象,Integer、String、实体类等
*
* @param key 缓存的键值
* @param value 缓存的值
* @param timeout 时间
* @param timeUnit 时间颗粒度
*/
public <T> void setCacheObject(final String key, final T value, final Integer timeout, final TimeUnit timeUnit) {
getRedsTemplate().opsForValue().set(key, value, timeout, timeUnit);
}
/**
* 设置有效时间
*
* @param key Redis键
* @param timeout 超时时间
* @return true=设置成功;false=设置失败
*/
public boolean expire(final String key, final long timeout) {
return expire(key, timeout, TimeUnit.SECONDS);
}
/**
* 设置有效时间
*
* @param key Redis键
* @param timeout 超时时间
* @param unit 时间单位
* @return true=设置成功;false=设置失败
*/
public boolean expire(final String key, final long timeout, final TimeUnit unit) {
return getRedsTemplate().expire(key, timeout, unit);
}
/**
* 获取有效时间
*
* @param key Redis键
* @return 有效时间
*/
public long getExpire(final String key) {
return getRedsTemplate().getExpire(key);
}
/**
* 判断 key是否存在
*
* @param key 键
* @return true 存在 false不存在
*/
public Boolean hasKey(String key) {
return getRedsTemplate().hasKey(key);
}
/**
* 获得缓存的基本对象。
*
* @param key 缓存键值
* @return 缓存键值对应的数据
*/
public <T> T getCacheObject(final String key) {
ValueOperations<String, Object> operation = getRedsTemplate().opsForValue();
return (T)operation.get(key);
}
/**
* 删除单个对象
*
* @param key
*/
public boolean deleteObject(final String key) {
return getRedsTemplate().delete(key);
}
/**
* 删除集合对象
*
* @param collection 多个对象
* @return
*/
public boolean deleteObject(final Collection collection) {
return getRedsTemplate().delete(collection) > 0;
}
/**
* 缓存List数据
*
* @param key 缓存的键值
* @param dataList 待缓存的List数据
* @return 缓存的对象
*/
public <T> long setCacheList(final String key, final List<T> dataList) {
Long count = getRedsTemplate().opsForList().rightPushAll(key, dataList);
return count == null ? 0 : count;
}
/**
* 获得缓存的list对象
*
* @param key 缓存的键值
* @return 缓存键值对应的数据
*/
public <T> List<T> getCacheList(final String key) {
return (List<T>) getRedsTemplate().opsForList().range(key, 0, -1);
}
/**
* 缓存Set
*
* @param key 缓存键值
* @param dataSet 缓存的数据
* @return 缓存数据的对象
*/
public <T> BoundSetOperations<String, T> setCacheSet(final String key, final Set<T> dataSet) {
BoundSetOperations<String, T> setOperation = (BoundSetOperations<String, T>) getRedsTemplate().boundSetOps(key);
Iterator<T> it = dataSet.iterator();
while (it.hasNext()) {
setOperation.add(it.next());
}
return setOperation;
}
/**
* 获得缓存的set
*
* @param key
* @return
*/
public <T> Set<T> getCacheSet(final String key) {
return (Set<T>) getRedsTemplate().opsForSet().members(key);
}
/**
* 缓存Map
*
* @param key
* @param dataMap
*/
public <T> void setCacheMap(final String key, final Map<String, T> dataMap) {
if (dataMap != null) {
getRedsTemplate().opsForHash().putAll(key, dataMap);
}
}
/**
* 获得缓存的Map
*
* @param key
* @return
*/
public <T> Map<Object, Object> getCacheMap(final String key) {
return getRedsTemplate().opsForHash().entries(key);
}
/**
* 往Hash中存入数据
*
* @param key Redis键
* @param hKey Hash键
* @param value 值
*/
public <T> void setCacheMapValue(final String key, final String hKey, final T value) {
getRedsTemplate().opsForHash().put(key, hKey, value);
}
/**
* 获取Hash中的数据
*
* @param key Redis键
* @param hKey Hash键
* @return Hash中的对象
*/
public <T> T getCacheMapValue(final String key, final String hKey) {
HashOperations<String, String, T> opsForHash = getRedsTemplate().opsForHash();
return opsForHash.get(key, hKey);
}
/**
* 获取多个Hash中的数据
*
* @param key Redis键
* @param hKeys Hash键集合
* @return Hash对象集合
*/
public <T> List<T> getMultiCacheMapValue(final String key, final Collection<Object> hKeys) {
return (List<T>) getRedsTemplate().opsForHash().multiGet(key, hKeys);
}
/**
* 删除Hash中的某条数据
*
* @param key Redis键
* @param hKey Hash键
* @return 是否成功
*/
public boolean deleteCacheMapValue(final String key, final String hKey) {
return getRedsTemplate().opsForHash().delete(key, hKey) > 0;
}
/**
* 获得缓存的基本对象列表
*
* @param pattern 字符串前缀
* @return 对象列表
*/
public Collection<String> keys(final String pattern) {
return getRedsTemplate().keys(pattern);
}
}
8、调用redis库多数据源(默认:用户redis实例)
redis库静态数据源切换
//在需要使用多数据源方法或类上添加@RedisStaticDataSource,其中value用来表示数据源
@RedisStaticDataSource("redisOrderTemplate")
public void deleteInfo(String id) {
redisCache.setCacheObject(id,"100");
}
redis库动态数据源切换
//在需要使用动态多数据源方法上添加@RedisDynamicDataSource,入参中需要传入“dynamicKey:0用户 1订单 2其他”
@RedisDynamicDataSource
public void selectUserList(Long id,Integer dynamicKey)
{
redisCache.setCacheObject(id,"100");
}
注:当前采用的是Ruoyi分离单体框架做的修改,请结合实际修改。
仅供参考,希望对您有所帮助,感谢阅读。