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

集成Spring Redis緩存的實(shí)現(xiàn)

 更新時(shí)間:2018年12月24日 14:16:18   作者:isea533  
今天小編就為大家分享一篇關(guān)于集成Spring Redis緩存的實(shí)現(xiàn),小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧

這里的緩存主要是用于 Service 層的,所以下面的配置,都是針對(duì) service 模塊的。

本文來(lái)自內(nèi)部分享,對(duì)特殊信息進(jìn)行了簡(jiǎn)單處理。

本文都是在以緩存來(lái)講 Redis 的使用,實(shí)際上 Redis 不僅僅用于緩存,本身還是 NoSQL 數(shù)據(jù)庫(kù),大家可以自己查找學(xué)習(xí) Redis 的常用場(chǎng)景。

一、添加依賴

<!--緩存-->
<dependency>
 <groupId>org.springframework</groupId>
 <artifactId>spring-context-support</artifactId>
 <version>4.3.14.RELEASE</version>
</dependency>
<!--redis-->
<dependency>
 <groupId>org.springframework.data</groupId>
 <artifactId>spring-data-redis</artifactId>
 <version>1.8.10.RELEASE</version>
</dependency>
<dependency>
 <groupId>org.apache.commons</groupId>
 <artifactId>commons-pool2</artifactId>
 <version>2.4.3</version>
</dependency>
<dependency>
 <groupId>redis.clients</groupId>
 <artifactId>jedis</artifactId>
 <version>2.9.0</version>
</dependency>

二、配置

增加spring-redis.xml 配置文件,內(nèi)容如下:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:cache="http://www.springframework.org/schema/cache"
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/cache
http://www.springframework.org/schema/cache/spring-cache.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util.xsd">
  <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
    <property name="maxIdle" value="${redis.pool.maxIdle}"/>
    <property name="maxTotal" value="${redis.pool.maxTotal}"/>
    <property name="maxWaitMillis" value="${redis.pool.maxWaitMillis}"/>
    <property name="testOnBorrow" value="${redis.pool.testOnBorrow}"/>
    <property name="testOnReturn" value="${redis.pool.testOnReturn}"/>
  </bean>
  <bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
    <property name="hostName" value="${redis.master.ip}"/>
    <property name="port" value="${redis.master.port}"/>
    <property name="poolConfig" ref="jedisPoolConfig"/>
  </bean>
  <bean id="redisKeySerializer" class="org.springframework.data.redis.serializer.StringRedisSerializer"/>
  <bean id="redisValueSerializer" class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer"/>
  <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
    <property name="connectionFactory" ref="jedisConnectionFactory"/>
    <property name="keySerializer" ref="redisKeySerializer"/>
    <property name="hashKeySerializer" ref="redisKeySerializer"/>
    <property name="valueSerializer" ref="redisValueSerializer"/>
    <property name="hashValueSerializer" ref="redisValueSerializer"/>
  </bean>
  <!--在 redis.properties 配置緩存詳細(xì)信息-->
  <util:properties id="redisExpires" location="classpath*:META-INF/spring/redis.properties"/>
  <bean id="cacheManager" class="org.springframework.data.redis.cache.RedisCacheManager">
    <constructor-arg index="0" ref="redisTemplate"/>
    <!--默認(rèn)緩存 10 分鐘-->
    <property name="defaultExpiration" value="600"/>
    <property name="usePrefix" value="true"/>
    <property name="expires" ref="redisExpires"/>
  </bean>
  <!--啟用 cache 注解-->
  <cache:annotation-driven cache-manager="cacheManager" proxy-target-class="true"/>
</beans>

在 src/main/resources/ 下面如果沒(méi)有META-INF/spring/ 目錄就創(chuàng)建一個(gè),然后增加 redis.properties 配置,示例如下:

# 緩存名=有效時(shí)間
halfHour=1800
oneHour=3600
oneDay=86400
webSession=1800
user=1800

除了上面配置外,在系統(tǒng)的 application.properties 中還需要提供下面幾個(gè)配置:

# redis 連接配置
redis.master.ip=10.10.10.100
redis.master.port=6379
# redis 連接池配置
redis.pool.maxIdle=200
redis.pool.maxTotal=1024
redis.pool.maxWaitMillis=1000
redis.pool.testOnBorrow=true
redis.pool.testOnReturn=true

三、通過(guò)注解方式使用緩存

示例中,redis.propreties 配置如下:

# 數(shù)據(jù)庫(kù)定義,緩存 30 天
databaseDef=2592000
# 數(shù)據(jù)庫(kù)元數(shù)據(jù),緩存 1 小時(shí)
databaseMeta=3600

這個(gè)示例在數(shù)據(jù)庫(kù)服務(wù)上配置的,數(shù)據(jù)庫(kù)服務(wù)中,查詢次數(shù)遠(yuǎn)遠(yuǎn)大于新增、修改、刪除的次數(shù),非常適合使用緩存。

1. 緩存數(shù)據(jù) @Cacheable

@Override
@Cacheable(value = "databaseDef", key = "'all'")
public List<DatabaseDefinitionVo> selectAll() {
 return databaseDefinitionDao.selectAllVo();
}

特別注意:所有這些注解中,key 的值是 Spel 表達(dá)式,必須按照 Spel 要求來(lái)寫。上面這個(gè)例子中,直接定義返回值的 key 是 all 字符串,需要加上單引號(hào)' 括起來(lái),下面還有其他用法。

在例子中,下面的方法也使用了這個(gè)注解:

@Override
@Cacheable(value = "databaseDef", key = "#id.toString()")
public DatabaseDefinition selectByPrimaryKey(Long id) {
  Assert.notNull(id, "數(shù)據(jù)庫(kù) ID 不能為空!");
  DatabaseDefinition definition = databaseDefinitionDao.selectByPrimaryKey(id);
  Assert.notNull(definition, "數(shù)據(jù)庫(kù)定義不存在!");
  return definition;
}

在上面注解中,key 中的 #id 指的是參數(shù)中的 id,在 IDEA 中會(huì)有自動(dòng)提示。.toString() 是調(diào)用 id 的方法,在系統(tǒng)中規(guī)定了 key 必須是字符串類型,所以當(dāng)類型是 Long 的時(shí)候,需要轉(zhuǎn)換。

使用緩存的目的就是為了減少上面兩個(gè)方法調(diào)用時(shí)減少和數(shù)據(jù)庫(kù)的交互,減小數(shù)據(jù)庫(kù)的壓力,這是兩個(gè)主要的緩存數(shù)據(jù)的方法,下面的幾個(gè)操作都和上面這兩個(gè)方法有一定的關(guān)系。

重點(diǎn):這里以及下面幾個(gè)注解中,都指定了 value = "databaseDef",這里的意思是說(shuō),要使用前面配置中的 databaseDef 對(duì)應(yīng)的配置,也就是會(huì)緩存 30天。

2. 更新緩存 @CachePut

@Override
@CachePut(value = "databaseDef", key = "#result.id.toString()")
public DatabaseDefinition save(DatabaseDefinition definition, CurrentUser userModel) 
   throws ServiceException {
 //代碼
 return definition;
}

更新緩存的方法需要注意的是返回值,在上面 save 方法中,有可能是新增,有可能是更新,不管是那個(gè)操作,當(dāng)操作完成后,上面注解會(huì)根據(jù) key 的值生成 key,然后將方法的返回值作為 value 保存到緩存中。

這里 key 的寫法中 #result 指代返回值,.id 是返回值的屬性,.toString() 是調(diào)用 id 屬性的方法,在系統(tǒng)中規(guī)定了 key 必須是字符串類型,所以當(dāng)類型是 Long 的時(shí)候,需要轉(zhuǎn)換。

這個(gè)方法上加的緩存還有問(wèn)題,當(dāng)新增或者更新后,通過(guò) selectAll() 返回的值已經(jīng)發(fā)生了變化,但是這里沒(méi)有清除 all 的緩存值,會(huì)導(dǎo)致 selectAll() 出現(xiàn)臟數(shù)據(jù),下面會(huì)通過(guò) @Caching 注解改造這里。

3. 清除緩存 @CacheEvict

@Override
@CacheEvict(value = "databaseDef", key = "#id.toString()")
public void deleteByPrimaryKey(Long id) throws ServiceException {
 DatabaseDefinition definition = selectByPrimaryKey(id);
 if (definition.getLoadState().equals(DatabaseDefinition.LoadState.UP)) {
  throw new ServiceException("請(qǐng)先卸載數(shù)據(jù)庫(kù)!");
 }
 databaseDefinitionDao.deleteByPrimaryKey(id);
}

在上面新增或者修改的時(shí)候根據(jù) id 緩存或者更新了緩存數(shù)據(jù),這里當(dāng)刪除數(shù)據(jù)的時(shí)候,還需要清空對(duì)應(yīng)的緩存數(shù)據(jù)。

在上面注解中,key 中的 #id 指的是參數(shù)中的 id,在 IDEA 中會(huì)有自動(dòng)提示。

這個(gè)方法上加的緩存還有問(wèn)題,當(dāng)刪除后,通過(guò) selectAll() 返回的值已經(jīng)發(fā)生了變化,但是這里沒(méi)有清除 all 的緩存值,會(huì)導(dǎo)致 selectAll() 出現(xiàn)臟數(shù)據(jù),下面會(huì)通過(guò) @Caching 注解改造這里。

4. 組合使用 @Caching

上面兩個(gè)注解中,都提到了臟數(shù)據(jù),通過(guò) @Caching 注解可以解決這個(gè)問(wèn)題。

先修改第二個(gè)注解,來(lái)解決 save 時(shí)的臟數(shù)據(jù):

@Override
@Caching(put = @CachePut(value = "databaseDef", key = "#result.id.toString()"),
     evict = @CacheEvict(value = "databaseDef", key = "'all'"))
public DatabaseDefinition save(DatabaseDefinition definition, CurrentUser userModel) 
   throws ServiceException {
 //其他代碼
 return definition;
}

前面說(shuō)明,新增或者修改的時(shí)候,all 緩存中的數(shù)據(jù)已經(jīng)不對(duì)了,因此這里在 put 的同時(shí),使用 evict 將 'all' 中的數(shù)據(jù)清除,這就保證了 selelctAll 下次調(diào)用時(shí),會(huì)重新從庫(kù)中讀取數(shù)據(jù)。

對(duì)上面的刪除方法,也進(jìn)行類似的修改:

@Override
@Caching(evict = {
  @CacheEvict(value = "databaseDef", key = "#id.toString()"),
  @CacheEvict(value = "databaseDef", key = "'all'")
})
public void deleteByPrimaryKey(Long id) throws ServiceException {
 DatabaseDefinition definition = selectByPrimaryKey(id);
 if (definition.getLoadState().equals(DatabaseDefinition.LoadState.UP)) {
  throw new ServiceException("請(qǐng)先卸載數(shù)據(jù)庫(kù)!");
 }
 databaseDefinitionDao.deleteByPrimaryKey(id);
}

注意這里的 evict 是個(gè)數(shù)組,里面配置了兩個(gè)清除緩存的配置。

5. 全局配置 @CacheConfig

在上面所有例子中,都指定了 value = "databaseDef",實(shí)際上可以通過(guò)在類上使用 @CacheConfig 注解配置當(dāng)前類中的 cacheNames 值,配置后,如果和類上的 value 一樣就不需要在每個(gè)注解單獨(dú)配置。只有不同時(shí)再去指定,方法上的 value 值優(yōu)先級(jí)更高。

@Service
@CacheConfig(cacheNames = "databaseDef")
public class DatabaseDefinitionServiceImpl implements 
     DatabaseDefinitionService, DatabaseSqlExecuteService, ApplicationListener {

有了上面配置后,其他緩存名字相同的地方可以簡(jiǎn)化,例如刪除方法修改后如下:

@Override
@Caching(evict = {
  @CacheEvict(key = "#id.toString()"),
  @CacheEvict(key = "'all'")
})
public void deleteByPrimaryKey(Long id) throws ServiceException {
 DatabaseDefinition definition = selectByPrimaryKey(id);
 if (definition.getLoadState().equals(DatabaseDefinition.LoadState.UP)) {
  throw new ServiceException("請(qǐng)先卸載數(shù)據(jù)庫(kù)!");
 }
 databaseDefinitionDao.deleteByPrimaryKey(id);
}

其他例子

除了上面針對(duì) databaseDef 的緩存外,還有 databaseMeta 的配置:

@Override
@Cacheable(value = "databaseMeta", key = "#databaseId.toString()")
public List<TableVo> selectTablesByDatabaseId(Long databaseId) 
  throws Exception {
 //代碼
}
@Override
@Cacheable(value = "databaseMeta", key = "#databaseId + '_' + #tableName")
public TableVo selectTableByDatabaseIdAndTableName(Long databaseId, String tableName) 
  throws Exception {
 //代碼
}

這兩個(gè)方法是獲取數(shù)據(jù)庫(kù)元數(shù)據(jù)的,只有修改數(shù)據(jù)庫(kù)表的時(shí)候才會(huì)變化,因此不存在清除緩存的情況,但是萬(wàn)一修改表后,想要新的元數(shù)據(jù),該怎么辦?

因此增加了一個(gè)空的方法來(lái)清空數(shù)據(jù),方法如下:

@Override
@CacheEvict(value = "databaseMeta", allEntries = true)
public void cleanTablesCache() {
}

這里指定了 databaseMeta,通過(guò) allEntries = true 清空所有 key 的緩存。通過(guò)這個(gè)方法可以保證在有需要的時(shí)候清空所有元數(shù)據(jù)的緩存。

實(shí)際上如果想要更精確的清除,可以傳入要清除的 databaseId 和 tableName 來(lái)更精確的清除。

增加緩存后的效果

調(diào)用 selectTablesByDatabaseId 多次時(shí),輸出的日志如下:

INFO  c.n.d.u.DynamicDataSource - 當(dāng)前數(shù)據(jù)源:默認(rèn)數(shù)據(jù)源
DEBUG c.n.d.DataScopeContextProviderFilter - 服務(wù)調(diào)用返回前清除數(shù)據(jù)權(quán)限信息
INFO  c.n.d.u.DynamicDataSource - 當(dāng)前數(shù)據(jù)源:默認(rèn)數(shù)據(jù)源
DEBUG c.n.d.d.D.selectByPrimaryKey - ==>  Preparing: SELECT xxx (隱藏完整 SQL)
DEBUG c.n.d.d.D.selectByPrimaryKey - ==> Parameters: 1(Long)
DEBUG c.n.d.d.D.selectByPrimaryKey - <==      Total: 1
INFO  c.n.d.u.DynamicDataSource - 當(dāng)前數(shù)據(jù)源:10.10.10.130/datareporting
DEBUG c.n.d.DataScopeContextProviderFilter - 服務(wù)調(diào)用返回前清除數(shù)據(jù)權(quán)限信息
INFO  c.n.d.u.DynamicDataSource - 當(dāng)前數(shù)據(jù)源:默認(rèn)數(shù)據(jù)源
DEBUG c.n.d.DataScopeContextProviderFilter - 服務(wù)調(diào)用返回前清除數(shù)據(jù)權(quán)限信息
INFO  c.n.d.u.DynamicDataSource - 當(dāng)前數(shù)據(jù)源:默認(rèn)數(shù)據(jù)源
DEBUG c.n.d.DataScopeContextProviderFilter - 服務(wù)調(diào)用返回前清除數(shù)據(jù)權(quán)限信息

從日志可以看出來(lái),只有第一次進(jìn)行了數(shù)據(jù)庫(kù)查詢,后續(xù)通過(guò)日志看不到數(shù)據(jù)庫(kù)操作。

調(diào)用清空緩存后,會(huì)再次查詢數(shù)據(jù)庫(kù)。

初次調(diào)用時(shí),WEB請(qǐng)求花了 700多ms,后面再次調(diào)用時(shí),平均不到 30 ms,這就是緩存最明顯的作用。

連接到 redis 服務(wù)后,查看所有 key,結(jié)果如下:

redis@redissvr:~$ redis-cli
127.0.0.1:6379> keys *
1) "databaseMeta:1"
2) "databaseDef:all"
127.0.0.1:6379>

緩存中的數(shù)據(jù)都有 value 前綴,上面緩存了 all 和 id 為 1 的數(shù)據(jù)。

緩存注解是一種最簡(jiǎn)單的緩存方式,但是需要配合 value 屬性的配置來(lái)使用,許多時(shí)候我們可能需要更精確的控制緩存,此時(shí)可以使用 RedisTemplate 來(lái)控制。

四、通過(guò) RedisTemplate 使用緩存

有關(guān)這部分的詳細(xì)用法可以從網(wǎng)上搜索相關(guān)內(nèi)容進(jìn)行學(xué)習(xí),這里列舉一個(gè)簡(jiǎn)單的例子。

針對(duì)前面的 selectAll 我們換一種方式進(jìn)行緩存。

首先注入下面的接口:

@Resource(name = "redisTemplate")
private ValueOperations<String, List> valueOper;

修改 selectAll 方法如下:

@Override
//@Cacheable(key = "'all'")
public List<DatabaseDefinitionVo> selectAll() {
 List<DatabaseDefinitionVo> vos = valueOper.get("databaseDef:all");
 if(vos != null){
  return vos;
 }
 vos = databaseDefinitionDao.selectAllVo();
 //緩存 1 小時(shí)
 valueOper.set("databaseDef:all", vos, 1, TimeUnit.HOURS);
 return vos;
}

首先通過(guò)valueOper.get("databaseDef:all") 嘗試獲取緩存信息,如果存在就直接返回。

如果不存在,就查詢數(shù)據(jù)庫(kù),然后將查詢結(jié)果通過(guò) set 進(jìn)行緩存。

特別注意: 上面的 key,寫的是 "databaseDef:all",也就是前綴需要自己加上,如果直接寫成 all,在 Redis 中的 key 就是 all,不會(huì)自動(dòng)增加前綴。

如果沒(méi)有前綴,那么當(dāng)不同系統(tǒng)都使用 all 時(shí),數(shù)據(jù)就會(huì)混亂!

五、Redis 服務(wù)器配置注意事項(xiàng)

內(nèi)網(wǎng)使用的服務(wù)器,特殊配置如下:

# By default protected mode is enabled. You should disable it only if
# you are sure you want clients from other hosts to connect to Redis
# even if no authentication is configured, nor a specific set of interfaces
# are explicitly listed using the "bind" directive.
# protected-mode yes
protected-mode no

關(guān)閉了保護(hù)模式。

# IF YOU ARE SURE YOU WANT YOUR INSTANCE TO LISTEN TO ALL THE INTERFACES
# JUST COMMENT THE FOLLOWING LINE.
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# bind 127.0.0.1

注釋了綁定的 IP,這樣可以讓所有電腦訪問(wèn) Redis。

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請(qǐng)查看下面相關(guān)鏈接

相關(guān)文章

  • 淺析Java的Hibernate框架中的緩存和延遲加載機(jī)制

    淺析Java的Hibernate框架中的緩存和延遲加載機(jī)制

    這篇文章主要介紹了Java的Hibernate框架中的緩存和延遲加載機(jī)制,Hibernate是注明的Java下SSH三大web開發(fā)框架之一,需要的朋友可以參考下
    2015-11-11
  • springboot如何使用@ConfigurationProperties封裝配置文件

    springboot如何使用@ConfigurationProperties封裝配置文件

    springboot如何使用@ConfigurationProperties封裝配置文件的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • 詳解spring boot實(shí)現(xiàn)多數(shù)據(jù)源代碼實(shí)戰(zhàn)

    詳解spring boot實(shí)現(xiàn)多數(shù)據(jù)源代碼實(shí)戰(zhàn)

    本篇文章主要介紹了詳解spring boot實(shí)現(xiàn)多數(shù)據(jù)源代碼實(shí)戰(zhàn),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-07-07
  • 在Java中按值調(diào)用和按引用調(diào)用

    在Java中按值調(diào)用和按引用調(diào)用

    這篇文章主要介紹了Java中的按值調(diào)用和按引用調(diào)用,一種是按值調(diào)用,另一種是按引用調(diào)用,這兩種方式通常根據(jù)作為輸入或參數(shù)傳遞給它們的值的類型來(lái)區(qū)分,下文相關(guān)的更多詳細(xì)資料感興趣的小伙伴可以參考一下
    2022-04-04
  • 一文帶你徹底剖析Java中Synchronized原理

    一文帶你徹底剖析Java中Synchronized原理

    Synchronized是Java中的隱式鎖,它的獲取鎖和釋放鎖都是隱式的,完全交由JVM幫助我們操作,在了解Synchronized關(guān)鍵字之前,首先要學(xué)習(xí)的知識(shí)點(diǎn)就是Java的對(duì)象結(jié)構(gòu),本文介紹的非常詳細(xì),需要的朋友可以參考下
    2023-05-05
  • Springboot?注解EqualsAndHashCode詳解

    Springboot?注解EqualsAndHashCode詳解

    注解@EqualsAndHashCode主要用于自動(dòng)生成equals方法和hashCode方法,callSuper屬性為true時(shí),生成的方法會(huì)包括父類字段,為false則只包含當(dāng)前類字段,IDEA工具中有檢查提示并可自動(dòng)修復(fù)相關(guān)代碼,確保注解正確使用,更多詳解可查閱相關(guān)文檔
    2024-10-10
  • MyBatis實(shí)現(xiàn)動(dòng)態(tài)查詢、模糊查詢功能

    MyBatis實(shí)現(xiàn)動(dòng)態(tài)查詢、模糊查詢功能

    這篇文章主要介紹了MyBatis實(shí)現(xiàn)動(dòng)態(tài)查詢、模糊查詢功能,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2018-06-06
  • Java String.replace()方法

    Java String.replace()方法"無(wú)效"的原因及解決方式

    這篇文章主要介紹了Java String.replace()方法"無(wú)效"的原因及解決方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-08-08
  • Java內(nèi)部類深入解析

    Java內(nèi)部類深入解析

    這篇文章主要介紹了Java內(nèi)部類深入解析,在java中,我們被允許在編寫一個(gè)類(外部類OuterClass)時(shí),在其內(nèi)部再嵌套一個(gè)類(嵌套類NestedClass),java將嵌套類分為兩種,非靜態(tài)內(nèi)部類(簡(jiǎn)稱內(nèi)部類)和 靜態(tài)內(nèi)部,需要的朋友可以參考下
    2023-12-12
  • Java多線程通信wait()和notify()代碼實(shí)例

    Java多線程通信wait()和notify()代碼實(shí)例

    這篇文章主要介紹了Java多線程通信wait()和notify()代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04

最新評(píng)論

武乡县| 宁蒗| 辽阳市| 锡林浩特市| 尚志市| 上思县| 邹城市| 洪江市| 登封市| 广丰县| 正定县| 阳西县| 临沂市| 宜都市| 连州市| 海丰县| 盐边县| 新竹市| 茶陵县| 乌兰浩特市| 曲水县| 阳春市| 黄骅市| 凤台县| 平遥县| 易门县| 堆龙德庆县| 仲巴县| 砚山县| 琼海市| 万盛区| 临桂县| 广平县| 儋州市| 新津县| 客服| 土默特右旗| 富蕴县| 潜江市| 千阳县| 玉门市|