最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot 集成 Redis實(shí)現(xiàn)緩存與分布式鎖的全過(guò)程(提升系統(tǒng)性能與并發(fā)能力)

 更新時(shí)間:2026年01月20日 09:30:43   作者:小北方城市網(wǎng)  
本文介紹了SpringBoot與Redis的實(shí)戰(zhàn)應(yīng)用,涵蓋了環(huán)境搭建、緩存注解使用、手動(dòng)緩存操作、分布式鎖實(shí)現(xiàn)以及常見緩存問(wèn)題解決方案,通過(guò)實(shí)際代碼示例,幫助讀者快速掌握Redis的核心應(yīng)用,提升系統(tǒng)性能和并發(fā)處理能力,感興趣的朋友跟隨小編一起看看吧

在高并發(fā)、高流量后端系統(tǒng)中,數(shù)據(jù)庫(kù)往往是性能瓶頸 —— 頻繁的數(shù)據(jù)庫(kù)查詢會(huì)導(dǎo)致響應(yīng)延遲、數(shù)據(jù)庫(kù)壓力過(guò)大。Redis 作為高性能鍵值對(duì)緩存數(shù)據(jù)庫(kù),支持內(nèi)存存儲(chǔ)、持久化、分布式部署,可通過(guò)緩存熱點(diǎn)數(shù)據(jù)、實(shí)現(xiàn)分布式鎖等方式,大幅提升系統(tǒng)響應(yīng)速度、降低數(shù)據(jù)庫(kù)壓力,同時(shí)解決分布式環(huán)境下的并發(fā)安全問(wèn)題,是企業(yè)級(jí)系統(tǒng)性能優(yōu)化的核心工具。

本文聚焦 SpringBoot 與 Redis 的實(shí)戰(zhàn)落地,從環(huán)境搭建、緩存注解使用、手動(dòng)緩存操作,到分布式鎖實(shí)現(xiàn)、緩存問(wèn)題解決方案,全程嵌入 Java 代碼教學(xué),幫你快速掌握 Redis 核心應(yīng)用,打造高性能、高并發(fā)的后端系統(tǒng)。

一、核心認(rèn)知:Redis 核心價(jià)值與適用場(chǎng)景

1. 核心優(yōu)勢(shì)

  • 極致性能:基于內(nèi)存操作,讀寫速度可達(dá)每秒百萬(wàn)級(jí),響應(yīng)延遲毫秒級(jí),遠(yuǎn)超傳統(tǒng)數(shù)據(jù)庫(kù);
  • 數(shù)據(jù)結(jié)構(gòu)豐富:支持 String、Hash、List、Set、Sorted Set 等多種數(shù)據(jù)結(jié)構(gòu),適配復(fù)雜業(yè)務(wù)場(chǎng)景;
  • 分布式兼容:支持主從復(fù)制、哨兵模式、集群部署,適配分布式系統(tǒng)架構(gòu);
  • 功能強(qiáng)大:可實(shí)現(xiàn)緩存、分布式鎖、消息隊(duì)列、計(jì)數(shù)器、限流等多種功能;
  • 持久化機(jī)制:支持 RDB、AOF 兩種持久化方式,確保數(shù)據(jù)不丟失(兼顧性能與可靠性)。

2. 核心適用場(chǎng)景

  • 熱點(diǎn)數(shù)據(jù)緩存:用戶信息、商品詳情、首頁(yè)數(shù)據(jù)等高頻查詢數(shù)據(jù),減輕數(shù)據(jù)庫(kù)壓力;
  • 分布式鎖:解決分布式系統(tǒng)中并發(fā)修改、資源競(jìng)爭(zhēng)問(wèn)題(如庫(kù)存扣減、訂單創(chuàng)建);
  • 會(huì)話存儲(chǔ):分布式環(huán)境下的用戶會(huì)話共享(替代 Session 本地存儲(chǔ));
  • 異步通信:基于 List 實(shí)現(xiàn)簡(jiǎn)單消息隊(duì)列,處理異步任務(wù)(如日志收集、通知推送);
  • 計(jì)數(shù)器與限流:接口訪問(wèn)次數(shù)統(tǒng)計(jì)、接口限流(防止惡意請(qǐng)求)。

3. Redis 核心概念

  • 鍵(Key):唯一標(biāo)識(shí),支持字符串、哈希值等格式,建議設(shè)計(jì)統(tǒng)一命名規(guī)范(如 user:info:1001);
  • 值(Value):支持多種數(shù)據(jù)結(jié)構(gòu),存儲(chǔ)業(yè)務(wù)數(shù)據(jù),需合理設(shè)置過(guò)期時(shí)間避免內(nèi)存溢出;
  • 過(guò)期策略:支持定期刪除、惰性刪除,可設(shè)置鍵的過(guò)期時(shí)間,自動(dòng)釋放內(nèi)存;
  • 分布式鎖:基于 SETNX(SET if Not Exists)命令,確保同一時(shí)間只有一個(gè)線程操作資源。

二、核心實(shí)戰(zhàn)一:環(huán)境搭建(Docker 快速部署)

1. Docker 部署 Redis(單節(jié)點(diǎn),開發(fā)測(cè)試場(chǎng)景)

# 1. 拉取 Redis 鏡像(最新穩(wěn)定版)
docker pull redis:latest
# 2. 啟動(dòng) Redis 容器(配置密碼、持久化、端口映射)
docker run -d --name redis -p 6379:6379 \
  -v redis-data:/data \ # 掛載數(shù)據(jù)卷,持久化數(shù)據(jù)
  -e REDIS_PASSWORD=redis123 \ # 設(shè)置訪問(wèn)密碼
  redis:latest \
  redis-server --requirepass redis123 \ # 開啟密碼驗(yàn)證
  --appendonly yes # 開啟 AOF 持久化(數(shù)據(jù)更可靠)
  • 連接測(cè)試:使用 Redis 客戶端(如 Redis Desktop Manager)連接 localhost:6379,密碼 redis123,驗(yàn)證服務(wù)可用性;
  • 核心配置說(shuō)明:AOF 持久化會(huì)記錄所有寫操作,重啟后可恢復(fù)數(shù)據(jù),適合對(duì)數(shù)據(jù)可靠性要求高的場(chǎng)景。

三、核心實(shí)戰(zhàn)二:SpringBoot 集成 Redis 基礎(chǔ)配置

1. 引入依賴(Maven)

<!-- Spring Data Redis 依賴(簡(jiǎn)化 Redis 操作) -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!-- 連接池依賴(提升 Redis 連接效率) -->
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-pool2</artifactId>
</dependency>
<!-- Web 依賴 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Lombok -->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <optional>true</optional>
</dependency>

2. 配置文件(application.yml)

# Redis 配置
spring:
  redis:
    host: localhost # Redis 服務(wù)地址
    port: 6379 # 端口
    password: redis123 # 訪問(wèn)密碼
    database: 0 # 數(shù)據(jù)庫(kù)索引(默認(rèn) 0,Redis 支持 16 個(gè)數(shù)據(jù)庫(kù))
    timeout: 10000 # 連接超時(shí)時(shí)間(毫秒)
    lettuce: # 連接池配置(Lettuce 是 SpringBoot 2.x 默認(rèn) Redis 客戶端)
      pool:
        max-active: 16 # 最大連接數(shù)
        max-idle: 8 # 最大空閑連接數(shù)
        min-idle: 4 # 最小空閑連接數(shù)
        max-wait: -1 # 最大等待時(shí)間(-1 表示無(wú)限制)
# 服務(wù)端口
server:
  port: 8085

3. Redis 配置類(自定義序列化方式)

默認(rèn)序列化方式會(huì)導(dǎo)致 Redis 中存儲(chǔ)的數(shù)據(jù)可讀性差,需自定義序列化(JSON 格式),同時(shí)配置緩存管理器。

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheConfiguration;
import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializationContext;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import java.time.Duration;
@Configuration
public class RedisConfig {
    // 自定義 RedisTemplate(JSON 序列化,支持復(fù)雜對(duì)象存儲(chǔ))
    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(connectionFactory);
        // 字符串序列化器(Key 用字符串序列化)
        StringRedisSerializer stringSerializer = new StringRedisSerializer();
        // JSON 序列化器(Value 用 JSON 序列化,保留對(duì)象結(jié)構(gòu))
        GenericJackson2JsonRedisSerializer jsonSerializer = new GenericJackson2JsonRedisSerializer();
        // 配置 Key、Value 序列化方式
        redisTemplate.setKeySerializer(stringSerializer);
        redisTemplate.setValueSerializer(jsonSerializer);
        redisTemplate.setHashKeySerializer(stringSerializer);
        redisTemplate.setHashValueSerializer(jsonSerializer);
        // 初始化 RedisTemplate
        redisTemplate.afterPropertiesSet();
        return redisTemplate;
    }
    // 配置緩存管理器(支持緩存注解)
    @Bean
    public RedisCacheManager cacheManager(RedisConnectionFactory connectionFactory) {
        // 緩存配置(設(shè)置默認(rèn)過(guò)期時(shí)間 30 分鐘,JSON 序列化)
        RedisCacheConfiguration cacheConfig = RedisCacheConfiguration.defaultCacheConfig()
                .entryTtl(Duration.ofMinutes(30)) // 默認(rèn)緩存過(guò)期時(shí)間
                .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer()))
                .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer()))
                .disableCachingNullValues(); // 禁止緩存 null 值(避免緩存穿透)
        // 創(chuàng)建緩存管理器
        return RedisCacheManager.builder(connectionFactory)
                .cacheDefaults(cacheConfig)
                .build();
    }
}

四、核心實(shí)戰(zhàn)三:Redis 緩存操作(注解式 + 手動(dòng)式)

1. 注解式緩存(簡(jiǎn)化開發(fā),適用于簡(jiǎn)單場(chǎng)景)

通過(guò) @Cacheable、@CachePut@CacheEvict 等注解,無(wú)需手動(dòng)編寫緩存邏輯,自動(dòng)實(shí)現(xiàn)數(shù)據(jù)緩存與更新。

(1)Service 層使用示例

import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
import com.example.redis.entity.User;
import com.example.redis.mapper.UserMapper;
import javax.annotation.Resource;
@Service
public class UserService {
    @Resource
    private UserMapper userMapper;
    // ? 緩存查詢結(jié)果:key 為 "user:info:" + id,緩存過(guò)期時(shí)間 30 分鐘
    @Cacheable(value = "user", key = "'info:' + #id", unless = "#result == null")
    public User getUserById(Long id) {
        // 緩存不存在時(shí),查詢數(shù)據(jù)庫(kù)(僅執(zhí)行一次)
        System.out.println("查詢數(shù)據(jù)庫(kù),用戶ID:" + id);
        return userMapper.selectById(id);
    }
    // ? 更新緩存:更新數(shù)據(jù)庫(kù)后,同步更新緩存(避免緩存與數(shù)據(jù)庫(kù)不一致)
    @CachePut(value = "user", key = "'info:' + #user.id", unless = "#user == null")
    public User updateUser(User user) {
        userMapper.updateById(user);
        return user;
    }
    // ? 清除緩存:刪除數(shù)據(jù)庫(kù)數(shù)據(jù)后,刪除對(duì)應(yīng)緩存
    @CacheEvict(value = "user", key = "'info:' + #id")
    public void deleteUser(Long id) {
        userMapper.deleteById(id);
    }
    // ? 清除所有緩存(如批量更新時(shí))
    @CacheEvict(value = "user", allEntries = true)
    public void clearUserCache() {
        // 僅清除緩存,無(wú)業(yè)務(wù)邏輯
    }
}

(2)Controller 層接口

import org.springframework.web.bind.annotation.*;
import com.example.redis.entity.User;
import com.example.redis.result.Result;
import com.example.redis.service.UserService;
import javax.annotation.Resource;
@RestController
@RequestMapping("/user")
public class UserController {
    @Resource
    private UserService userService;
    @GetMapping("/{id}")
    public Result<User> getUserById(@PathVariable Long id) {
        User user = userService.getUserById(id);
        return Result.success(user);
    }
    @PutMapping
    public Result<User> updateUser(@RequestBody User user) {
        User updatedUser = userService.updateUser(user);
        return Result.success(updatedUser);
    }
    @DeleteMapping("/{id}")
    public Result<Void> deleteUser(@PathVariable Long id) {
        userService.deleteUser(id);
        return Result.success();
    }
}

2. 手動(dòng)式緩存(靈活控制,適用于復(fù)雜場(chǎng)景)

通過(guò) RedisTemplate 手動(dòng)操作 Redis,支持多種數(shù)據(jù)結(jié)構(gòu),適配復(fù)雜業(yè)務(wù)場(chǎng)景(如 Hash、List 操作)。

(1)Redis 工具類封裝

import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.concurrent.TimeUnit;
@Component
public class RedisUtils {
    @Resource
    private RedisTemplate<String, Object> redisTemplate;
    // ? 存儲(chǔ) String 類型數(shù)據(jù)(設(shè)置過(guò)期時(shí)間)
    public void setString(String key, Object value, Long expireTime, TimeUnit timeUnit) {
        redisTemplate.opsForValue().set(key, value, expireTime, timeUnit);
    }
    // ? 獲取 String 類型數(shù)據(jù)
    public Object getString(String key) {
        return redisTemplate.opsForValue().get(key);
    }
    // ? 刪除數(shù)據(jù)
    public Boolean delete(String key) {
        return redisTemplate.delete(key);
    }
    // ? 判斷鍵是否存在
    public Boolean hasKey(String key) {
        return redisTemplate.hasKey(key);
    }
    // ? 設(shè)置鍵過(guò)期時(shí)間
    public Boolean expire(String key, Long expireTime, TimeUnit timeUnit) {
        return redisTemplate.expire(key, expireTime, timeUnit);
    }
    // ? 存儲(chǔ) Hash 類型數(shù)據(jù)(示例:存儲(chǔ)用戶詳情,字段拆分)
    public void setHash(String key, String hashKey, Object value) {
        redisTemplate.opsForHash().put(key, hashKey, value);
    }
    // ? 獲取 Hash 類型數(shù)據(jù)
    public Object getHash(String key, String hashKey) {
        return redisTemplate.opsForHash().get(key, hashKey);
    }
}

(2)工具類使用示例(熱點(diǎn)商品緩存)

import org.springframework.stereotype.Service;
import com.example.redis.entity.Goods;
import com.example.redis.mapper.GoodsMapper;
import com.example.redis.utils.RedisUtils;
import javax.annotation.Resource;
import java.util.concurrent.TimeUnit;
@Service
public class GoodsService {
    @Resource
    private GoodsMapper goodsMapper;
    @Resource
    private RedisUtils redisUtils;
    // 熱點(diǎn)商品緩存(手動(dòng)控制緩存邏輯)
    public Goods getHotGoodsById(Long id) {
        String key = "goods:hot:" + id;
        // 1. 先查緩存
        Goods goods = (Goods) redisUtils.getString(key);
        if (goods != null) {
            return goods;
        }
        // 2. 緩存不存在,查數(shù)據(jù)庫(kù)
        goods = goodsMapper.selectById(id);
        if (goods != null) {
            // 3. 存入緩存,設(shè)置過(guò)期時(shí)間 10 分鐘(熱點(diǎn)數(shù)據(jù)可縮短過(guò)期時(shí)間)
            redisUtils.setString(key, goods, 10L, TimeUnit.MINUTES);
        }
        return goods;
    }
}

五、核心實(shí)戰(zhàn)四:分布式鎖實(shí)現(xiàn)(解決并發(fā)安全問(wèn)題)

分布式環(huán)境下,多個(gè)服務(wù)實(shí)例同時(shí)操作同一資源(如庫(kù)存扣減)會(huì)導(dǎo)致數(shù)據(jù)不一致,通過(guò) Redis 分布式鎖可確保同一時(shí)間只有一個(gè)線程操作資源。

1. 分布式鎖工具類

import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.concurrent.TimeUnit;
@Component
public class RedisDistributedLock {
    @Resource
    private RedisTemplate<String, Object> redisTemplate;
    // 鎖前綴(避免鍵沖突)
    private static final String LOCK_PREFIX = "lock:";
    // 鎖過(guò)期時(shí)間(避免死鎖,默認(rèn) 30 秒)
    private static final Long LOCK_EXPIRE = 30L;
    /**
     * 獲取分布式鎖
     * @param lockKey 鎖標(biāo)識(shí)(如 "stock:1001")
     * @param requestId 唯一標(biāo)識(shí)(如 UUID,確保釋放鎖時(shí)是自己的鎖)
     * @return 是否獲取成功
     */
    public Boolean tryLock(String lockKey, String requestId) {
        String key = LOCK_PREFIX + lockKey;
        // SETNX 命令:當(dāng)鍵不存在時(shí)設(shè)置值,原子操作(確保并發(fā)安全)
        Boolean locked = redisTemplate.opsForValue().setIfAbsent(key, requestId, LOCK_EXPIRE, TimeUnit.SECONDS);
        return locked != null && locked;
    }
    /**
     * 釋放分布式鎖
     * @param lockKey 鎖標(biāo)識(shí)
     * @param requestId 唯一標(biāo)識(shí)
     */
    public void unlock(String lockKey, String requestId) {
        String key = LOCK_PREFIX + lockKey;
        try {
            String value = (String) redisTemplate.opsForValue().get(key);
            // 僅釋放自己的鎖(避免釋放其他線程的鎖)
            if (requestId.equals(value)) {
                redisTemplate.delete(key);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

2. 分布式鎖使用示例(庫(kù)存扣減)

import org.springframework.stereotype.Service;
import com.example.redis.mapper.StockMapper;
import com.example.redis.utils.RedisDistributedLock;
import javax.annotation.Resource;
import java.util.UUID;
@Service
public class StockService {
    @Resource
    private StockMapper stockMapper;
    @Resource
    private RedisDistributedLock distributedLock;
    // 庫(kù)存扣減(分布式環(huán)境下安全操作)
    public Boolean deductStock(Long goodsId, Integer num) {
        String lockKey = "stock:" + goodsId;
        String requestId = UUID.randomUUID().toString();
        try {
            // 1. 獲取分布式鎖(最多等待 5 秒,每隔 1 秒重試)
            Boolean locked = false;
            int count = 0;
            while (!locked && count < 5) {
                locked = distributedLock.tryLock(lockKey, requestId);
                if (!locked) {
                    Thread.sleep(1000);
                    count++;
                }
            }
            if (!locked) {
                // 獲取鎖失敗(限流)
                return false;
            }
            // 2. 扣減庫(kù)存(業(yè)務(wù)邏輯)
            int row = stockMapper.deductStock(goodsId, num);
            return row > 0;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        } finally {
            // 3. 釋放鎖(確保無(wú)論是否異常,都釋放鎖)
            distributedLock.unlock(lockKey, requestId);
        }
    }
}

六、進(jìn)階:緩存常見問(wèn)題解決方案

1. 緩存穿透(查詢不存在的數(shù)據(jù),緩存無(wú)效,直擊數(shù)據(jù)庫(kù))

  • 問(wèn)題表現(xiàn):惡意請(qǐng)求不存在的 ID,緩存無(wú)法命中,頻繁查詢數(shù)據(jù)庫(kù),導(dǎo)致數(shù)據(jù)庫(kù)壓力過(guò)大;
  • 解決方案:緩存 null 值(設(shè)置較短過(guò)期時(shí)間),或使用布隆過(guò)濾器過(guò)濾不存在的 ID。
// 緩存 null 值解決方案(修改查詢方法)
public Goods getGoodsById(Long id) {
    String key = "goods:info:" + id;
    Goods goods = (Goods) redisUtils.getString(key);
    if (goods != null) {
        return goods;
    }
    // 數(shù)據(jù)庫(kù)查詢也不存在,緩存 null 值(過(guò)期時(shí)間 5 分鐘)
    goods = goodsMapper.selectById(id);
    if (goods == null) {
        redisUtils.setString(key, null, 5L, TimeUnit.MINUTES);
        return null;
    }
    redisUtils.setString(key, goods, 30L, TimeUnit.MINUTES);
    return goods;
}

2. 緩存擊穿(熱點(diǎn)數(shù)據(jù)緩存過(guò)期,大量請(qǐng)求同時(shí)直擊數(shù)據(jù)庫(kù))

  • 問(wèn)題表現(xiàn):熱點(diǎn)數(shù)據(jù)緩存過(guò)期瞬間,大量并發(fā)請(qǐng)求同時(shí)查詢數(shù)據(jù)庫(kù),導(dǎo)致數(shù)據(jù)庫(kù)壓力驟增;
  • 解決方案:互斥鎖(同一時(shí)間只有一個(gè)線程查詢數(shù)據(jù)庫(kù)并更新緩存),或熱點(diǎn)數(shù)據(jù)永不過(guò)期。

3. 緩存雪崩(大量緩存同時(shí)過(guò)期,或 Redis 服務(wù)宕機(jī),所有請(qǐng)求直擊數(shù)據(jù)庫(kù))

  • 問(wèn)題表現(xiàn):緩存服務(wù)器宕機(jī),或大量緩存設(shè)置同一過(guò)期時(shí)間,導(dǎo)致所有請(qǐng)求直接訪問(wèn)數(shù)據(jù)庫(kù),數(shù)據(jù)庫(kù)崩潰;
  • 解決方案:Redis 集群部署(高可用),緩存過(guò)期時(shí)間加隨機(jī)值(避免同時(shí)過(guò)期),服務(wù)降級(jí)(熔斷保護(hù)數(shù)據(jù)庫(kù))。

七、避坑指南

坑點(diǎn) 1:緩存與數(shù)據(jù)庫(kù)數(shù)據(jù)不一致

表現(xiàn):更新數(shù)據(jù)庫(kù)后,緩存未同步更新,導(dǎo)致查詢到舊數(shù)據(jù);? 解決方案:采用「更新數(shù)據(jù)庫(kù) + 同步更新緩存」或「更新數(shù)據(jù)庫(kù) + 刪除緩存」策略,避免單獨(dú)操作數(shù)據(jù)庫(kù)或緩存。

坑點(diǎn) 2:Redis 序列化后數(shù)據(jù)可讀性差

表現(xiàn):Redis 中存儲(chǔ)的數(shù)據(jù)為亂碼,無(wú)法直接查看;? 解決方案:自定義序列化方式(如 JSON 序列化),避免使用默認(rèn)的 JdkSerializationRedisSerializer。

坑點(diǎn) 3:分布式鎖死鎖

表現(xiàn):獲取鎖后線程異常退出,未釋放鎖,導(dǎo)致其他線程無(wú)法獲取鎖;? 解決方案:設(shè)置鎖過(guò)期時(shí)間,確保鎖自動(dòng)釋放;使用 try-finally 確保鎖一定會(huì)被釋放。

坑點(diǎn) 4:Redis 連接池耗盡

表現(xiàn):系統(tǒng)報(bào)錯(cuò)「Could not get a resource from the pool」,無(wú)法獲取 Redis 連接;? 解決方案:合理配置連接池參數(shù)(max-active、max-idle),避免頻繁創(chuàng)建銷毀連接,排查是否有連接未釋放的情況。

八、終極總結(jié):Redis 實(shí)戰(zhàn)的核心是「緩存高效 + 并發(fā)安全」

Redis 實(shí)戰(zhàn)的核心價(jià)值,是通過(guò)緩存熱點(diǎn)數(shù)據(jù)提升系統(tǒng)響應(yīng)速度,通過(guò)分布式鎖解決分布式并發(fā)問(wèn)題,同時(shí)兼顧數(shù)據(jù)可靠性與系統(tǒng)穩(wěn)定性。企業(yè)級(jí)開發(fā)中,需根據(jù)業(yè)務(wù)場(chǎng)景選擇合適的緩存策略與數(shù)據(jù)結(jié)構(gòu),規(guī)避常見緩存問(wèn)題,平衡性能與一致性。

核心原則總結(jié):

  1. 緩存策略適配業(yè)務(wù):簡(jiǎn)單場(chǎng)景用注解式緩存,復(fù)雜場(chǎng)景用手動(dòng)式緩存,熱點(diǎn)數(shù)據(jù)縮短過(guò)期時(shí)間;
  2. 并發(fā)安全優(yōu)先:分布式環(huán)境下操作共享資源,必須使用分布式鎖,避免數(shù)據(jù)不一致;
  3. 高可用不可少:生產(chǎn)環(huán)境必用 Redis 集群(主從 + 哨兵),避免單點(diǎn)故障導(dǎo)致緩存雪崩;
  4. 問(wèn)題提前預(yù)防:針對(duì)緩存穿透、擊穿、雪崩,提前部署解決方案,而非事后補(bǔ)救。

到此這篇關(guān)于SpringBoot 集成 Redis實(shí)現(xiàn)緩存與分布式鎖的全過(guò)程(提升系統(tǒng)性能與并發(fā)能力)的文章就介紹到這了,更多相關(guān)SpringBoot集成Redis 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 深入探究Java線程不安全的原因與解決

    深入探究Java線程不安全的原因與解決

    線程不安全這個(gè)問(wèn)題,一般在學(xué)Java時(shí),我們老師會(huì)讓我們背誦一段長(zhǎng)長(zhǎng)的話。"當(dāng)不同線程同時(shí)能訪問(wèn)同一個(gè)變量時(shí),可能會(huì)導(dǎo)致線程不安全"。實(shí)際上,這句話重點(diǎn)想突出的只有原子性。而我們往往考慮線程不安全的原因,會(huì)從三方面進(jìn)行考慮:就是原子性,可見性,有序性
    2022-04-04
  • SpringBoot框架中Mybatis-plus的簡(jiǎn)單使用操作匯總

    SpringBoot框架中Mybatis-plus的簡(jiǎn)單使用操作匯總

    這篇文章主要介紹了SpringBoot框架中Mybatis-plus的簡(jiǎn)單使用,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-02-02
  • springboot集成spring cache緩存示例代碼

    springboot集成spring cache緩存示例代碼

    本篇文章主要介紹了springboot集成spring cache示例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-05-05
  • SpringBoot?配置文件總結(jié)

    SpringBoot?配置文件總結(jié)

    SpringBoot中提供一個(gè)全局的配置文件:application.properties,這個(gè)配置文件的作用就是,允許我們通過(guò)這個(gè)配置文件去修改Spring?Boot自動(dòng)配置的默認(rèn)值,本文詳細(xì)總結(jié)了SpringBoot配置文件,文中有詳細(xì)的代碼示例,感興趣的同學(xué)可以參考下
    2023-05-05
  • SpringMVC中日期格式的轉(zhuǎn)換

    SpringMVC中日期格式的轉(zhuǎn)換

    本文主要介紹了SpringMVC中日期格式轉(zhuǎn)換的相關(guān)知識(shí):用來(lái)解決日期提交轉(zhuǎn)換異常的問(wèn)題。具有很好的參考價(jià)值。下面跟著小編一起來(lái)看下吧
    2017-03-03
  • java中ArrayList和LinkedList的區(qū)別詳解

    java中ArrayList和LinkedList的區(qū)別詳解

    這篇文章主要介紹了java中ArrayList和LinkedList的區(qū)別詳解,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下
    2021-01-01
  • Java利用ElasticSearch實(shí)現(xiàn)增刪改功能

    Java利用ElasticSearch實(shí)現(xiàn)增刪改功能

    這篇文章主要為大家詳細(xì)介紹了Java如何利用ElasticSearch實(shí)現(xiàn)增刪改功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-08-08
  • 你知道JVM中GC?Root對(duì)象有哪些嗎

    你知道JVM中GC?Root對(duì)象有哪些嗎

    這篇文章主要介紹了你知道JVM中GC?Root對(duì)象有哪些,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • 使用Spring?Boot+gRPC構(gòu)建微服務(wù)并部署的案例詳解

    使用Spring?Boot+gRPC構(gòu)建微服務(wù)并部署的案例詳解

    這篇文章主要介紹了使用Spring?Boot+gRPC構(gòu)建微服務(wù)并部署,Spring Cloud僅僅是一個(gè)開發(fā)框架,沒有實(shí)現(xiàn)微服務(wù)所必須的服務(wù)調(diào)度、資源分配等功能,這些需求要借助Kubernetes等平臺(tái)來(lái)完成,本文給大家介紹的非常詳細(xì),需要的朋友參考下吧
    2022-06-06
  • java之Properties配置文件用法解讀

    java之Properties配置文件用法解讀

    這篇文章主要介紹了java之Properties配置文件用法及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2026-03-03

最新評(píng)論

利辛县| 沙湾县| 广宁县| 达孜县| 内黄县| 太白县| 兴化市| 临清市| 南部县| 府谷县| 沅江市| 密山市| 岳池县| 萨嘎县| 米泉市| 阳江市| 嘉禾县| 西畴县| 吕梁市| 奎屯市| 英吉沙县| 绵竹市| 新兴县| 金门县| 江源县| 灌云县| 彩票| 同德县| 临泽县| 白朗县| 金乡县| 沅陵县| 西贡区| 松江区| 岳池县| 阿鲁科尔沁旗| 崇左市| 海门市| 泸西县| 将乐县| 萍乡市|