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

SpringBoot整合Redis實現(xiàn)訂單超時自動刪除功能

 更新時間:2025年07月16日 09:22:11   作者:奇妙智能  
在電商、外賣等場景中,訂單超時未支付是常見業(yè)務(wù)場景,傳統(tǒng)方案通過定時任務(wù)輪詢數(shù)據(jù)庫,但存在??延遲高??、??數(shù)據(jù)庫壓力大等問題,Redis的??過期鍵自動刪除機(jī)制??,可完美解決這一痛點,所以本文給大家介紹了SpringBoot整合Redis實現(xiàn)訂單超時自動刪除

引言

在電商、外賣等O2O場景中,訂單超時未支付是常見業(yè)務(wù)場景。例如:用戶下單后30分鐘內(nèi)未支付,系統(tǒng)需自動取消訂單并釋放庫存。傳統(tǒng)方案通過定時任務(wù)輪詢數(shù)據(jù)庫(如每5分鐘掃描一次超時訂單),但存在??延遲高(最長延遲5分鐘)??、??數(shù)據(jù)庫壓力大(全表掃描)??等問題。

Redis的??過期鍵自動刪除機(jī)制??+??鍵空間通知??功能,可完美解決這一痛點:訂單創(chuàng)建時存入Redis并設(shè)置過期時間(如30分鐘),過期后Redis自動觸發(fā)刪除事件,系統(tǒng)監(jiān)聽該事件并執(zhí)行訂單取消邏輯。此方案延遲低(通常毫秒級)、性能高(Redis內(nèi)存操作),是互聯(lián)網(wǎng)高并發(fā)場景的首選。

一、Redis過期機(jī)制核心原理

1.1 Redis的鍵過期策略

Redis支持為鍵設(shè)置過期時間(EXPIRE/PEXPIRE命令),過期后鍵會被自動刪除。其刪除策略包含三種機(jī)制:

策略類型觸發(fā)條件特點
??惰性刪除??訪問鍵時檢查是否過期內(nèi)存友好(不主動掃描),但可能導(dǎo)致過期鍵長期殘留(未被訪問時)
??定期刪除??Redis后臺線程周期性掃描主動清理過期鍵(默認(rèn)每100ms掃描1%數(shù)據(jù)庫),平衡內(nèi)存與CPU開銷
??永久有效??未設(shè)置過期時間鍵會一直存在,直到顯式刪除或Redis重啟

??注意??:生產(chǎn)環(huán)境需確保redis.confmaxmemory-policy設(shè)置為volatile-ttl(優(yōu)先刪除即將過期的鍵),避免內(nèi)存溢出。

1.2 鍵空間通知(Keyspace Notifications)

Redis支持通過??發(fā)布-訂閱模式??通知客戶端鍵的過期事件。需在redis.conf中啟用相關(guān)配置:

notify-keyspace-events Ex  # E表示啟用鍵事件通知,x表示過期事件

啟用后,當(dāng)鍵過期時,Redis會向__keyevent@<db>__:expired頻道發(fā)送消息(<db>為數(shù)據(jù)庫編號,默認(rèn)0)。

二、Spring Boot整合Redis環(huán)境準(zhǔn)備

2.1 依賴配置

pom.xml中添加Spring Data Redis依賴:

<dependencies>
    <!-- Spring Boot Redis Starter -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency>
    
    <!-- Lettuce連接池(默認(rèn)使用Lettuce,比Jedis更輕量) -->
    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-pool2</artifactId>
    </dependency>
    
    <!-- Lombok簡化代碼 -->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
</dependencies>

2.2 Redis配置

application.yml中配置Redis連接信息及序列化方式:

spring:
  redis:
    host: localhost          # Redis服務(wù)器地址
    port: 6379               # 端口號(默認(rèn)6379)
    password: 123456         # 密碼(無密碼則忽略)
    database: 0              # 使用數(shù)據(jù)庫0(默認(rèn))
    lettuce:                 # Lettuce連接池配置
      pool:
        max-active: 8        # 最大連接數(shù)
        max-idle: 8          # 最大空閑連接
        min-idle: 0          # 最小空閑連接
        max-wait: 10000ms    # 連接池最大等待時間
    
    # 序列化配置(默認(rèn)JDK序列化,推薦JSON)
    redis:
      serializer:
        key: org.springframework.data.redis.serializer.StringRedisSerializer
        value: org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer

2.3 自動配置驗證

編寫測試類驗證Redis連接:

@SpringBootTest
@Slf4j
public class RedisConfigTest {

    @Autowired
    private RedisTemplate<String, Object> redisTemplate;

    @Test
    public void testRedisConnection() {
        String key = "test_key";
        String value = "test_value";
        
        // 寫入Redis
        redisTemplate.opsForValue().set(key, value);
        // 讀取Redis
        String result = (String) redisTemplate.opsForValue().get(key);
        log.info("Redis測試結(jié)果:{}", result);  // 應(yīng)輸出"test_value"
    }
}

三、訂單超時自動刪除核心實現(xiàn)

3.1 訂單實體類設(shè)計

定義訂單實體(需包含唯一標(biāo)識、過期時間等業(yè)務(wù)字段):

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Order {
    private Long id;                // 訂單ID
    private String userId;          // 用戶ID
    private BigDecimal amount;      // 訂單金額
    private LocalDateTime createTime; // 創(chuàng)建時間
    private LocalDateTime expireTime; // 過期時間(用于展示)
    private String status;          // 訂單狀態(tài)(待支付/已支付/已取消)
}

3.2 訂單Redis存儲結(jié)構(gòu)設(shè)計

選擇Hash結(jié)構(gòu)存儲訂單詳情(支持部分字段更新),鍵格式為order:{orderId},字段包括:

  • id:訂單ID(與鍵重復(fù),冗余存儲便于查詢)
  • userId:用戶ID
  • amount:訂單金額
  • status:訂單狀態(tài)
  • createTime:創(chuàng)建時間

??示例鍵??:order:10001(對應(yīng)訂單ID為10001的訂單)

3.3 訂單創(chuàng)建與Redis存儲邏輯

在訂單服務(wù)中,創(chuàng)建訂單后需同步存入Redis并設(shè)置過期時間(如30分鐘):

@Service
@Slf4j
public class OrderService {

    @Autowired
    private RedisTemplate<String, Object> redisTemplate;
    
    @Autowired
    private OrderRepository orderRepository;  // 數(shù)據(jù)庫操作(假設(shè)使用JPA)
    
    // 訂單有效時長(30分鐘,單位:秒)
    private static final long ORDER_EXPIRE_SECONDS = 30 * 60;

    /**
     * 創(chuàng)建訂單(同步數(shù)據(jù)庫與Redis)
     */
    @Transactional
    public Order createOrder(Order order) {
        // 1. 保存訂單到數(shù)據(jù)庫
        order.setStatus("待支付");
        order.setCreateTime(LocalDateTime.now());
        order.setExpireTime(order.getCreateTime().plusMinutes(30));
        Order savedOrder = orderRepository.save(order);
        
        // 2. 存儲訂單到Redis并設(shè)置過期時間
        String redisKey = "order:" + savedOrder.getId();
        redisTemplate.opsForHash().putAll(redisKey, new HashMap<String, Object>() {{
            put("id", savedOrder.getId());
            put("userId", savedOrder.getUserId());
            put("amount", savedOrder.getAmount());
            put("status", savedOrder.getStatus());
            put("createTime", savedOrder.getCreateTime().toString());
        }});
        // 設(shè)置鍵的過期時間(30分鐘)
        redisTemplate.expire(redisKey, ORDER_EXPIRE_SECONDS, TimeUnit.SECONDS);
        
        return savedOrder;
    }

    /**
     * 支付成功后刪除Redis訂單(避免觸發(fā)過期事件)
     */
    @Transactional
    public void payOrder(Long orderId) {
        // 1. 更新數(shù)據(jù)庫訂單狀態(tài)為已支付
        Order order = orderRepository.findById(orderId)
                .orElseThrow(() -> new RuntimeException("訂單不存在"));
        order.setStatus("已支付");
        orderRepository.save(order);
        
        // 2. 從Redis刪除該訂單(避免過期事件觸發(fā)取消邏輯)
        String redisKey = "order:" + orderId;
        redisTemplate.delete(redisKey);
    }
}

3.4 監(jiān)聽Redis過期事件(關(guān)鍵邏輯)

通過監(jiān)聽Redis的expired事件,觸發(fā)訂單取消和庫存釋放操作。步驟如下:

3.4.1 定義事件監(jiān)聽器

@Component
@Slf4j
public class RedisOrderExpiredListener {

    @Autowired
    private OrderService orderService;  // 假設(shè)包含取消訂單和釋放庫存的方法
    
    @Autowired
    private RedisConnectionFactory redisConnectionFactory;

    @PostConstruct
    public void init() {
        // 創(chuàng)建Redis消息監(jiān)聽容器
        RedisMessageListenerContainer container = new RedisMessageListenerContainer();
        container.setConnectionFactory(redisConnectionFactory);
        
        // 訂閱過期事件(頻道格式:__keyevent@0__:expired)
        container.addMessageListener(this::handleOrderExpired, 
                new PatternTopic("__keyevent@0__:expired"));
    }

    /**
     * 處理訂單過期事件
     */
    private void handleOrderExpired(Message message, byte[] pattern) {
        // 1. 解析過期的鍵名(格式:order:10001)
        String expiredKey = new String(message.getBody(), StandardCharsets.UTF_8);
        if (!expiredKey.startsWith("order:")) {
            log.warn("非訂單鍵過期,跳過處理:{}", expiredKey);
            return;
        }
        
        // 2. 提取訂單ID(去除前綴"order:")
        String orderIdStr = expiredKey.substring("order:".length());
        Long orderId;
        try {
            orderId = Long.parseLong(orderIdStr);
        } catch (NumberFormatException e) {
            log.error("訂單ID格式錯誤,鍵:{}", expiredKey, e);
            return;
        }
        
        // 3. 查詢數(shù)據(jù)庫確認(rèn)訂單狀態(tài)(避免Redis數(shù)據(jù)與數(shù)據(jù)庫不一致)
        Order order = orderService.getOrderById(orderId);
        if (order == null || !"待支付".equals(order.getStatus())) {
            log.info("訂單已處理或不存在,無需取消:{}", orderId);
            return;
        }
        
        // 4. 執(zhí)行訂單取消邏輯(冪等性設(shè)計,避免重復(fù)處理)
        try {
            orderService.cancelOrder(orderId);
            log.info("訂單超時自動取消成功,orderId={}", orderId);
        } catch (Exception e) {
            log.error("訂單取消失敗,orderId={}", orderId, e);
            // 可重試或人工介入
        }
    }
}

3.4.2 訂單取消邏輯實現(xiàn)

OrderService中添加取消訂單方法(需保證冪等性):

@Service
@Slf4j
public class OrderService {

    // ...(其他方法)

    /**
     * 取消訂單(釋放庫存、更新狀態(tài))
     */
    @Transactional
    public void cancelOrder(Long orderId) {
        Order order = orderRepository.findById(orderId)
                .orElseThrow(() -> new RuntimeException("訂單不存在"));
        
        // 冪等性校驗(避免重復(fù)取消)
        if (!"待支付".equals(order.getStatus())) {
            log.info("訂單已取消或已支付,無需重復(fù)操作:{}", orderId);
            return;
        }
        
        // 1. 更新訂單狀態(tài)為已取消
        order.setStatus("已取消");
        orderRepository.save(order);
        
        // 2. 釋放庫存(調(diào)用庫存服務(wù))
        stockService.releaseStock(order.getUserId(), order.getAmount());
    }
}

3.5 庫存服務(wù)接口(示例)

@Service
@Slf4j
public class StockService {

    /**
     * 釋放庫存(示例方法)
     */
    public void releaseStock(String userId, BigDecimal amount) {
        log.info("釋放用戶{}的庫存,金額:{}", userId, amount);
        // 實際邏輯:調(diào)用庫存微服務(wù)API或操作庫存數(shù)據(jù)庫
    }
}

四、關(guān)鍵技術(shù)細(xì)節(jié)與優(yōu)化

4.1 避免Redis與數(shù)據(jù)庫數(shù)據(jù)不一致

由于Redis是緩存層,可能存在??主從復(fù)制延遲??或??緩存擊穿??導(dǎo)致的數(shù)據(jù)不一致。解決方案:

  • ??雙寫校驗??:在取消訂單時,先更新數(shù)據(jù)庫狀態(tài),再刪除Redis(而非僅依賴Redis過期)。如payOrder方法中,先更新數(shù)據(jù)庫再刪Redis。
  • ??延遲監(jiān)聽??:監(jiān)聽過期事件后,再次查詢數(shù)據(jù)庫確認(rèn)訂單狀態(tài)(如示例中的getOrderById),避免因網(wǎng)絡(luò)延遲或主從同步導(dǎo)致的臟數(shù)據(jù)。

4.2 過期時間的精準(zhǔn)控制

Redis的過期時間是??近似精確??的(誤差通常在1秒內(nèi)),對于高精度場景(如金融交易),可結(jié)合數(shù)據(jù)庫的expire_time字段,在查詢訂單時校驗是否超時:

/**
 * 查詢訂單(同時校驗是否超時)
 */
public Order getOrderById(Long orderId) {
    Order order = orderRepository.findById(orderId).orElse(null);
    if (order != null && "待支付".equals(order.getStatus())) {
        // 校驗是否超時(數(shù)據(jù)庫時間與當(dāng)前時間比較)
        LocalDateTime now = LocalDateTime.now();
        if (now.isAfter(order.getExpireTime())) {
            // 觸發(fā)取消邏輯(避免Redis未及時刪除)
            cancelOrder(orderId);
            return null;  // 返回null表示訂單已取消
        }
    }
    return order;
}

4.3 高并發(fā)場景下的性能優(yōu)化

??批量監(jiān)聽??:使用RedisMessageListenerContainer的線程池配置,提升事件處理能力:

@Bean
public RedisMessageListenerContainer redisMessageListenerContainer(RedisConnectionFactory connectionFactory) {
    RedisMessageListenerContainer container = new RedisMessageListenerContainer();
    container.setConnectionFactory(connectionFactory);
    // 配置線程池(核心線程數(shù)、最大線程數(shù))
    container.setTaskExecutor(Executors.newFixedThreadPool(10));
    return container;
}

??異步處理??:訂單取消邏輯(如釋放庫存)使用@Async注解異步執(zhí)行,避免阻塞監(jiān)聽線程:

@Service
@Slf4j
public class OrderService {

    @Autowired
    private StockService stockService;

    @Async("asyncTaskExecutor")  // 使用自定義線程池
    public void releaseStock(Long userId, BigDecimal amount) {
        stockService.releaseStock(userId, amount);
    }
}

配置自定義線程池:

@Configuration
@EnableAsync
public class AsyncConfig {

    @Bean("asyncTaskExecutor")
    public Executor asyncTaskExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(5);      // 核心線程數(shù)
        executor.setMaxPoolSize(20);      // 最大線程數(shù)
        executor.setQueueCapacity(100);   // 隊列容量
        executor.setKeepAliveSeconds(30); // 空閑線程存活時間
        executor.setThreadNamePrefix("order-async-");
        executor.initialize();
        return executor;
    }
}

4.4 監(jiān)控與報警

  • ??Redis監(jiān)控??:通過INFO stats命令查看expired_keys指標(biāo)(每秒過期鍵數(shù)量),監(jiān)控異常過期情況。
  • ??日志報警??:在RedisOrderExpiredListener中添加異常報警(如連續(xù)10次處理失敗觸發(fā)郵件/釘釘通知)。
  • ??訂單超時率統(tǒng)計??:通過Prometheus+Grafana統(tǒng)計超時訂單占比,優(yōu)化業(yè)務(wù)邏輯(如延長熱門商品訂單的有效期)。

五、方案對比與適用場景

5.1 Redis方案 vs 定時任務(wù)方案

維度Redis方案定時任務(wù)方案
??延遲??毫秒級(Redis事件觸發(fā))最長延遲(任務(wù)間隔,如5分鐘)
??數(shù)據(jù)庫壓力??無(僅事件觸發(fā)時查詢)高(全表掃描)
??資源消耗??低(Redis內(nèi)存操作)高(任務(wù)線程資源)
??適用場景??高并發(fā)、低延遲超時場景(如電商訂單)低并發(fā)、允許延遲的場景(如日志清理)

5.2 擴(kuò)展方案:Redisson延遲隊列

若需要更復(fù)雜的延遲任務(wù)管理(如動態(tài)調(diào)整延遲時間、任務(wù)優(yōu)先級),可使用Redisson的RDelayedQueue

// Redisson配置
@Bean
public RedissonClient redissonClient() {
    Config config = new Config();
    config.useSingleServer().setAddress("redis://localhost:6379");
    return Redisson.create(config);
}

// 使用延遲隊列
@Service
@Slf4j
public class RedissonDelayedQueueService {

    @Autowired
    private RedissonClient redissonClient;

    private RDelayedQueue<Order> delayedQueue;
    private RBlockingQueue<Order> blockingQueue;

    @PostConstruct
    public void init() {
        blockingQueue = redissonClient.getBlockingQueue("orderDelayedQueue");
        delayedQueue = redissonClient.getDelayedQueue(blockingQueue);
    }

    /**
     * 添加延遲訂單(30分鐘后觸發(fā))
     */
    public void addDelayedOrder(Order order) {
        delayedQueue.offer(order, 30, TimeUnit.MINUTES);
    }

    /**
     * 處理延遲訂單(阻塞獲?。?
     */
    public void processDelayedOrders() {
        while (true) {
            try {
                Order order = blockingQueue.take();  // 阻塞直到有訂單到期
                log.info("處理延遲訂單:{}", order.getId());
                // 執(zhí)行取消邏輯...
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
                break;
            }
        }
    }
}

??適用場景??:需要動態(tài)調(diào)整延遲時間、批量管理延遲任務(wù)的復(fù)雜場景(如網(wǎng) 約車派單超時)。

六、總結(jié)

本文詳細(xì)講解了Spring Boot整合Redis實現(xiàn)訂單超時自動刪除的全流程,核心步驟包括:

  1. ??Redis過期機(jī)制??:利用EXPIRE命令設(shè)置鍵的過期時間,結(jié)合鍵空間通知監(jiān)聽過期事件。
  2. ??訂單存儲設(shè)計??:使用Hash結(jié)構(gòu)存儲訂單詳情,鍵格式為order:{orderId},設(shè)置30分鐘過期時間。
  3. ??事件監(jiān)聽邏輯??:通過RedisMessageListenerContainer監(jiān)聽__keyevent@0__:expired頻道,解析過期鍵并觸發(fā)訂單取消。
  4. ??數(shù)據(jù)一致性保障??:監(jiān)聽事件后查詢數(shù)據(jù)庫確認(rèn)訂單狀態(tài),避免Redis與數(shù)據(jù)庫數(shù)據(jù)不一致。
  5. ??性能優(yōu)化??:異步處理取消邏輯、線程池調(diào)優(yōu)、雙寫校驗等措施提升系統(tǒng)穩(wěn)定性。

Redis方案憑借其??低延遲、高吞吐量??的特性,成為互聯(lián)網(wǎng)高并發(fā)場景下訂單超時處理的首選方案。實際開發(fā)中需結(jié)合業(yè)務(wù)需求,選擇Redis原生方案或Redisson等擴(kuò)展工具,確保系統(tǒng)的可靠性和可維護(hù)性。 

以上就是SpringBoot整合Redis實現(xiàn)訂單超時自動刪除功能的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot Redis訂單超時自動刪除的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • JavaSE基礎(chǔ)之反射機(jī)制(反射Class)詳解

    JavaSE基礎(chǔ)之反射機(jī)制(反射Class)詳解

    反射機(jī)制有什么用?通過java語言中的反射機(jī)制可以操作字節(jié)碼文件,可以讀和修改字節(jié)碼文件。所以本文將為大家講講反射機(jī)制的使用,需要的可以參考一下
    2022-09-09
  • java實現(xiàn)抽獎功能解析

    java實現(xiàn)抽獎功能解析

    這篇文章主要為大家詳細(xì)介紹了java實現(xiàn)抽獎功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-03-03
  • 一些常用Java命令及應(yīng)用總結(jié)

    一些常用Java命令及應(yīng)用總結(jié)

    這篇文章主要介紹了一些常用Java命令及應(yīng)用的相關(guān)資料,詳細(xì)講解了如何使用這些命令來排查Cpu和內(nèi)存飆高的問題,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-04-04
  • springboot默認(rèn)文件緩存(easy-captcha?驗證碼)

    springboot默認(rèn)文件緩存(easy-captcha?驗證碼)

    這篇文章主要介紹了springboot的文件緩存(easy-captcha?驗證碼),本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-06-06
  • SpringBoot統(tǒng)一數(shù)據(jù)返回的方法實現(xiàn)

    SpringBoot統(tǒng)一數(shù)據(jù)返回的方法實現(xiàn)

    在前后端交互過程中,為了便于數(shù)據(jù)處理,后端數(shù)據(jù)需要進(jìn)行統(tǒng)一封裝返回給前端,這種做法不僅方便前后端溝通,降低了溝通成本,還有助于項目的統(tǒng)一維護(hù)和后端技術(shù)部門的規(guī)范制定,本文就來介紹一下
    2024-10-10
  • java 實現(xiàn)增量同步和自定義同步的操作

    java 實現(xiàn)增量同步和自定義同步的操作

    這篇文章主要介紹了java 實現(xiàn)增量同步和自定義同步的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • JavaEE多線程中阻塞隊列的項目實踐

    JavaEE多線程中阻塞隊列的項目實踐

    本文主要介紹了JavaEE多線程中阻塞隊列的項目實踐,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-09-09
  • SpringBoot項目中接口防刷的完整代碼

    SpringBoot項目中接口防刷的完整代碼

    本文通過實例代碼給大家介紹了SpringBoot項目中接口防刷的方法,代碼簡單易懂,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2021-07-07
  • Java AOP實現(xiàn)自定義滑動窗口限流器方法詳解

    Java AOP實現(xiàn)自定義滑動窗口限流器方法詳解

    這篇文章主要介紹了Java AOP實現(xiàn)自定義滑動窗口限流器方法,其中滑動窗口算法彌補(bǔ)了計數(shù)器算法的不足,滑動窗口算法把間隔時間劃分成更小的粒度,當(dāng)更小粒度的時間間隔過去后,把過去的間隔請求數(shù)減掉,再補(bǔ)充一個空的時間間隔,需要的朋友可以參考下
    2022-07-07
  • @PostConstruct在項目啟動時被執(zhí)行兩次或多次的原因及分析

    @PostConstruct在項目啟動時被執(zhí)行兩次或多次的原因及分析

    這篇文章主要介紹了@PostConstruct在項目啟動時被執(zhí)行兩次或多次的原因及分析,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08

最新評論

吉木萨尔县| 温泉县| 海丰县| 通州区| 桂东县| 绥芬河市| 宾阳县| 平利县| 顺义区| 紫阳县| 巫山县| 蕉岭县| 临猗县| 乐东| 兴义市| 钟祥市| 始兴县| 分宜县| 伊金霍洛旗| 府谷县| 峨边| 墨玉县| 秀山| 新田县| 新闻| 彰化市| 新疆| 苍溪县| 青河县| 柘城县| 兴文县| 中阳县| 西畴县| 定边县| 大方县| 伊春市| 浦江县| 太和县| 玉溪市| 关岭| 外汇|