生活随笔
收集整理的這篇文章主要介紹了
SringBoot+Redis整合
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
緩存使用設計
連接緩存
查詢緩存
如果緩存中沒有再到MySQL中查詢
mysql查詢結果放入redis
Redis整合步驟
將redis整合到項目中(redis+spring)
引入pom依賴信息(所有redis統一放在service-util)
<dependency><groupId>redis
.clients
</groupId
><artifactId>jedis
</artifactId
><version>2.9.0</version
>
</dependency
>
寫一個redis工具類(將redis的初始化到spring容器中)
public class RedisUtil {private JedisPool jedisPool
;public void initPool(String host
,int port
,int database
){JedisPoolConfig poolConfig
= new JedisPoolConfig();poolConfig
.setMaxTotal(200);poolConfig
.setMaxIdle(30);poolConfig
.setBlockWhenExhausted(true);poolConfig
.setMaxWaitMillis(10*1000);poolConfig
.setTestOnBorrow(true);jedisPool
=new JedisPool(poolConfig
,host
,port
,20*1000);}public Jedis getJedis(){Jedis jedis
= jedisPool
.getResource();return jedis
;}}
將redisUtils的連接池整合到spring容器中RedisConfig
@Configuration
public class RedisConfig {@Value("${spring.redis.host:disabled}")private String host
;@Value("${spring.redis.port:0}")private int port
;@Value("${spring.redis.database:0}")private int database
;@Beanpublic RedisUtil getRedisUtil(){if(host
.equals("disabled")){return null;}RedisUtil redisUtil
=new RedisUtil();redisUtil
.initPool(host
,port
,database
);return redisUtil
;}}
同時,任何模塊想要調用redis都必須在application.properties配置,否則不會進行注入。
spring
.redis
.host
=redis
.server
.com
spring
.redis
.port
=6379
spring
.redis
.database
=0
redis常見問題
1.緩存在高并發和安全壓力下的問題
緩存穿透:查詢一個不存在的數據,redis緩存沒命中,去查詢數據庫,數據庫中因為沒有此紀錄
解決辦法:空結果進行緩存,設置過期時間,最長不超過五分鐘緩存雪崩:緩存使用相同的過期時間,導致某一時刻緩存失效,導致DB崩潰
解決辦法:設置不同的過期時間緩存擊穿:某一個熱點key在高并發訪問情況下突然失效,導致大量請求直至訪問MySQL數據庫
解決辦法:使用redis數據庫的分布式鎖,解決MySQL訪問壓力
第一種方式:redis自帶的分布式鎖set ex nx
set sku:108:lock(key) 1(value) px 10000(過期時間) nx(redis分布式鎖的的參數)
第二種方式:redission框架:一個redis自帶的jcu的lock功能的客戶端實現(既有redis功能又有jcu功能)
緩存穿透、緩存雪崩、緩存擊穿區別:
1.擊穿某一個熱點key失效
2.雪崩很多key集體失效
3.穿透利用不存在的key繞過redis直接攻擊db
2.關于lua腳本問題
如果在redis中的鎖已過期,然后過期的鎖請求完畢,回來刪鎖,刪除了其他線程的鎖怎么辦?
解決辦法:
String token
= UUID
.randomUUID().toString();String OK
= jedis
.set("sku:" + skuId
+ ":lock", token
, "nx", "px", 10*1000);String lockToken
= jedis
.get("sku:" + skuId
+ ":lock");if(StringUtils.isNotEmpty(lockToken
)&& lockToken
.equals(token
)) {jedis
.del("sku:" + skuId
+ "lock");
}
如果碰巧在查詢redis鎖時還沒刪除鎖,正在網絡傳輸時key過期怎么辦?
決解辦法:可以在lua腳本查詢到key的同時刪除key,防止高并發下意外的發生
Redis的分布式工具框架Redission
可重入鎖(
Reentrant Lock)
基于
Redis的
Redisson分布式可重入鎖
RLock Java對象實現了
java.util.concurrent.locks.Lock接口。
同時還提供了異步(
Async)、反射式(
Reactive)和
RxJava2標準的接口。
RLock lock
= redisson
.getLock("anyLock");
lock
.lock();
將Redission整合到Spring中來
@Configuration
public class RedissonConfig {@Value("${spring.redis.host}")private String host
;@Value("${spring.redis.port}")private String port
;@Value("${spring.redis.password}")private String password
;@Beanpublic RedissonClient redissonClient(){Config config
= new Config();config
.useSingleServer().setPassword(password
);config
.useSingleServer().setAddress("redis://"+host
+":"+port
);RedissonClient redisson
= Redisson.create(config
);return redisson
;}
}
配置Redission在SpringBoot的application.properties文件中
server
.port
=8082#jdbc 配置
spring
.datasource
.url
=jdbc
:mysql
://localhost
:3306/crm
?useUnicode
=true&characterEncoding
=UTF
-8&serverTimezone
=UTC
spring
.datasource
.username
=root
spring
.datasource
.password
=xxxmybatis
.mapper
-locations
=classpath
:mapper
配置RedissionController類
@Controller
public class RedissionController {@AutowiredRedisUtil redisUtil
;@AutowiredRedissonClient redissonClient
;@RequestMapping("testRedission")@ResponseBodypublic String lockTest(){Jedis jedis
= redisUtil
.getJedis();RLock lock
= redissonClient
.getLock("redis-lock");lock
.lock();try {String v
= jedis
.get("k");System.err
.print("==>"+v
);if(StringUtil.isBlank(v
)){v
= "1";}int inum
= Integer.parseInt(v
);jedis
.set("k", inum
+1+"");jedis
.close();} finally {lock
.unlock();}return "success";
}
Redission-nginx負載均衡配置,nginx默認監聽端口號為80
啟動nginx:start nginx
idea中去掉單例模式啟動
redisson分布式壓力測試
Linux
linux直接yum -y install httpd-tools,然后ab -V測試
Windows
1查看80端口有沒有被占用,netstat -ano | findstr “80”
2下載地址https://www.apachehaus.com/cgi-bin/download.plx
3解壓后,找到安裝目錄下的httpd.conf,修改為自己的安裝目錄及修改監聽端口號默認為80端口,需要改為如(8088)
4 啟動服務
5 命令示例(并發200,一共1000個請求)
D:\software\apache24\bin>ab -c 200 -n 1000 http:nginx負載均衡/壓力方法
6 測試結果
研究redisson的分布式鎖在并發下的效果
總結
以上是生活随笔為你收集整理的SringBoot+Redis整合的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。