Intellij IDEA 搭建Spring Boot项目配置事务和Redis缓存

Posted 若兰明月

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Intellij IDEA 搭建Spring Boot项目配置事务和Redis缓存相关的知识,希望对你有一定的参考价值。

Intellij IDEA 搭建Spring Boot项目 –>配置事务和Redis缓存

标签(空格分隔): SpringBoot JAVA后台


一、开始配置事物

类似我们前一篇配置spring-dao的时候,我们可以看见在ssm中配置事物的时候是如下配置的

    //这个不需要我们在进行配置  因为当我们@Configuration的时候  会全package扫描的  
 <!-- 扫描service包下所有使用注解的类型 -->
    <context:component-scan base-package="com.ruolan.o2o.service" />

    <!-- 配置事务管理器 -->
    <bean id="transactionManager"
        class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <!-- 注入数据库连接池 -->
        <property name="dataSource" ref="dataSource" />
    </bean>

    <!-- 配置基于注解的声明式事务 -->
    <tx:annotation-driven transaction-manager="transactionManager" />

因此我们需要创建一个TransactionManagementConfiguration类

@Configuration
//首先使用注解@EnableTransactionManagement 开启事务支持后
//在Service方法上添加@Transactional就可以
@EnableTransactionManagement
public class TransactionManagementConfiguration implements TransactionManagementConfigurer 

    @Autowired
    //注入DataSourceConfiguration里面的dataSource 通过createDataSource获取
    private DataSource dataSource;

    /**
     * 关于事务管理  需要返回PlatformTransactionManager
     *
     * @return PlatformTransactionManager
     */
    @Override
    public PlatformTransactionManager annotationDrivenTransactionManager() 
        return new DataSourceTransactionManager(dataSource);
    

二、配置redis缓存

我们下面的两个类就是相关的redis缓存工具类

在application.peoperties文件中添加以下关于redis的相关配置

#redis缓存的相关配置
#host
redis.hostname=127.0.0.1
#redis端口号  默认6379
redis.port=6379
redis.database=0
redis.pool.maxActive=600
redis.pool.maxIdle=300
redis.pool.maxWait=3000
redis.pool.testOnBorrow=true

类似数据连接池的创建,创建RedisConfiguration配置类


@Configuration
public class RedisConfiguration 

    @Value("$redis.hostname")
    private String hostname;

    @Value("$redis.port")
    private int port;

    @Value("$redis.database")
    private int database;

    @Value("$redis.pool.maxActive")
    private int maxActive;

    @Value("$redis.pool.maxIdle")
    private int maxIdle;

    @Value("$redis.pool.maxWait")
    private long maxWait;

    @Value("$redis.pool.testOnBorrow")
    private boolean testOnBorrow;

    @Autowired
    private JedisPoolConfig jedisPoolConfig;

    @Autowired
    private JedisPoolWriper jedisPoolWriper;

    @Autowired
    private JedisUtil jedisUtil;

    @Bean(name = "jedisPoolConfig")
    public JedisPoolConfig createJedisPoolConfig() 
        JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
        //控制一个pool可以分配的多少个jedis实例
        jedisPoolConfig.setMaxTotal(maxActive);
        //连接池中最多可空闲的maxIdle个连接  这里取值20
        //表示即使没有数据库连接时候依然可以保持20个空闲的连接  而不被清除 随时处于待命状态
        jedisPoolConfig.setMaxIdle(maxIdle);
        //最大等待时间:当没有可以用的连接的时候  连接池等待连接被归还的最大时间(以毫秒技术)  超过时间则抛出异常
        jedisPoolConfig.setMaxWaitMillis(maxWait);
        //在获取连接的时候检查有效性
        jedisPoolConfig.setTestOnBorrow(testOnBorrow);
        return jedisPoolConfig;
    

    @Bean(name = "jedisPoolWriper")
    public JedisPoolWriper createJedisPoolWriper() 
        JedisPoolWriper jedisPoolWriper = new JedisPoolWriper(jedisPoolConfig, hostname, port);
        return jedisPoolWriper;
    

    /**
     * 创建Redis工具类  封装好Redis的连接以进行相关操作
     *
     * @return
     */
    @Bean(name = "jedisUtil")
    public JedisUtil createJedisUtil() 
        JedisUtil jedisUtil = new JedisUtil();
        jedisUtil.setJedisPool(jedisPoolWriper);
        return jedisUtil;
    

    @Bean(name = "jedisKeys")
    public JedisUtil.Keys createJedisKeys() 
        JedisUtil.Keys jedisKeys = jedisUtil.new Keys();
        return jedisKeys;
    

    @Bean(name = "jedisStrings")
    public JedisUtil.Strings createJedisStrings() 
        JedisUtil.Strings jedisStrings = jedisUtil.new Strings();
        return jedisStrings;
    

    @Bean(name = "jedisLists")
    public JedisUtil.Lists createJedisLists() 
        JedisUtil.Lists jedisLists = jedisUtil.new Lists();
        return jedisLists;
    

    @Bean(name = "jedisSets")
    public JedisUtil.Sets createJedisSets() 
        JedisUtil.Sets jedisSets = jedisUtil.new Sets();
        return jedisSets;
    

    @Bean(name = "jedisHash")
    public JedisUtil.Hash createJedisHash() 
        JedisUtil.Hash jedisHash = jedisUtil.new Hash();
        return jedisHash;
    

上述两个类(事务和Redis配置类)的目录结构图如下图所示:

我们在service里面这样使用Redis缓存,代码如下:

 @Autowired
    private JedisUtil.Strings jedisStrings;


    // Redis的安装和配置      启动之后再来运行这个是可以的  也就是走缓存了
    //    https://www.jianshu.com/p/6b5eca8d908b


    @Autowired
    private JedisUtil.Keys jedisKeys;

    @Autowired
    private AreaDao areaDao;

    private static String AREALISTKEY = "arealist";

    @Override
    public List<Area> getAreaList() throws IOException 
        String key = AREALISTKEY;
        List<Area> areaList = null;
        ObjectMapper mapper = new ObjectMapper();
        //判断是否有缓存
        if (!jedisKeys.exists(key)) 
            //没哟缓存  则查询数据库
            areaList = areaDao.queryArea();
            String jsonString = mapper.writeValueAsString(areaList);
            jedisStrings.set(key, jsonString);
         else 
            //有缓存  这个时候从缓存中通过key获取到缓存的数据  然后转换为我们需要的数据
            String jsonString = jedisStrings.get(key);
            JavaType javaType = mapper.getTypeFactory()
                    .constructParametricType(ArrayList.class, Area.class);
            areaList = mapper.readValue(jsonString, javaType);
        
        return areaList;
    

测试service


//测试类加入如下的两个注解
@RunWith(SpringRunner.class)
@SpringBootTest
public class AreaServiceTest 

    @Autowired
    private AreaService areaService;

    // Redis的安装和配置      启动之后再来运行这个是可以的  也就是走缓存了
    //    https://www.jianshu.com/p/6b5eca8d908b

    @Test
    public void testGetAreaList() throws IOException 
        List<Area> areaList = areaService.getAreaList();
        System.out.println("查询出来的地区集合的个数是:" + areaList.size());
    

我们看下输入的结果:

三、遇到的bug

刚开始没了解redis是什么,只是感觉是是一个缓存,并没想到需要各种配置–>导致没有没有开启redis–server,在测试的时候会报
Could not get a resource from the pool的错误,在配置好redis的相关之后并启动之后再次运行时可以正常运行的。

springboot测试项目地址

相关链接文章

以上是关于Intellij IDEA 搭建Spring Boot项目配置事务和Redis缓存的主要内容,如果未能解决你的问题,请参考以下文章

Intellij IDEA 搭建Spring Boot项目配置事务和Redis缓存

使用intellij idea搭建MAVEN+SSM(Spring+SpringMVC+MyBatis)框架

项目笔记: 使用intellij idea搭建MAVEN+SSM(Spring+SpringMVC+MyBatis)框架

详解intellij idea搭建SSM框架(spring+maven+mybatis+mysql+junit)(上)

IntelliJ IDEA 2017版 spring-boot 2.0.3 邮件发送搭建,概念梳理

IntelliJ IDEA 2017版 spring-boot 2.0.3 邮件发送搭建,概念梳理