Springboot2.x使用redis作為緩存


一、Springboot2.x關於配置redis作為緩存。

基本配置如下:

(1)在application.properties文件中

spring.redis.database=2 //第幾個數據庫,由於redis中數據庫不止一個
spring.redis.host=localhost // 也可指定為127.0.0.1
spring.redis.port=6379 // 默認端口
spring.redis.password= // 默認為空

# springboot2.x以上如此配置,由於2.x的客戶端是lettuce
# 單位要帶上 spring.redis.lettuce.pool.max
-active=8 spring.redis.lettuce.pool.min-idle=0 spring.redis.lettuce.pool.max-idle=8 spring.redis.lettuce.pool.max-wait=10000ms spring.redis.lettuce.shutdown-timeout=100ms # springboot1.x如此配置,由於1.x的客戶端是jedis #spring.redis.jedis.pool.max-active=8 #spring.redis.jedis.pool.min-idle=0 #spring.redis.jedis.pool.max-idle=8 #spring.redis.jedis.pool.max-wait=-1 #spring.redis.timeout=500

(2)在pom.xml中

<!--spring2.0集成redis所需common-pool2-->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-pool2</artifactId>
            <version>2.4.2</version>
        </dependency>
<!-- redis依賴,2.0以上使用這個依賴 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
<!-- 緩存依賴 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-cache</artifactId>
        </dependency>

(3)自定義緩存管理器RedisCacheConfig

package com.xf.spring_test.config;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cache.interceptor.KeyGenerator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheConfiguration;
import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.serializer.*;

import java.time.Duration;

@Configuration
@EnableCaching
public class RedisCacheConfig extends CachingConfigurerSupport {

    private static final Logger logger = LoggerFactory.getLogger(RedisCacheConfig.class);

    // 自定義key生成器
    @Bean
    public KeyGenerator keyGenerator(){
        return (o, method, params) ->{
            StringBuilder sb = new StringBuilder();
            sb.append(o.getClass().getName()); // 類目
            sb.append(method.getName()); // 方法名
            for(Object param: params){
                sb.append(param.toString()); // 參數名
            }
            return sb.toString();
        };
    }

    // 配置緩存管理器
    @Bean
    public RedisCacheManager cacheManager(RedisConnectionFactory connectionFactory) {
        RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
                .entryTtl(Duration.ofSeconds(60)) // 60s緩存失效
                // 設置key的序列化方式
                .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(keySerializer()))
                // 設置value的序列化方式
                .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(valueSerializer()))
                // 不緩存null值
                .disableCachingNullValues();

        RedisCacheManager redisCacheManager = RedisCacheManager.builder(connectionFactory)
                .cacheDefaults(config)
                .transactionAware()
                .build();

        logger.info("自定義RedisCacheManager加載完成");
        return redisCacheManager;
    }

  /*  @Bean
    public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory connectionFactory){
        RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(connectionFactory);
        redisTemplate.setKeySerializer(keySerializer());
        redisTemplate.setHashKeySerializer(keySerializer());
        redisTemplate.setValueSerializer(valueSerializer());
        redisTemplate.setHashValueSerializer(valueSerializer());
        logger.info("序列化完成!");
        return redisTemplate;
    }*/

    // key鍵序列化方式
    private RedisSerializer<String> keySerializer() {
        return new StringRedisSerializer();
    }

    // value值序列化方式
    private GenericJackson2JsonRedisSerializer valueSerializer(){
        return new GenericJackson2JsonRedisSerializer();
    }
}

(4)在service的實現類中加入需要的注解,即可實現緩存數據

package com.xf.spring_test.service.impl;

import com.xf.spring_test.dao.PersonDao;
import com.xf.spring_test.domain.Person;
import com.xf.spring_test.service.UserService;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class UserServiceImpl implements UserService {
    PersonDao personDao;

    public UserServiceImpl(PersonDao personDao) {
        this.personDao = personDao;
    }

    @Override
    @Cacheable(cacheNames = "user")
    public Person getUserById(Integer id) {
        return personDao.getUserById(id);
    }

    @Override
    @Cacheable(cacheNames = "users")
    public List<Person> getAllUser() {
        return personDao.getAllUser();
    }

    @Override
    @CachePut(cacheNames = "updateUser", condition = "#person!=null", unless = "#result>0")
    public Integer editUser(Person person) {
        return personDao.editUser(person);
    }

    @Override
    @CacheEvict(cacheNames = "delUser", allEntries = true, beforeInvocation = true,
    condition = "#userId>0")
    public Integer delUser(Integer userId) {
        return personDao.delUser(userId);
    }
}

 二、注意事項

(1)要緩存的JAVA對象必須實現Serailizable接口

(2)必須要配置RedisCacheManager 來管理緩存


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM