JavaScript-07 Date物件
阿新 • • 發佈:2020-08-16
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
程式邏輯不用動,使用高併發環境的邏輯處理