springboot+ehcache 实现本地缓存

一、简介
EHCache是一个快速的、轻量级的、易于使用的、进程内的缓存。它支持read-only 和 read/write 缓存,内存和磁盘缓存。

二、使用

pom.xml文件:

    <dependency>
      <groupId>org.ehcachegroupId>
      <artifactId>ehcacheartifactId>
      <version>3.5.2version>
    dependency> 

application.properties文件:

#  ehcache配置文件地址
spring.cache.ehcache.config=classpath:ehcache.xml
spring.cache.type=ehcache

XXXApplication.java

@SpringBootApplication
@EnableCaching//开启缓存
@PropertySource("application.properties")
public class XXXApplication extends SpringBootServletInitializer {

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(XXXApplication.class);
    }

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

ehcache.xml文件:


<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"
         updateCheck="false"
         name="myEhcache">
    <diskStore path="java.io.tmpdir/Tmp_EhCache"/>
    <defaultCache eternal="false"
                  maxElementsInMemory="1000"
                  overflowToDisk="false"
                  diskPersistent="false"
                  timeToIdleSeconds="0"
                  timeToLiveSeconds="600"
                  memoryStoreEvictionPolicy="LRU"/>
    <cache name="user"
           eternal="false"
           maxElementsInMemory="10000"
           overflowToDisk="false"
           diskPersistent="false"
           timeToIdleSeconds="0"
           timeToLiveSeconds="0"
           memoryStoreEvictionPolicy="LFU"/>
    
ehcache>

操作DAO的Java文件


@Service("UserService")
//对应ehcache.xml文件里面的
@CacheConfig(cacheNames = "user")
public class UserServiceImpl implements UserService {

    @Autowired
    private UserRepository userRepository;

    @Override
    //无论怎样,都将方法的返回结果放到缓存当中。
    //ehcache3 会自动处理要缓存的key-value里面的key
    @CachePut
    public void save(User user) {
        System.out.println("新增功能,更新缓存,直接写库, id=" + user);
        userRepository.save(user);
    }

    @Override
    @CachePut
    public void update(User user) {
        System.out.println("更新功能,更新缓存,直接写库, id=" + user);
        userRepository.save(user);
    }

    @Override
    //将一条或者多条数据从缓存中删除。
    @CacheEvict
    public void remove(Long userId) throws Exception {
        System.out.println("删除功能,删除缓存,直接写库, id=" + userId);
        userRepository.deleteById(userId);
    }

    @Override
    @CacheEvict
    public void batchRemove(Long[] userIds) throws Exception {
        for (Long userId : userIds) {
            userRepository.deleteById(userId);
        }
    }

    @Override
    public List getUserList() {
        return userRepository.findAll();
    }

    @Override
    public User findByUsername(String username) {
        return userRepository.findByUsername(username);
    }

    @Override
    //在方法执行前Spring先是否有缓存数据,如果有直接返回。如果没有数据,调用方法并将方法返回值存放在缓存当中。
    @Cacheable
    public User findById(long id) {
        System.out.println("查询功能,缓存找不到,直接读库, id=" + id);
        return userRepository.findById(id);
    }
}



你可能感兴趣的:(缓存,SpringBoot,springboot学习之路)