spring 自带的缓存的使用

本文介绍了一种利用Spring框架内置缓存功能减少数据库访问频率的方法。通过缓存表名避免重复查询,介绍了配置文件spring-cache-anno.xml的具体设置,以及Controller和服务层如何实现缓存的读取和更新。
摘要由CSDN通过智能技术生成

从未见过写得这么简单、详细的文章,spring的缓存大家可以参考
https://www.ibm.com/developerworks/cn/opensource/os-cn-spring-cache/
以下是我根据这篇文章,结合自己项目的一些经验

 根据项目需求,上次的微博也有提到,有几张表的数据量太大,随意需要做分表。在插入数据的时候,要判断这张表在数据库是否存在。每次都去查询数据库太浪费资源,所以这次的目的是将表名写入到spring自带的缓存。废话不多说,直接上代码:

新加spring-cache-anno.xml

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:cache="http://www.springframework.org/schema/cache"
    xmlns:p="http://www.springframework.org/schema/p"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans.xsd 
    http://www.springframework.org/schema/cache 
    http://www.springframework.org/schema/cache/spring-cache.xsd">

    <cache:annotation-driven />

    <!-- generic cache manager -->
    <bean id="cacheManager" class="org.springframework.cache.support.SimpleCacheManager">
        <property name="caches">
            <set>
                <bean
                    class="org.springframework.cache.concurrent.ConcurrentMapCacheFactoryBean"
                    p:name="default" />

                <bean
                    class="org.springframework.cache.concurrent.ConcurrentMapCacheFactoryBean"
                    p:name="accountCache" />
            </set>
        </property>
    </bean>
</beans>

然后在springxxx中引入
<import resource="classpath*:spring-cache-anno.xml" ></import>

controller:
//根据传入的时间参数获取对应的表名
String tableName = xxxService.getTableNameByDate(new Date());

//从缓存中获取所有以"visit_history_"开头的表名,并放入缓存中,如果缓存已存在,就不查询数据库
    List<String> tableNameList = tjscVisitBuyHistoryService.getTableNameListCache();
//表名不存在,则创建该表,并刷新缓存
if (tableNameList == null || !tableNameList.contains(tableName)) {
xxxService.createTable(tableName);
xxxService.updateTableNameListCache();
}
service:

import org.springframework.cache.annotation.Cacheable;
import org.springframework.cache.annotation.CacheEvict;

    //根据日期返回表名
    public String getTableNameByDate(Date date) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        String calendarMounth = null;
        //日历获取的月份为0-11,所以这里加1
        if (calendar.get(Calendar.MONTH) < 9) {
            calendarMounth = "0" + (calendar.get(Calendar.MONTH) + 1);
        }
        else {
            calendarMounth = String.valueOf((calendar.get(Calendar.MONTH) + 1));
        }
        String tableName = preTableName + calendar.get(Calendar.YEAR) + calendarMounth;

        return tableName;
}

    //使用了一个缓存名叫 accountCache

    /*@Cacheable(value=”accountCache”),
    这个注释的意思是,当调用这个方法的时候,会从一个名叫 accountCache 
    的缓存中查询,如果没有,则执行实际的方法(即查询数据库),
    并将执行的结果存入缓存中,否则返回缓存中的对象*/

    @Cacheable(value = "accountCache")
    public List<String> getTableNameListCache() {
        return getTableNameListFromDB();
    }

    // 更新accountCache 缓存 
    @CacheEvict(value="accountCache")
    public void updateTableNameListCache() {
        updateTableNameListFromDB();
    }

    private List<String> getTableNameListFromDB() {

    //从数据库获取表名,具体sql是
     /*SELECT table_name FROM information_schema.`tables` WHERE TABLE_SCHEMA='mydb' AND table_name LIKE 'visit_history%_'*/

        return xxxMapper.getTableNameList();
    }

    private void updateTableNameListFromDB() {
    //从数据库获取表名
        xxxMapper.getTableNameList();
    }
第一次访问的时候tableNameList会从数据库中获取,后续除了更新缓存,再也没有数据库的查询操作~
是的,Spring Framework 提供了多种全局缓存的实现,最常用的是基于 Spring Cache 抽象的缓存实现。Spring Cache 抽象定义了缓存注解和缓存操作 API,可以方便地通过声明式或编程式的方式来使用缓存Spring Cache 抽象支持多种缓存实现,包括: 1. ConcurrentMapCache:基于 ConcurrentHashMap 实现的本地缓存实现,适用于单机环境。 2. EhCacheCacheManager:基于 Ehcache 实现的缓存管理器,适用于单机或集群环境。 3. RedisCacheManager:基于 Redis 实现的缓存管理器,适用于单机或集群环境。 4. CaffeineCache:基于 Caffeine 实现的本地缓存实现,适用于单机环境。 等等。 使用 Spring Cache 抽象,只需在方法上添加缓存注解,如 @Cacheable、@CachePut、@CacheEvict 等,即可进行缓存操作。以下是一个使用 Spring Cache 抽象的示例: ```java import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Service; @Service public class UserServiceImpl implements UserService { @Override @Cacheable(value = "users", key = "#id") public User getUserById(Long id) { // 从数据库中获取用户信息 return userDao.getUserById(id); } } ``` 在上述示例中,@Cacheable 注解表示该方法结果可以被缓存,value 参数表示缓存名称,key 参数表示缓存键值,可以使用 SpEL 表达式来生成。当调用 getUserById 方法时,如果缓存中存在对应的值,则直接返回缓存中的值,否则从数据库中获取,并将结果存入缓存中。 需要注意的是,在使用 Spring Cache 抽象时,需要在 Spring 配置文件中配置缓存管理器和缓存实现,具体配置方式可以参考 Spring 官方文档。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值