Spring Boot—19Cache

Posted ParamousGIS

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring Boot—19Cache相关的知识,希望对你有一定的参考价值。

pom.xml

<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>
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-pool2</artifactId>
    <version>2.5.0</version>
</dependency>


application.properties


#
server.address=0.0.0.0
server.port=8080
server.servlet.context-path=/test
server.session.timeout=300
server.error.path=/error
#
server.tomcat.accesslog.enabled=true
server.tomcat.accesslog.buffered=true
server.tomcat.accesslog.directory=D:/Project/JavaWeb/SpringBoot/04JPASpringBoot/logs
#
spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
spring.jackson.time-zone=Asia/Shanghai
#
spring.thymeleaf.cache=true
spring.thymeleaf.enabled=true

file.upload.path=D:/Project/JavaWeb/SpringBoot/04JPASpringBoot/fileUpLoad

spring.servlet.multipart.enabled=true
spring.servlet.multipart.file-size-threshold=0
spring.servlet.multipart.location=D:/Project/JavaWeb/SpringBoot/04JPASpringBoot/temp
spring.servlet.multipart.max-file-size=10MB
spring.servlet.multipart.max-request-size=10MB
spring.servlet.multipart.resolve-lazily=false


spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.druid.one.url=jdbc:mysql://127.0.0.1:3306/test?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8&useSSL=false
spring.datasource.druid.one.username=root
spring.datasource.druid.one.password=gis
spring.datasource.druid.one.driver-class-name=com.mysql.cj.jdbc.Driver

##Druid
spring.datasource.druid.one.initial-size=2
spring.datasource.druid.one.max-active=5
spring.datasource.druid.one.min-idle=1
spring.datasource.druid.one.max-wait=60000
spring.datasource.druid.one.pool-prepared-statements=true
spring.datasource.druid.one.max-pool-prepared-statement-per-connection-size=20
spring.datasource.druid.one.validation-query=SELECT 1 FROM DUAL
spring.datasource.druid.one.validation-query-timeout=60000
spring.datasource.druid.one.test-on-borrow=false
spring.datasource.druid.one.test-on-return=false
spring.datasource.druid.one.test-while-idle=true
spring.datasource.druid.one.time-between-eviction-runs-millis=60000
spring.datasource.druid.one.min-evictable-idle-time-millis=100000
#spring.datasource.druid.one.max-evictable-idle-time-millis=
spring.datasource.druid.one.filters=stat,wall,log
spring.datasource.druid.one.logSlowSql=true

#
# debug=true # Enable debug logs.
# trace=true # Enable trace logs.

# LOGGING
logging.config=classpath:logback.xml

spring.redis.host=127.0.0.1
spring.redis.password=gis
spring.redis.port=6379
spring.redis.pool.max-active=8
spring.redis.jedis.pool.max-active=8
spring.redis.jedis.pool.max-idle=8
spring.redis.jedis.pool.max-wait=-1ms
spring.redis.jedis.pool.min-idle=0
spring.redis.lettuce.pool.max-active=8
spring.redis.lettuce.pool.max-idle=8
spring.redis.lettuce.pool.max-wait=-1ms
spring.redis.lettuce.pool.min-idle=0
spring.redis.lettuce.shutdown-timeout=100ms
spring.redis.ssl=false
spring.redis.timeout=5000

redis.message.topic=spring.news.*

# Cache
spring.cache.type=Redis
spring.cache.redis.cache-null-values=true
spring.cache.redis.key-prefix=spring:cache:
spring.cache.redis.time-to-live=0ms
spring.cache.redis.use-key-prefix=true


启动类

package com.smartmap.sample.test;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.transaction.annotation.EnableTransactionManagement;

@EnableCaching
@EnableTransactionManagement
@SpringBootApplication
public class TestCacheApplication {

    public static void main(String[] args) {
        SpringApplication.run(TestCacheApplication.class, args);

    }

}


配置类

package com.smartmap.sample.test.conf;

import org.springframework.beans.factory.annotation.Value;
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.cache.RedisCacheManager.RedisCacheManagerBuilder;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializationContext;
import org.springframework.data.redis.serializer.RedisSerializationContext.SerializationPair;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;

@Configuration
public class RedisCacheManagerCustomizer {

    @Value("${spring.cache.redis.key-prefix}")
    private String keyPrefix;

    @Bean
    public RedisCacheConfiguration redisCacheConfiguration() {        
        GenericJackson2JsonRedisSerializer genericJackson2JsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
        return RedisCacheConfiguration.defaultCacheConfig()
                .serializeKeysWith(
                        RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer()))
                .serializeValuesWith(
                        RedisSerializationContext.SerializationPair.fromSerializer(genericJackson2JsonRedisSerializer))
                .prefixKeysWith(keyPrefix);
    }

    /*@Bean
    public RedisCacheManager getRedisCacheManager(RedisConnectionFactory connectionFactory) {

        RedisCacheManagerBuilder redisCacheManagerBuilder = RedisCacheManagerBuilder.fromConnectionFactory(connectionFactory);
        RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig();
        // Key
        RedisSerializer<String> redisSerializerKey = new StringRedisSerializer();
        SerializationPair<String> serializationPairKey = SerializationPair.fromSerializer(redisSerializerKey);
        // Value
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<Object>(
                Object.class);
        jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
        //
        GenericJackson2JsonRedisSerializer genericJackson2JsonRedisSerializer = new GenericJackson2JsonRedisSerializer(
                objectMapper);
        //RedisSerializer<Object> redisSerializerValue = jackson2JsonRedisSerializer; 
        //
        RedisSerializer<Object> redisSerializerValue = genericJackson2JsonRedisSerializer;
        //
        SerializationPair<Object> serializationPairValue = SerializationPair.fromSerializer(redisSerializerValue);
        //RedisSerializationContext.SerializationPair<Object> serializationPairValue = RedisSerializationContext.SerializationPair.fromSerializer(redisSerializerValue); //
        redisCacheConfiguration.serializeKeysWith(serializationPairKey);
        redisCacheConfiguration.serializeValuesWith(serializationPairValue);
        redisCacheManagerBuilder.cacheDefaults(redisCacheConfiguration);
        RedisCacheManager redisCacheManager = redisCacheManagerBuilder.build(); //
        return redisCacheManager;
    }*/

}



实体类 Menu

package com.smartmap.sample.test.entity;

public class Menu {
    Long id;
    String code;
    String name;
    Long parentId;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Long getParentId() {
        return parentId;
    }

    public void setParentId(Long parentId) {
        this.parentId = parentId;
    }
}


实体类 MenuNode

package com.smartmap.sample.test.entity;

import java.util.ArrayList;
import java.util.List;

import com.fasterxml.jackson.annotation.JsonIgnore;

public class MenuNode {
    private Menu menu;
    private List<MenuNode> children = new ArrayList<MenuNode>();
    @JsonIgnore
    private MenuNode parent;

    public Menu getMenu() {
        return menu;
    }

    public void setMenu(Menu menu) {
        this.menu = menu;
    }

    public List<MenuNode> getChildren() {
        return children;
    }

    public void setChildren(List<MenuNode> children) {
        this.children = children;
    }

    public MenuNode getParent() {
        return parent;
    }

    public void setParent(MenuNode parent) {
        this.parent = parent;
    }

}


缓存应用


package com.smartmap.sample.test.service.impl;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.cache.annotation.Caching;
import org.springframework.stereotype.Service;

import com.smartmap.sample.test.entity.Menu;
import com.smartmap.sample.test.entity.MenuNode;
import com.smartmap.sample.test.service.MenuService;

@Service
public class MenuServiceImpl implements MenuService {
    Log log = LogFactory.getLog(this.getClass());

    /**
     * 清除缓存
     */
    @CacheEvict(cacheNames = { "menu", "menuTree" }, allEntries = true)
    public void addMenu(Menu menu) {

    }

    /**
     * 添加缓存(含条件)
     */
    @Cacheable(cacheNames = "menu", key = "‘menu:‘ + {#id}", condition = "#id > 0")
    public Menu getMenu(Long id) {
        log.info("call service getMenu " + id);
        // 模拟
        Menu menu = new Menu();
        menu.setCode("test");
        menu.setId(id);
        menu.setName("菜单" + id);
        menu.setParentId(1l);

        return menu;
    }

    /**
     * 添加缓存
     */
    @Cacheable(cacheNames = "menuTree", key = "‘menuTree‘")
    public MenuNode getMenuTree() {

        log.info("call menu tree ");
        Menu root = new Menu();
        root.setCode("root");
        root.setId(1l);
        root.setName("系统管理");
        root.setParentId(null);

        Menu menu = new Menu();
        menu.setCode("menu");
        menu.setId(1l);
        menu.setName("菜单管理");
        menu.setParentId(1l);

        MenuNode tree = new MenuNode();
        tree.setMenu(root);
        tree.setParent(null);

        MenuNode menuTree = new MenuNode();
        menuTree.setMenu(menu);
        menuTree.setParent(tree);
        tree.getChildren().add(menuTree);

        return tree;

    }

    /**
     * 更新缓存
     */
    @CachePut(cacheNames = "menu", key = "‘menu:‘ + {#menu.id}")
    public Menu update(Menu menu) {
        return menu;
    }

    /**
     * 组合处理多种缓存
     * 
     * @param menu
     */
    @Caching(evict = { @CacheEvict(cacheNames = { "menu" }, allEntries = true),
            @CacheEvict(cacheNames = { "menuTree" }, allEntries = true) })
    public void updateCascading(Menu menu) {

    }
}


Controller类

package com.smartmap.sample.test.controller.rest;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.smartmap.sample.test.entity.Menu;
import com.smartmap.sample.test.entity.MenuNode;
import com.smartmap.sample.test.service.MenuService;

@RestController
@RequestMapping("/api/v1.1/system/menu")
public class MenuController {
    private final Log logger = LogFactory.getLog(MenuController.class);

    @Autowired
    MenuService menuService;
    
    /**
     * curl -XPOST ‘http://127.0.0.1:8080/test/api/v1.1/system/menu/‘
     * -H‘Content-type:application/json;charset=UTF-8‘ -d ‘ { "id":123, "code":"menuCode1", "name":"123" }‘
     * 
     * @return
     * @throws Exception
     */
    @PostMapping("/") 
    public String addMenu(@RequestBody Menu menu) throws Exception{
        menuService.addMenu(menu);
        //模拟改变缓存
        return "{\"success\":true}";
    }
    
    /**
     * curl -XGET ‘http://127.0.0.1:8080/test/api/v1.1/system/menu/123‘
     * 
     * @param menuId
     * @return
     * @throws Exception
     */
    @GetMapping("/{menuId}") 
    public Menu getMenu(@PathVariable("menuId") Long menuId) throws Exception{
        return menuService.getMenu(menuId);
    }
    
    /**
     * curl -XGET ‘http://127.0.0.1:8080/test/api/v1.1/system/menu/tree‘
     * 
     * @return
     * @throws Exception
     */
    @GetMapping("/tree") 
    public MenuNode getMenuTree() throws Exception{
        return menuService.getMenuTree();
    }
    
    
}










以上是关于Spring Boot—19Cache的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Spring Boot 中将 Cache-Control 标头添加到静态资源?

Spring Boot集成Spring Cache 和 Redis

史上最全的Spring Boot Cache使用与整合

史上最全的Spring Boot Cache使用与整合

最全面的Spring-Boot-Cache使用与整合

史上最全面的Spring Boot Cache使用与整合