SpringBoot使用注解方式整合Redis

Posted 是柯南君

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringBoot使用注解方式整合Redis相关的知识,希望对你有一定的参考价值。

1.首先导入使用Maven导入jar包

<dependency>    
    <groupId>org.springframework.boot</groupId>    
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.62</version>
</dependency>

2.在application.properties配置信息

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

3.编写Redis工具类

@Configuration
@ConditionalOnClass(RedisOperations.class)      //系统中有RedisOperations类时
@EnableConfigurationProperties(RedisProperties.class)  //启动RedisProperties这个类
@EnableCaching
public class RedisConfig extends CachingConfigurerSupport {
    @Autowired
    RedisTemplate redisTemplate;
    // 配置缓存管理器
    @Bean
    public RedisCacheManager cacheManager(RedisConnectionFactory connectionFactory) {
        LettuceConnectionFactory jedisConnectionFactory = (LettuceConnectionFactory) redisTemplate.getConnectionFactory();
        jedisConnectionFactory.setDatabase(2);      //指定dbindex
        redisTemplate.setConnectionFactory(jedisConnectionFactory);
        jedisConnectionFactory.resetConnection();

        RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
                .entryTtl(Duration.ofSeconds(60*20)) // 20分钟缓存失效
                // 设置key的序列化方式
//                .entryTtl(Duration.ofSeconds(10))
                .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer()))
                // 设置value的序列化方式
                .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new FastJsonRedisSerializer(Object.class)))
                // 不缓存null值
                .disableCachingNullValues();
        RedisCacheManager redisCacheManager = RedisCacheManager.builder(connectionFactory)
                .cacheDefaults(config)
                .transactionAware()
                .build();
        return redisCacheManager;
    }
}
package com.FireService.config;

import java.nio.charset.Charset;

import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.data.redis.serializer.SerializationException;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.parser.ParserConfig;
import com.alibaba.fastjson.serializer.SerializerFeature;

public class FastJsonRedisSerializer<T> implements RedisSerializer<T> {

    public static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8");

    private Class<T> clazz;
    static {
        ParserConfig.getGlobalInstance().addAccept("com.FireService");
    }
    public FastJsonRedisSerializer(Class<T> clazz) {
        super();
        this.clazz = clazz;
    }

    @Override
    public byte[] serialize(T t) throws SerializationException {
        if (null == t) {
            return new byte[0];
        }
        return JSON.toJSONString(t, SerializerFeature.WriteClassName).getBytes(DEFAULT_CHARSET);
    }

    @Override
    public T deserialize(byte[] bytes) throws SerializationException {
        if (null == bytes || bytes.length <= 0) {
            return null;
        }
        String str = new String(bytes, DEFAULT_CHARSET);
        return (T) JSON.parseObject(str, clazz);
    }

}

4.SpringBoot有关缓存的几个注解

@Cacheable:查询

可选属性:

cacheNames/value:指定缓存组件的名字;

key:缓存数据使用的key,可以用来指定。默认即使用方法参数的值

keyGenerator:key的生成器,可以自己指定key的生成器的组件id

//自定义配置类配置keyGenerator
@Configuration
public class MyCacheConfig {
    @Bean("myKeyGenerator")
    public KeyGenerator keyGenerator(){
        return new KeyGenerator() {
            @Override
            public Object generate(Object target, Method method, Object... params) {
                return method.getName()+"["+ Arrays.asList(params).toString() +"]";
            }
        };
    }
}

cacheManager:指定缓存管理器;或者cacheResolver获取指定解析器

condition:指定符合条件的情况下才缓存;如condition="#id>0"

unless:否定缓存,当unless指定的条件为true,方法的返回值不会被缓存,可以获取到结果进行判断;如unless="#result==null";

sync:是否使用异步模式

例如:

@Cacheable(value = "RedisInfo", key = "#root.methodName+\'[\'+#account+\']\'")
@ResponseBody
@RequestMapping("/RedisTest")
public Result findUserOrder(String account) throws Exception{
    if(account!=null) {
        List<Map<String, Object>> list=orderFindGoods.findUserOrder(account);
        return Results.successWithData(list, BaseEnums.SUCCESS.code(), BaseEnums.SUCCESS.desc());
    }else {
        return Results.failure();
    }
}

运行项目查看结果

1.第一次访问

 

 

 查看Druid连接信息

 

 

 

可以看出当前执行sql语句为一次

再一次刷新页面

 

 此时使用RedisDestopManager查看数据

 

 

成功!!

@CachePut:更新

既调用方法,又更新缓存数据,可达到同步更新缓存;

修改了数据库的某个数据,同时更新缓存

运行时机:

1、先调用运行方法;

2、将目标方法的结果缓存起来

value:缓存名 key:缓存的key其中#result表示方法返回的结果(确保更新的key和查询一致即可做到同时更新数据库数据和缓存中的数据)

@CachePut(value="user",key = "#result.id")
    public User updateUser(User user){
        System.out.println("updateUser:"+user);
        userMapper.updateUser(user);
        return user;
}

@CacheEvict:删除

缓存清除:目的是为了删除一个数据并删掉缓存

key:指定要清除的数据(对应上key可实现目的即同时做到删除数据库和缓存中的数据)

allEntries =true:指定清楚这个缓存中所有的数据

beforeInvocation = false:缓存的清楚是否在方法之前执行,默认代表是在方法之后执行

@CacheEvict(value = "user",key = "#id")
    public void deleteUser(Integer id){
        System.out.println("deleteUser:"+id);
        userMapper.deleteUserById(id);
    }

具体代码我就不写了。大家可以自己尝试一下!

以上是关于SpringBoot使用注解方式整合Redis的主要内容,如果未能解决你的问题,请参考以下文章

SpringSecurity注解鉴权(整合springboot,jwt,redis)

springboot整合mybatis,redis,代码

八springboot整合redis

springboot整合mybatis,redis,代码

SpringBoot整合SpringSeesion实现Redis缓存

springboot+springcache+shiro+Redis整合时@Cacheable@Transactional等注解失效的问题