1. 程式人生 > 實用技巧 >SpringBoot中配置檔案讀取

SpringBoot中配置檔案讀取

spring boot整合mybatis+mysql

一新增jar包

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

二在application.properties檔案中新增redis連線配置資訊

#redis配置
spring.redis.database=0
spring.redis.host=localhost
spring.redis.port=6379
spring.redis.client-name=
spring.redis.password=
spring.redis.lettuce.pool.max-active=8
spring.redis.lettuce.pool.max-wait=1
spring.redis.lettuce.pool.max-idle=8
spring.redis.lettuce.pool.min-idle=0

三 實體類實現序列化介面

package cn.lgy.springboot.redis.domain;

import java.io.Serializable;

/**
 * @author liyang
 * @date 2020/8/16 12:58
 * @description:
 */
public class User implements Serializable {
    private Integer id;
    private String email;
    private String nickName;
    private String passWord;
    
private String regTime; private String userName;

四 在serviceImpl中將進行邏輯判斷

package cn.lgy.springboot.redis.service.impl;

import cn.lgy.springboot.redis.domain.User;
import cn.lgy.springboot.redis.mapper.UserMapper;
import cn.lgy.springboot.redis.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.serializer.RedisSerializer; import org.springframework.data.redis.serializer.StringRedisSerializer; import org.springframework.stereotype.Service; import java.util.List; /** * @author liyang * @date 2020/8/16 13:21 * @description: */ @Service public class UserServiceImpl implements UserService { @Autowired UserMapper userMapper; /** * 將RedisTemplate模板引擎注入到spring boot容器中 */ @Autowired RedisTemplate<String, Object> redisTemplate; @Override public List<User> allUsers () { //設定redis的key鍵反序列化使其在redis資料庫中變為可讀 RedisSerializer redisSerializer = new StringRedisSerializer(); redisTemplate.setKeySerializer(redisSerializer); //根據key獲取redis資料庫中的值,如果有值就從快取中取出,沒有就查詢資料庫 List<User> users = (List<User>)redisTemplate.opsForValue().get("user"); //判斷redis資料庫中是否有該資料 if (users==null){ //沒有該資料就查詢資料庫 users = userMapper.selectAllUsers(); //將查詢出來的資料新增到redis資料庫中 redisTemplate.opsForValue().set("user", users); } return users; } }

適用於訪問量比較大,高併發情況. 容易發生快取穿透的問題,可能有10000個人同時執行查詢操作,上面的邏輯會造成10000個人同時查詢,當redis中沒有快取時會進行10000次查詢資料庫並將快取放入資料庫中.但我們只需要一個人查詢,其他9999人查詢快取.

解決方案一:

  在service實現類的方法上新增synchromnized 但是會犧牲效能

@Override
    public synchronized List<User> allUsers () {
        //設定redis的key鍵反序列化使其在redis資料庫中變為可讀
        RedisSerializer redisSerializer = new StringRedisSerializer();
        redisTemplate.setKeySerializer(redisSerializer);
        //根據key獲取redis資料庫中的值,如果有值就從快取中取出,沒有就查詢資料庫
        List<User> users = (List<User>)redisTemplate.opsForValue().get("user");
        //判斷redis資料庫中是否有該資料
        if (users==null){
            //沒有該資料就查詢資料庫
            users = userMapper.selectAllUsers();
            //將查詢出來的資料新增到redis資料庫中
            redisTemplate.opsForValue().set("user", users);
        }
        return users;
    }

解決方式二:

  在方法內部的邏輯前synchronized 該方式會提高一點效能,比上面的好,但也會影響效能


@Override
public List<User> allUsers () {
//設定redis的key鍵反序列化使其在redis資料庫中變為可讀
RedisSerializer redisSerializer = new StringRedisSerializer();
redisTemplate.setKeySerializer(redisSerializer);
//根據key獲取redis資料庫中的值,如果有值就從快取中取出,沒有就查詢資料庫
List<User> users = (List<User>)redisTemplate.opsForValue().get("user");
//判斷redis資料庫中是否有該資料
if (users==null) {
synchronized (this) {
users = (List<User>) redisTemplate.opsForValue().get("user");
if (users == null) {
//沒有該資料就查詢資料庫
users = userMapper.selectAllUsers();
//將查詢出來的資料新增到redis資料庫中
redisTemplate.opsForValue().set("user", users);
}
}
}
return users;
}

哨兵模式 Redis叢集配置

application.properties

#redis配置哨兵叢集模式

#預設名稱就是mymaster
spring.redis.sentinel.master=mymaster 
#配置多個哨兵的IP和埠
spring.redis.sentinel.nodes=192.168..106.128:26380,192.168.128:26382,192.168.128:26384,
#配置redis密碼:
spring.redis.password=123456

程式邏輯不用動,使用高併發環境的邏輯處理