1. 程式人生 > >Intellij IDEA 搭建Spring Boot專案(三)配置事務和Redis快取

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配置類)的目錄結構圖如下圖所示:
image.png

我們在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());
    }
}

我們看下輸入的結果:

image.png

三、遇到的bug

剛開始沒了解redis是什麼,只是感覺是是一個快取,並沒想到需要各種配置–>導致沒有沒有開啟redis–server,在測試的時候會報
Could not get a resource from the pool的錯誤,在配置好redis的相關之後並啟動之後再次執行時可以正常執行的。

springboot測試專案地址

相關連結文章