美文网首页
Spring Cache实现数据缓存

Spring Cache实现数据缓存

作者: 二枚目 | 来源:发表于2018-10-23 17:42 被阅读28次

很多场景都会用到缓存来提高性能,Spring 的缓存(Cache)技术从3.1开始引入,其使用方法和原理都类似于Spring对事务管理的支持。Spring Cache是作用在方法上的,缓存原理:当我们在调用一个缓存方法时会把该方法参数和返回结果作为一个键值对存放在缓存中,等到下次利用同样的参数来调用该方法时将不再执行该方法,而是直接从缓存中获取结果进行返回。所以在使用Spring Cache的时候我们要保证我们缓存的方法对于相同的方法参数要有相同的返回结果。

使用 Spring Cache 需要引入支持缓存的依赖以及注解配置支持。Demo步骤如下:
Maven中引入如下依赖:

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-cache</artifactId>
        </dependency>
    </dependencies>

创建一个简单的实体类模型(Book):

public class Book {

    private String isbn;
    private String title;

    public Book(String isbn, String title) {
        this.isbn = isbn;
        this.title = title;
    }

    public String getIsbn() {
        return isbn;
    }

    public void setIsbn(String isbn) {
        this.isbn = isbn;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    @Override
    public String toString() {
        return "Book{" + "isbn='" + isbn + '\'' + ", title='" + title + '\'' + '}';
    }

}

以及该模型的存储库(BookRepository):

public interface BookRepository {

    Book getByIsbn(String isbn);

}

可以使用各种SQL或NoSQL存储上实现存储库的实现,但出测试缓存的目的,这里将简单地使用模拟某些延迟的实现(网络服务延迟等)。simulateSlowService 故意在每次 getByIsbn 的调用中插入三秒延迟。稍后将用使用缓存对比效果。

@Component
public class SimpleBookRepository implements BookRepository {

    @Override
    public Book getByIsbn(String isbn) {
        simulateSlowService();
        return new Book(isbn, "Some book");
    }

    // Don't do this at home
    private void simulateSlowService() {
        try {
            long time = 3000L;
            Thread.sleep(time);
        } catch (InterruptedException e) {
            throw new IllegalStateException(e);
        }
    }

}

编写下面的程序并运行主程序程序Application,控制台输出如下检索的6次信息,会发现即使多次检索完全相同的书,它的速度也很慢。

@Component
public class AppRunner implements CommandLineRunner {

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

    private final BookRepository bookRepository;

    public AppRunner(BookRepository bookRepository) {
        this.bookRepository = bookRepository;
    }

    @Override
    public void run(String... args) throws Exception {
        logger.info(".... Fetching books");
        logger.info("isbn-1234 -->" + bookRepository.getByIsbn("isbn-1234"));
        logger.info("isbn-4567 -->" + bookRepository.getByIsbn("isbn-4567"));
        logger.info("isbn-1234 -->" + bookRepository.getByIsbn("isbn-1234"));
        logger.info("isbn-4567 -->" + bookRepository.getByIsbn("isbn-4567"));
        logger.info("isbn-1234 -->" + bookRepository.getByIsbn("isbn-1234"));
        logger.info("isbn-1234 -->" + bookRepository.getByIsbn("isbn-1234"));
    }

}
图片.png

启用缓存,使用 Spring Cache 在 SimpleBookRepository 的 getByIsbn() 方法上加上注解 @Cacheable("books") 可以将书籍缓存在books缓存中。启动器也需要加上缓存注解@EnableCaching,该注释触发后处理器检查每个的Spring bean缓存标注的公共方法是否存在。如果找到这样的注释,则自动创建代理以拦截方法调用并相应地处理缓存行为。
再一次运行程序,会发现除第一次需要3s时间,其他的检索都是秒出。


图片.png

相关文章

  • spring cache + redis 实现系统缓存

    spring cache定义了缓存接口,redis则作为缓存的实现 1.引入 spring cache 和 red...

  • SpringBoot配置属性-NOSQL

    cache spring.cache.cache-names 指定要创建的缓存的名称,逗号分隔(若该缓存实现支持的...

  • SpringBoot配置属性之NOSQL

    cache spring.cache.cache-names指定要创建的缓存的名称,逗号分隔(若该缓存实现支持的话...

  • 阿里开源的缓存框架JetCache

    之前一直在用Spring Cache进行接口数据的缓存,主要是Spring Cache在对具体key缓存失效时间的...

  • Spring Cache实现数据缓存

    很多场景都会用到缓存来提高性能,Spring 的缓存(Cache)技术从3.1开始引入,其使用方法和原理都类似于S...

  • Spring cache

    Spring Cache本身是一个缓存体系的抽象实现,并没有具体的缓存能力,要使用Spring Cache还需要具...

  • 4、spring-boot使用cache

    spring cache cache 缓存就是数据交换的缓冲区(称作Cache),当某一硬件要读取数据时,会首先从...

  • Spring Cache缓存框架

    一、序言 Spring Cache是Spring体系下标准化缓存框架。Spring Cache有如下优势: 缓存品...

  • Spring Cache缓存框架

    一、序言 Spring Cache是Spring体系下标准化缓存框架。Spring Cache有如下优势: 缓存品...

  • 2019-10-01 关于springboot里面的CacheM

    Spring Cache是基于AOP切面和注解来实现缓存的。核心类为Cache和CacheManager。 前者用...

网友评论

      本文标题:Spring Cache实现数据缓存

      本文链接:https://www.haomeiwen.com/subject/qnuazftx.html