日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

SringBoot+Redis整合

發布時間:2024/10/6 数据库 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 {//讀取配置文件中的redis的ip地址@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中的鎖已過期,然后過期的鎖請求完畢,回來刪鎖,刪除了其他線程的鎖怎么辦?
  • 解決辦法://設置分布式鎖//token為sku:skuId:lock鎖的value刪鎖之前通過key找到自己的value確定value部位空且與通過key得到的value相同時在刪除String token= UUID.randomUUID().toString();String OK = jedis.set("sku:" + skuId + ":lock", token, "nx", "px", 10*1000);//通過鎖的key得到value與之前的token比較String lockToken = jedis.get("sku:" + skuId + ":lock");if(StringUtils.isNotEmpty(lockToken)&& lockToken.equals(token)) {//token確認刪除的是自己sku的鎖jedis.del("sku:" + skuId + "lock"); }
  • 如果碰巧在查詢redis鎖時還沒刪除鎖,正在網絡傳輸時key過期怎么辦?
    決解辦法:可以在lua腳本查詢到key的同時刪除key,防止高并發下意外的發生
  • Redis的分布式工具框架Redission
  • 可重入鎖(Reentrant Lock) 基于RedisRedisson分布式可重入鎖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/*Mapper.xml mybatis.configuration.map-underscore-to-camel-case=true#設置日志級別 logging.level.root=info#掃描dubbo的配置 #dubbo中的服務名稱 spring.dubbo.application=redission-test #dubbo的通訊協議名稱 spring.dubbo.protocol.name=dubbo #zookeeper注冊中心地址 spring.dubbo.registry.address=47.101.36.17:2181 #zookeeper的注冊名稱 spring.dubbo.registry.protocol=zookeeper #dubbo服務的掃描路徑 spring.dubbo.base-package=com.atguigu.gmallspring.dubbo.protocol.port=20880#spring整合redis #取配置文件中的redis的ip地址 #Redis數據庫連接配置 spring.redis.host=47.101.36.177 spring.redis.port=6379 spring.redis.password=123 spring.redis.timeout=1000 spring.redis.database=0
  • 配置RedissionController類
  • @Controller public class RedissionController {@AutowiredRedisUtil redisUtil;@AutowiredRedissonClient redissonClient;@RequestMapping("testRedission")@ResponseBodypublic String lockTest(){Jedis jedis = redisUtil.getJedis();// redis鏈接RLock lock = redissonClient.getLock("redis-lock");//分布鎖//加鎖lock.lock();try {String v = jedis.get("k");//獲取valueSystem.err.print("==>"+v);//打印valueif(StringUtil.isBlank(v)){v = "1";}int inum = Integer.parseInt(v);//獲得value的值jedis.set("k", inum+1+"");//value增加1jedis.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整合的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。