springboot+不同索引的缓存redis使用

springboot2.x+不同索引的redis使用(这里讲缓存redis和redis)

我看了很多文章都是对一个索引进行缓存操作,那如果说我原来的项目本身已经存在redis了,而想增加缓存redis在不同索引中,怎么操作呢?本文就将带领大伙研究不同索引下如何操作;
本文章为原创文章,创作不易,觉得喜欢的朋友点赞加收藏吧

首先创建application.yml文件配置redis。

# Redis数据库索引(默认为0)
spring.redis.database=0
# Redis服务器地址
spring.redis.host=0.0.0.0
# Redis服务器连接端口
spring.redis.port=6379
# Redis服务器连接密码(默认为空)
spring.redis.password=
# 连接超时时间(毫秒)
spring.redis.timeout=10000
# 连接池最大连接数(使用负值表示没有限制)
spring.redis.jedis.pool.max-active=-1
# 连接池最大阻塞等待时间(使用负值表示没有限制)
spring.redis.jedis.pool.max-wait=-1
# 连接池中的最大空闲连接
spring.redis.jedis.pool.max-idle=8
# 连接池中的最小空闲连接
spring.redis.jedis.pool.min-idle=0


# Redis数据库索引(这里为1)
spring.redis2.database=1
# Redis服务器地址
spring.redis2.host=0.0.0.0
# Redis服务器连接端口
spring.redis2.port=6379
# Redis服务器连接密码(默认为空)
spring.redis2.password=
# 连接超时时间(毫秒)
spring.redis2.timeout=10000
# 连接池最大连接数(使用负值表示没有限制)
spring.redis2.jedis.pool.max-active=-1
# 连接池最大阻塞等待时间(使用负值表示没有限制)
spring.redis2.jedis.pool.max-wait=-1
# 连接池中的最大空闲连接
spring.redis2.jedis.pool.max-idle=8
# 连接池中的最小空闲连接
spring.redis2.jedis.pool.min-idle=0

然后我在config包中,配置了如下四个类
在这里插入图片描述

记得在主类上开启缓存
在这里插入图片描述

/**
 * 用于自定义redis的基本策略配置
 */
public class RedisConfig {
	//注入yml中定义的大小
    @Value("${spring.redis.jedis.pool.max-active}")
    private int redisPoolMaxActive;

    @Value("${spring.redis.jedis.pool.max-wait}")
    private int redisPoolMaxWait;

    @Value("${spring.redis.jedis.pool.max-idle}")
    private int redisPoolMaxIdle;

    @Value("${spring.redis.jedis.pool.min-idle}")
    private int redisPoolMinIdle;

    /**
     * 创建redis连接工厂
     * @param dbIndex
     * @param host
     * @param port
     * @param password
     * @param timeout
     * @return
     */
    public JedisConnectionFactory createJedisConnectionFactory(int dbIndex, String host, int port, String password, int timeout) {
        JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory();
        jedisConnectionFactory.setDatabase(dbIndex);
        jedisConnectionFactory.setHostName(host);
        jedisConnectionFactory.setPort(port);
        jedisConnectionFactory.setPassword(password);
        jedisConnectionFactory.setTimeout(timeout);
        jedisConnectionFactory.setPoolConfig(setPoolConfig(redisPoolMaxIdle, redisPoolMinIdle, redisPoolMaxActive, redisPoolMaxWait, true));
        return jedisConnectionFactory;

    }

    /**
     * 设置连接池属性
     * @param maxIdle
     * @param minIdle
     * @param maxActive
     * @param maxWait
     * @param testOnBorrow
     * @return
     */
    public JedisPoolConfig setPoolConfig(int maxIdle, int minIdle, int maxActive, int maxWait, boolean testOnBorrow) {
        JedisPoolConfig poolConfig = new JedisPoolConfig();
        poolConfig.setMaxIdle(maxIdle);
        poolConfig.setMinIdle(minIdle);
        poolConfig.setMaxTotal(maxActive);
        poolConfig.setMaxWaitMillis(maxWait);
        poolConfig.setTestOnBorrow(testOnBorrow);
        return poolConfig;
    }

    /**
     * json序列化
     * @return
     */
    public RedisSerializer<Object> jackson2JsonRedisSerializer() {
        //使用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值
        Jackson2JsonRedisSerializer serializer = new Jackson2JsonRedisSerializer(Object.class);
        ObjectMapper mapper = new ObjectMapper();
        mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        //启用默认的类型
        mapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        //序列化类,对象映射设置
        serializer.setObjectMapper(mapper);
        return serializer;
    }
    /**
     * 设置RedisTemplate的序列化方式
     * @param redisTemplate
     */

    public void setSerializer(RedisTemplate<String,Object> redisTemplate) {
        //设置键(key)的序列化方式
        redisTemplate.setKeySerializer(jackson2JsonRedisSerializer());
        //设置值(value)的序列化方式
        redisTemplate.setValueSerializer(jackson2JsonRedisSerializer());
        //设置值(hkey)的序列化方式
        redisTemplate.setHashKeySerializer(jackson2JsonRedisSerializer());
        //设置值(hValue)的序列化方式
        redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer());
        redisTemplate.afterPropertiesSet();

        //这里设置redis事务一致
        //template.setEnableTransactionSupport(true);
    }
}

缓存redis:RedisCacheConfig 的配置

/**
 * 缓存redis的自定义配置
 */
@Configuration
public class RedisCacheConfig extends CachingConfigurerSupport {

    //自定义 cache key 的生成方式
    @Bean
    public KeyGenerator simpleKeyGenerator() {
        return (o, method, objects) -> {
            StringBuilder stringBuilder = new StringBuilder();
            stringBuilder.append(o.getClass().getSimpleName());
            stringBuilder.append(".");
            stringBuilder.append(method.getName());
            stringBuilder.append("[");
            for (Object obj : objects) {
                stringBuilder.append(obj.toString());
            }
            stringBuilder.append("]");

            return stringBuilder.toString();
        };
    }

    //自定义缓存管理策略
    @Bean
    public CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {
        return new RedisCacheManager(
                RedisCacheWriter.nonLockingRedisCacheWriter(redisConnectionFactory),
                this.getRedisCacheConfigurationWithTtl(6L), // 默认策略,未配置的 key 会使用这个
                this.getRedisCacheConfigurationMap() // 指定 key 策略
        );
    }
    /* 配置aaa的超时时间为30min*/
    private Map<String, RedisCacheConfiguration> getRedisCacheConfigurationMap() {
        Map<String, RedisCacheConfiguration> redisCacheConfigurationMap = new HashMap<>();
        //记住这里我是设置的aaa,看我下面的例子操作
        redisCacheConfigurationMap.put("aaa", this.getRedisCacheConfigurationWithTtl(30L));

        return redisCacheConfigurationMap;
    }
    /* 默认配置超时时间*/
    private RedisCacheConfiguration getRedisCacheConfigurationWithTtl(Long mines) {
        RedisConfig redisConfig=new RedisConfig();
        RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig();
        redisCacheConfiguration = redisCacheConfiguration.serializeValuesWith(
                RedisSerializationContext
                        .SerializationPair
                        .fromSerializer(redisConfig.jackson2JsonRedisSerializer())
                )
                //当value为null时不进行缓存
                .disableCachingNullValues()
                // 配置缓存空间名称的前缀
                /*.prefixCacheNameWith("demo:")*/
                //全局配置缓存过期时间【可以不配置】
                .entryTtl(Duration.ofMinutes(mines));

        return redisCacheConfiguration;
    }
}

配置缓存的的Redis操作实例 到Spring中

/**
 * 配置缓存的的Redis操作实例 到Spring中
 */
@Configuration
@EnableCaching
public class LastingRedisConfig extends RedisConfig {


    @Value("${spring.redis2.database}")
    private int dbIndex;

    @Value("${spring.redis2.host}")
    private String host;

    @Value("${spring.redis2.port}")
    private int port;

    @Value("${spring.redis2.password}")
    private String password;

    @Value("${spring.redis2.timeout}")
    private int timeout;
    /**
     * 配置缓存redis连接工厂
     *
     * @return
     */
    @Primary
    @Bean
    public RedisConnectionFactory lastingRedisConnectionFactory() {
        return createJedisConnectionFactory(dbIndex, host, port, password, timeout);
    }

    /**
     * 配置redisTemplate 注入方式使用@Resource(name="") 方式注入
     *
     * @return
     */
    @Bean(name = "lastingRedisTemplate")
    //当@Bean没有指定name属性值时,默认使用的是@ConditionalOnMissingBean注解里面的name属性值,且方法名要与其一致。
    // 如果不一致,就算@Resource的name属性与@ConditionalOnMissingBean的name属性值一致也不执行以下方法
    //而对于@Bean则不需要与方法名一致,只需要使用@Resource时,name属性值写正确即可
    /*@ConditionalOnMissingBean(name = "redisTemplate")*/
    public RedisTemplate<String,Object> lastingRedisTemplate() {
        RedisTemplate<String,Object> template = new RedisTemplate<>();

        template.setDefaultSerializer(jackson2JsonRedisSerializer());
        template.setConnectionFactory(lastingRedisConnectionFactory());
        setSerializer(template);
        return template;
    }

}

配置默认Redis操作实例 到Spring中

/**
 * 配置默认Redis操作实例 到Spring中
 */

@Configuration
public class DefaultRedisConfig extends RedisConfig {
    @Value("${spring.redis.database}")
    private int dbIndex;

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

    @Value("${spring.redis.port}")
    private int port;

    @Value("${spring.redis.password}")
    private String password;

    @Value("${spring.redis.timeout}")
    private int timeout;

    /**
     * 配置redis连接工厂
     *
     * @return
     */
    @Bean
    public RedisConnectionFactory defaultRedisConnectionFactory() {
        return createJedisConnectionFactory(dbIndex, host, port, password, timeout);
    }

    /**
     * 配置redisTemplate 注入方式使用@Resource(name="") 方式注入
     *
     * @return
     */
    @Bean(name = "defaultRedisTemplate")
    public RedisTemplate defaultRedisTemplate() {
        RedisTemplate template = new RedisTemplate();
        template.setConnectionFactory(defaultRedisConnectionFactory());
        setSerializer(template);
        return template;
    }
}

上面配置好了,接下来就是重点的缓存使用了。(我这里测试的登录功能,将mysql中的数据放入缓存redis中)

@Cacheable(value = "aaa", keyGenerator = "simpleKeyGenerator")
    public SmartResult staffLogin(String staffTelNumber, String staffPassword) {

        Example example=new Example(Staff.class);
        example.createCriteria().andEqualTo("staffTelNumber",staffTelNumber).andEqualTo("staffPassword",DigestUtils.md5DigestAsHex(staffPassword.getBytes()));
        List<Staff> staffs=staffMapper.selectByExample(example);

        if (staffs.size()==0){
            log.error("无相关信息");
            return new SmartResult(500,"无相关信息");
        }

        return  SmartResult.ok(staffs);
    }

这个代码返回的是SmartResult类(就是封装的返回的状态码,信息,数据)。注意这个类需要实例化
在这里插入图片描述

@Test
//测试的登录功能,这是数据库里面存在的
    void test4(){
        String s="4248058613162109822";
        staffService.staffLogin("1831520***","q12345***");
    }

由于我上面aaa是在自定义时间30min的缓存中,所以这里显示的是1800s左右
在这里插入图片描述
接下来再把aaa换成bbb的话![在这里插入图片描述](https://img-blog.csdnimg.cn/fd2fef62e414499ca467ca084b8bb5f5.png

注意看截图,默认设置的6min中即360s
在这里插入图片描述

本篇开头讲到了缓存值存在索引1里面,接下来看下结果
在这里插入图片描述

注意上面有个知识点得理解:就是比如我再次执行aaa的话,缓存时间不会被更新,而是等原本aaa的时间过期过后再吧aaa以k,v键值对的形式存进去。
因为缓存redis没有相应的更新策略

觉得可以的话大家可以给个赞吧。

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
SpringBoot+Mybatis+Redis+MySQL+Kafka技术栈的亮点如下: 1. Spring Boot:Spring Boot是一个快速开发框架,可以快速构建基于Spring的应用程序,它提供了很多默认配置和依赖项,可以快速启动和运行应用程序。 2. MyBatis:MyBatis是一个优秀的持久层框架,它可以简化Java程序员的数据库访问,它提供了灵活的SQL映射机制,可以将SQL语句映射到Java对象上。 3. RedisRedis是一个高性能的内存数据存储系统,它支持多种数据结构,如字符串、哈希、列表、集合和有序集合等,可以用来缓存数据、消息队列等。 4. MySQL:MySQL是一个流行的关系型数据库,它支持多种数据存储和查询方式,如SQL语言、事务、索引等。 5. Kafka:Kafka是一个分布式的消息队列系统,它可以处理大量的消息和数据流,可以用来实现异步消息处理、事件驱动等。 这些技术的结合,可以构建高性能、高可用的分布式系统,具有以下亮点: 1. 易于开发和维护:Spring Boot提供了默认配置和依赖项,可以快速启动和运行应用程序,MyBatis提供了灵活的SQL映射机制,可以简化数据库访问,Redis和MySQL提供了不同的数据存储方式,可以根据需要选择使用,Kafka可以实现消息处理和事件驱动,可以提高应用程序的性能和可用性。 2. 高性能:Redis是一个高性能的内存数据存储系统,可以用来缓存数据,MySQL支持多种索引和查询方式,可以提高数据查询的速度,Kafka可以处理大量的消息和数据流,可以提高应用程序的并发性能。 3. 高可靠性:Redis和MySQL都支持主从复制和故障转移,可以提高数据的可靠性和可用性,Kafka可以实现消息的复制和容错,可以提高消息的可靠性和可用性,Spring Boot提供了健康检查和容错机制,可以提高应用程序的可靠性和可用性。 4. 可扩展性:Redis可以通过集群方式扩展数据存储的能力,MySQL可以通过主从复制和分片方式扩展数据存储的能力,Kafka可以通过分区方式扩展消息处理的能力,Spring Boot可以通过微服务的方式扩展应用程序的能力。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值