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

Redis緩存降級(jí)的四種策略

 更新時(shí)間:2025年04月20日 10:10:08   作者:風(fēng)象南  
在高并發(fā)系統(tǒng)架構(gòu)中,Redis作為核心緩存組件扮演著至關(guān)重要的角色,它不僅能夠顯著提升系統(tǒng)響應(yīng)速度,還能有效減輕數(shù)據(jù)庫壓力,然而,當(dāng)Redis服務(wù)出現(xiàn)故障、性能下降或連接超時(shí)時(shí),如果沒有適當(dāng)?shù)慕导?jí)機(jī)制,可能導(dǎo)致系統(tǒng)雪崩,所以本文給大家介紹了Redis緩存降級(jí)的四種策略

引言

在高并發(fā)系統(tǒng)架構(gòu)中,Redis作為核心緩存組件扮演著至關(guān)重要的角色。它不僅能夠顯著提升系統(tǒng)響應(yīng)速度,還能有效減輕數(shù)據(jù)庫壓力。

然而,當(dāng)Redis服務(wù)出現(xiàn)故障、性能下降或連接超時(shí)時(shí),如果沒有適當(dāng)?shù)慕导?jí)機(jī)制,可能導(dǎo)致系統(tǒng)雪崩,引發(fā)全局性的服務(wù)不可用。

緩存降級(jí)是高可用系統(tǒng)設(shè)計(jì)中的關(guān)鍵環(huán)節(jié),它提供了在緩存層故障時(shí)系統(tǒng)行為的備選方案,確保核心業(yè)務(wù)流程能夠繼續(xù)運(yùn)行。

什么是緩存降級(jí)?

緩存降級(jí)是指當(dāng)緩存服務(wù)不可用或響應(yīng)異常緩慢時(shí),系統(tǒng)主動(dòng)或被動(dòng)采取的備選處理機(jī)制,以保障業(yè)務(wù)流程的連續(xù)性和系統(tǒng)的穩(wěn)定性。

與緩存穿透、緩存擊穿和緩存雪崩等問題的應(yīng)對策略相比,緩存降級(jí)更關(guān)注的是"優(yōu)雅降級(jí)",即在性能和功能上做出一定妥協(xié),但保證系統(tǒng)核心功能可用。

策略一:本地緩存回退策略

原理

本地緩存回退策略在Redis緩存層之外,增加一個(gè)應(yīng)用內(nèi)的本地緩存層(如Caffeine、Guava Cache等)。當(dāng)Redis不可用時(shí),系統(tǒng)自動(dòng)切換到本地緩存,雖然數(shù)據(jù)一致性和實(shí)時(shí)性可能受到影響,但能保證基本的緩存功能。

實(shí)現(xiàn)方式

以下是使用Spring Boot + Caffeine實(shí)現(xiàn)的本地緩存回退示例:

@Service
public class ProductService {
    @Autowired
    private RedisTemplate<String, Product> redisTemplate;
    
    // 配置本地緩存
    private Cache<String, Product> localCache = Caffeine.newBuilder()
            .expireAfterWrite(5, TimeUnit.MINUTES)
            .maximumSize(1000)
            .build();
    
    @Autowired
    private ProductRepository productRepository;
    
    private final AtomicBoolean redisAvailable = new AtomicBoolean(true);
    
    public Product getProductById(String productId) {
        Product product = null;
        
        // 嘗試從Redis獲取
        if (redisAvailable.get()) {
            try {
                product = redisTemplate.opsForValue().get("product:" + productId);
            } catch (Exception e) {
                // Redis異常,標(biāo)記為不可用,記錄日志
                redisAvailable.set(false);
                log.warn("Redis unavailable, switching to local cache", e);
                // 啟動(dòng)后臺(tái)定時(shí)任務(wù)檢測Redis恢復(fù)
                scheduleRedisRecoveryCheck();
            }
        }
        
        // 如果Redis不可用或未命中,嘗試本地緩存
        if (product == null) {
            product = localCache.getIfPresent(productId);
        }
        
        // 如果本地緩存也未命中,從數(shù)據(jù)庫加載
        if (product == null) {
            product = productRepository.findById(productId).orElse(null);
            
            // 如果找到產(chǎn)品,更新本地緩存
            if (product != null) {
                localCache.put(productId, product);
                
                // 如果Redis可用,也更新Redis緩存
                if (redisAvailable.get()) {
                    try {
                        redisTemplate.opsForValue().set("product:" + productId, product, 30, TimeUnit.MINUTES);
                    } catch (Exception e) {
                        // 更新失敗僅記錄日志,不影響返回結(jié)果
                        log.error("Failed to update Redis cache", e);
                    }
                }
            }
        }
        
        return product;
    }
    
    // 定時(shí)檢查Redis是否恢復(fù)
    private void scheduleRedisRecoveryCheck() {
        ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor();
        scheduler.scheduleAtFixedRate(() -> {
            try {
                redisTemplate.getConnectionFactory().getConnection().ping();
                redisAvailable.set(true);
                log.info("Redis service recovered");
                scheduler.shutdown();
            } catch (Exception e) {
                log.debug("Redis still unavailable");
            }
        }, 30, 30, TimeUnit.SECONDS);
    }
}

優(yōu)缺點(diǎn)分析

優(yōu)點(diǎn):

  • 完全本地化處理,不依賴外部服務(wù),響應(yīng)速度快
  • 實(shí)現(xiàn)相對簡單,無需額外基礎(chǔ)設(shè)施
  • 即使Redis完全不可用,系統(tǒng)仍能提供基本緩存功能

缺點(diǎn):

  • 本地緩存容量有限,無法緩存大量數(shù)據(jù)
  • 多實(shí)例部署時(shí)各節(jié)點(diǎn)緩存數(shù)據(jù)不一致
  • 應(yīng)用重啟時(shí)本地緩存會(huì)丟失
  • 內(nèi)存占用增加,可能影響應(yīng)用其他功能

適用場景

  • 數(shù)據(jù)一致性要求不高的讀多寫少場景
  • 小型應(yīng)用或數(shù)據(jù)量不大的服務(wù)
  • 需要極高可用性的核心服務(wù)
  • 單體應(yīng)用或?qū)嵗龜?shù)量有限的微服務(wù)

策略二:靜態(tài)默認(rèn)值策略

原理

靜態(tài)默認(rèn)值策略是最簡單的降級(jí)方式,當(dāng)緩存不可用時(shí),直接返回預(yù)定義的默認(rèn)數(shù)據(jù)或靜態(tài)內(nèi)容,避免對底層數(shù)據(jù)源的訪問。這種策略適用于非核心數(shù)據(jù)展示,如推薦列表、廣告位、配置項(xiàng)等。

實(shí)現(xiàn)方式

@Service
public class RecommendationService {
    @Autowired
    private RedisTemplate<String, List<ProductRecommendation>> redisTemplate;
    
    @Autowired
    private RecommendationEngine recommendationEngine;
    
    // 預(yù)加載的靜態(tài)推薦數(shù)據(jù),可以在應(yīng)用啟動(dòng)時(shí)初始化
    private static final List<ProductRecommendation> DEFAULT_RECOMMENDATIONS = new ArrayList<>();
    
    static {
        // 初始化一些通用熱門商品作為默認(rèn)推薦
        DEFAULT_RECOMMENDATIONS.add(new ProductRecommendation("1001", "熱門商品1", 4.8));
        DEFAULT_RECOMMENDATIONS.add(new ProductRecommendation("1002", "熱門商品2", 4.7));
        DEFAULT_RECOMMENDATIONS.add(new ProductRecommendation("1003", "熱門商品3", 4.9));
        // 更多默認(rèn)推薦...
    }
    
    public List<ProductRecommendation> getRecommendationsForUser(String userId) {
        String cacheKey = "recommendations:" + userId;
        
        try {
            // 嘗試從Redis獲取個(gè)性化推薦
            List<ProductRecommendation> cachedRecommendations = redisTemplate.opsForValue().get(cacheKey);
            
            if (cachedRecommendations != null) {
                return cachedRecommendations;
            }
            
            // 緩存未命中,生成新的推薦
            List<ProductRecommendation> freshRecommendations = recommendationEngine.generateForUser(userId);
            
            // 緩存推薦結(jié)果
            if (freshRecommendations != null && !freshRecommendations.isEmpty()) {
                redisTemplate.opsForValue().set(cacheKey, freshRecommendations, 1, TimeUnit.HOURS);
                return freshRecommendations;
            } else {
                // 推薦引擎返回空結(jié)果,使用默認(rèn)推薦
                return DEFAULT_RECOMMENDATIONS;
            }
        } catch (Exception e) {
            // Redis或推薦引擎異常,返回默認(rèn)推薦
            log.warn("Failed to get recommendations, using defaults", e);
            return DEFAULT_RECOMMENDATIONS;
        }
    }
}

優(yōu)缺點(diǎn)分析

優(yōu)點(diǎn)

  • 實(shí)現(xiàn)極其簡單,幾乎沒有額外開發(fā)成本
  • 無需訪問數(shù)據(jù)源,降低系統(tǒng)負(fù)載
  • 響應(yīng)時(shí)間確定,不會(huì)因緩存故障導(dǎo)致延遲增加
  • 完全隔離緩存故障的影響范圍

缺點(diǎn)

  • 返回的是靜態(tài)數(shù)據(jù),無法滿足個(gè)性化需求
  • 數(shù)據(jù)實(shí)時(shí)性差,可能與實(shí)際情況不符
  • 不適合核心業(yè)務(wù)數(shù)據(jù)或交易流程

適用場景

  • 非關(guān)鍵業(yè)務(wù)數(shù)據(jù),如推薦、廣告、營銷信息
  • 對數(shù)據(jù)實(shí)時(shí)性要求不高的場景
  • 系統(tǒng)邊緣功能,不影響核心流程
  • 高流量系統(tǒng)中的非個(gè)性化展示區(qū)域

策略三:降級(jí)開關(guān)策略

原理

降級(jí)開關(guān)策略通過配置動(dòng)態(tài)開關(guān),在緩存出現(xiàn)故障時(shí),臨時(shí)關(guān)閉特定功能或簡化處理流程,減輕系統(tǒng)負(fù)擔(dān)。這種策略通常結(jié)合配置中心實(shí)現(xiàn),具有較強(qiáng)的靈活性和可控性。

實(shí)現(xiàn)方式

使用Spring Cloud Config和Apollo等配置中心實(shí)現(xiàn)降級(jí)開關(guān):

@Service
public class UserProfileService {
    @Autowired
    private RedisTemplate<String, UserProfile> redisTemplate;
    
    @Autowired
    private UserRepository userRepository;
    
    @Value("${feature.profile.full-mode:true}")
    private boolean fullProfileMode;
    
    @Value("${feature.profile.use-cache:true}")
    private boolean useCache;
    
    // Apollo配置中心監(jiān)聽器自動(dòng)刷新配置
    @ApolloConfigChangeListener
    private void onChange(ConfigChangeEvent changeEvent) {
        if (changeEvent.isChanged("feature.profile.full-mode")) {
            fullProfileMode = Boolean.parseBoolean(changeEvent.getChange("feature.profile.full-mode").getNewValue());
        }
        if (changeEvent.isChanged("feature.profile.use-cache")) {
            useCache = Boolean.parseBoolean(changeEvent.getChange("feature.profile.use-cache").getNewValue());
        }
    }
    
    public UserProfile getUserProfile(String userId) {
        if (!useCache) {
            // 緩存降級(jí)開關(guān)已啟用,直接查詢數(shù)據(jù)庫
            return getUserProfileFromDb(userId, fullProfileMode);
        }
        
        // 嘗試從緩存獲取
        try {
            UserProfile profile = redisTemplate.opsForValue().get("user:profile:" + userId);
            if (profile != null) {
                return profile;
            }
        } catch (Exception e) {
            // 緩存異常時(shí)記錄日志,并繼續(xù)從數(shù)據(jù)庫獲取
            log.warn("Redis cache failure when getting user profile", e);
            // 可以在這里觸發(fā)自動(dòng)降級(jí)開關(guān)
            triggerAutoDegradation("profile.cache");
        }
        
        // 緩存未命中或異常,從數(shù)據(jù)庫獲取
        return getUserProfileFromDb(userId, fullProfileMode);
    }
    
    // 根據(jù)fullProfileMode決定是否加載完整或簡化的用戶資料
    private UserProfile getUserProfileFromDb(String userId, boolean fullMode) {
        if (fullMode) {
            // 獲取完整用戶資料,包括詳細(xì)信息、偏好設(shè)置等
            UserProfile fullProfile = userRepository.findFullProfileById(userId);
            try {
                // 嘗試更新緩存,但不影響主流程
                if (useCache) {
                    redisTemplate.opsForValue().set("user:profile:" + userId, fullProfile, 30, TimeUnit.MINUTES);
                }
            } catch (Exception e) {
                log.error("Failed to update user profile cache", e);
            }
            return fullProfile;
        } else {
            // 降級(jí)模式:只獲取基本用戶信息
            return userRepository.findBasicProfileById(userId);
        }
    }
    
    // 觸發(fā)自動(dòng)降級(jí)
    private void triggerAutoDegradation(String feature) {
        // 實(shí)現(xiàn)自動(dòng)降級(jí)邏輯,如通過配置中心API修改配置
        // 或更新本地降級(jí)狀態(tài),在達(dá)到閾值后自動(dòng)降級(jí)
    }
}

優(yōu)缺點(diǎn)分析

優(yōu)點(diǎn)

  • 靈活性高,可以根據(jù)不同場景配置不同級(jí)別的降級(jí)策略
  • 可動(dòng)態(tài)調(diào)整,無需重啟應(yīng)用
  • 精細(xì)化控制,可以只降級(jí)特定功能
  • 結(jié)合監(jiān)控系統(tǒng)可實(shí)現(xiàn)自動(dòng)降級(jí)和恢復(fù)

缺點(diǎn)

  • 實(shí)現(xiàn)復(fù)雜度較高,需要配置中心支持
  • 需要預(yù)先設(shè)計(jì)多種功能級(jí)別和降級(jí)方案
  • 測試難度增加,需要驗(yàn)證各種降級(jí)場景
  • 管理開關(guān)狀態(tài)需要額外的運(yùn)維工作

適用場景

  • 大型復(fù)雜系統(tǒng),有明確的功能優(yōu)先級(jí)
  • 流量波動(dòng)大,需要?jiǎng)討B(tài)調(diào)整系統(tǒng)行為的場景
  • 有完善監(jiān)控體系,能夠及時(shí)發(fā)現(xiàn)問題
  • 對系統(tǒng)可用性要求高,容忍部分功能降級(jí)的業(yè)務(wù)

策略四:熔斷與限流策略

原理

熔斷與限流策略通過監(jiān)控Redis的響應(yīng)狀態(tài),當(dāng)發(fā)現(xiàn)異常時(shí)自動(dòng)觸發(fā)熔斷機(jī)制,暫時(shí)切斷對Redis的訪問,避免雪崩效應(yīng)。同時(shí),通過限流控制進(jìn)入系統(tǒng)的請求量,防止在降級(jí)期間系統(tǒng)過載。

實(shí)現(xiàn)方式

使用Resilience4j或Sentinel實(shí)現(xiàn)熔斷與限流:

@Service
public class ProductCatalogService {
    @Autowired
    private RedisTemplate<String, List<Product>> redisTemplate;
    
    @Autowired
    private ProductCatalogRepository repository;
    
    // 創(chuàng)建熔斷器
    private final CircuitBreaker circuitBreaker = CircuitBreaker.ofDefaults("redisCatalogCache");
    
    // 創(chuàng)建限流器
    private final RateLimiter rateLimiter = RateLimiter.of("catalogService", RateLimiterConfig.custom()
            .limitRefreshPeriod(Duration.ofSeconds(1))
            .limitForPeriod(1000) // 每秒允許1000次請求
            .timeoutDuration(Duration.ofMillis(25))
            .build());
    
    public List<Product> getProductsByCategory(String category, int page, int size) {
        // 應(yīng)用限流
        rateLimiter.acquirePermission();
        
        String cacheKey = "products:category:" + category + ":" + page + ":" + size;
        
        // 使用熔斷器包裝Redis調(diào)用
        Supplier<List<Product>> redisCall = CircuitBreaker.decorateSupplier(
                circuitBreaker, 
                () -> redisTemplate.opsForValue().get(cacheKey)
        );
        
        try {
            // 嘗試從Redis獲取數(shù)據(jù)
            List<Product> products = redisCall.get();
            if (products != null) {
                return products;
            }
        } catch (Exception e) {
            // 熔斷器會(huì)處理異常,這里只需記錄日志
            log.warn("Failed to get products from cache, fallback to database", e);
        }
        
        // 熔斷或緩存未命中,從數(shù)據(jù)庫加載
        List<Product> products = repository.findByCategory(category, PageRequest.of(page, size));
        
        // 只在熔斷器閉合狀態(tài)下更新緩存
        if (circuitBreaker.getState() == CircuitBreaker.State.CLOSED) {
            try {
                redisTemplate.opsForValue().set(cacheKey, products, 1, TimeUnit.HOURS);
            } catch (Exception e) {
                log.error("Failed to update product cache", e);
            }
        }
        
        return products;
    }
    
    // 提供熔斷器狀態(tài)監(jiān)控端點(diǎn)
    public CircuitBreakerStatus getCircuitBreakerStatus() {
        return new CircuitBreakerStatus(
                circuitBreaker.getState().toString(),
                circuitBreaker.getMetrics().getFailureRate(),
                circuitBreaker.getMetrics().getNumberOfBufferedCalls(),
                circuitBreaker.getMetrics().getNumberOfFailedCalls()
        );
    }
    
    // 值對象:熔斷器狀態(tài)
    @Data
    @AllArgsConstructor
    public static class CircuitBreakerStatus {
        private String state;
        private float failureRate;
        private int totalCalls;
        private int failedCalls;
    }
}

優(yōu)缺點(diǎn)分析

優(yōu)點(diǎn)

  • 能夠自動(dòng)檢測Redis異常并做出反應(yīng)
  • 防止故障級(jí)聯(lián)傳播,避免雪崩效應(yīng)
  • 具有自我恢復(fù)能力,可以在Redis恢復(fù)后自動(dòng)切回
  • 通過限流保護(hù)后端系統(tǒng),避免降級(jí)期間過載

缺點(diǎn)

  • 實(shí)現(xiàn)較為復(fù)雜,需要引入額外的熔斷和限流庫
  • 熔斷器參數(shù)調(diào)優(yōu)有一定難度
  • 可能引入額外的延遲
  • 需要更多的監(jiān)控和管理

適用場景

  • 高并發(fā)系統(tǒng),對Redis依賴較重
  • 微服務(wù)架構(gòu),需要防止故障傳播
  • 有明確的服務(wù)等級(jí)協(xié)議(SLA),對響應(yīng)時(shí)間敏感
  • 系統(tǒng)具備較好的監(jiān)控能力,能夠觀察熔斷狀態(tài)

總結(jié)

通過合理實(shí)施Redis緩存降級(jí)策略,即使在緩存層出現(xiàn)故障的情況下,系統(tǒng)仍能保持基本功能,為用戶提供持續(xù)可用的服務(wù)。這不僅提高了系統(tǒng)的可靠性,也為業(yè)務(wù)連續(xù)性提供了有力保障。

到此這篇關(guān)于Redis緩存降級(jí)的四種策略的文章就介紹到這了,更多相關(guān)Redis緩存降級(jí)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 利用Redis的有序集合實(shí)現(xiàn)排行榜功能實(shí)例代碼

    利用Redis的有序集合實(shí)現(xiàn)排行榜功能實(shí)例代碼

    這篇文章主要給大家介紹了關(guān)于如何利用Redis的有序集合實(shí)現(xiàn)排行榜功能的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者使用Redis具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • Linux服務(wù)器使用Redis作為數(shù)據(jù)緩存并用log4j2進(jìn)行日志記錄的過程分享

    Linux服務(wù)器使用Redis作為數(shù)據(jù)緩存并用log4j2進(jìn)行日志記錄的過程分享

    這篇文章主要介紹了Linux服務(wù)器使用Redis作為數(shù)據(jù)緩存并用log4j2日志記錄,關(guān)于SpringBoot項(xiàng)目配置Redis與log4j2是查詢官方文檔,本文中的Redis配置類、Redis工具類以及l(fā)og4j2.xml配置文件來自網(wǎng)絡(luò),查證源自何處比較麻煩,所以在此感謝所有人的分享
    2023-09-09
  • Redis 大key的幾種刪除方式

    Redis 大key的幾種刪除方式

    大key刪除直接調(diào)用 del 命令刪除key,容易造成請求被阻塞,本文主要介紹了Redis 大key的幾種刪除方式,具有一定的參考價(jià)值,感興趣的可以了解一下
    2025-03-03
  • 解決redis批量刪除key值的問題

    解決redis批量刪除key值的問題

    在開發(fā)過程中,會(huì)遇到要批量刪除某種規(guī)則的key值,但是通常情況下沒有批量刪除某一個(gè)類的命令,遇到這種情況該如何處理呢?下面小編給大家?guī)砹藃edis批量刪除key值的問題,感興趣的朋友一起看看吧
    2022-03-03
  • Redis鏈表底層實(shí)現(xiàn)及生產(chǎn)實(shí)戰(zhàn)

    Redis鏈表底層實(shí)現(xiàn)及生產(chǎn)實(shí)戰(zhàn)

    Redis 的 List 是一個(gè)雙向鏈表,鏈表中的每個(gè)節(jié)點(diǎn)都包含了一個(gè)字符串。是redis中最常用的數(shù)據(jù)結(jié)構(gòu)之一,本文主要介紹了Redis鏈表底層實(shí)現(xiàn)及生產(chǎn)實(shí)戰(zhàn),文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • 使用Grafana監(jiān)控Redis的操作方法

    使用Grafana監(jiān)控Redis的操作方法

    這篇文章主要介紹了使用Grafana監(jiān)控Redis,號(hào)稱下一代可視化監(jiān)控系統(tǒng),結(jié)合SpringBoot使用,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-04-04
  • ELK配置轉(zhuǎn)存redis緩存采集nginx訪問日志的操作方法

    ELK配置轉(zhuǎn)存redis緩存采集nginx訪問日志的操作方法

    本文介紹了在服務(wù)器上部署MySQL及如何啟動(dòng)MySQL服務(wù),并詳細(xì)說明了如何查找安裝軟件的日志文件位置,通過使用rpm命令查詢MySQL服務(wù)的日志文件位置,以及通過編輯Logstash配置文件來添加MySQL日志信息,感興趣的朋友一起看看吧
    2024-11-11
  • Redis使用ZSET實(shí)現(xiàn)消息隊(duì)列的項(xiàng)目實(shí)踐

    Redis使用ZSET實(shí)現(xiàn)消息隊(duì)列的項(xiàng)目實(shí)踐

    本文主要介紹了Redis使用ZSET實(shí)現(xiàn)消息隊(duì)列的項(xiàng)目實(shí)踐,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • Redis的緩存機(jī)制用法及說明

    Redis的緩存機(jī)制用法及說明

    Redis緩存可以有效提高高并發(fā)場景下的數(shù)據(jù)庫性能,通過定期生成熱數(shù)據(jù)、實(shí)時(shí)生成熱數(shù)據(jù)、緩存淘汰策略以及解決緩存預(yù)熱、穿透、雪崩和擊穿等問題,可以更好地利用Redis緩存
    2026-03-03
  • Redis 中的 BitMaps(位圖)命令詳解

    Redis 中的 BitMaps(位圖)命令詳解

    Redis的Bitmaps利用字符串?dāng)?shù)據(jù)類型進(jìn)行位操作,提供getbit、setbit、bitcount等命令,適用于簽到統(tǒng)計(jì)、頻率記錄等場景,下面就來詳細(xì)的介紹一下使用方法
    2025-09-09

最新評論

永靖县| 淅川县| 灌云县| 温泉县| 五指山市| 新巴尔虎左旗| 绥中县| 新竹县| 乡宁县| 临沭县| 阳谷县| 隆昌县| 罗定市| 招远市| 峨边| 厦门市| 南丰县| 曲阜市| 高台县| 万盛区| 甘肃省| 清涧县| 罗城| 沛县| 陇西县| 襄垣县| 诏安县| 农安县| 资溪县| 丰宁| 定远县| 利津县| 普洱| 梧州市| 嘉兴市| 元谋县| 博白县| 枞阳县| 太康县| 桐城市| 九龙县|