Spring boot AOP 配置Redis多数据源

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分离单体框架做的修改,请结合实际修改。

 

仅供参考,希望对您有所帮助,感谢阅读。


注:本文章,是从各大网站、各位道友以及老师等处学习,自己总结做的一些笔记,不对的地方望海涵,如有问题,请及时联系。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值