历经四个月的天数,我总算撸完了Spring源代码,快碎裂了!!随即,开放源码了那个内存构架!!!

接下去,我就为我们如是说下那个构架。假如那个构架对我们有点儿协助,还请爸爸妈妈们关上Github和Gitee镜像,给那个工程项目两个小小的Star,让更多的爸爸妈妈投资收益。也能为这篇该文雅雷、在看和转贴哦~~

特别注意:该文有点儿长,提议关上IDEA依照该文操作方式具体内容实例。

mykit构架中分立出的mykit-cache模块,PCB了mykit构架下对内存cache的各式各样操作方式,普通用户只须要导入有关的Jar包,方可同时实现对内存的随心所欲操作方式。

构架结构叙述

PCB了对内存的操作方式,支持Memcached、Redis、Ehcache等分布式系统内存数据库,同时支持Spring的注解,通过Spring的注解可同时实现设置内存的失效天数和主动刷新内存。

总体结构如下表所示图右图。

自动草稿

mykit-cache-memcached

mykit-cache构架下与Memcached内存有关的模块

mykit-cache-memcached-spring

mykit-cache-memcached 下主要与 Spring 整合 Memcached 操作方式有关的模块,支持通过注解设置内存有效天数

mykit-cache-memcached-spring-simple

mykit-cache-memcached-spring下主要使用simple-spring-memcached内核同时实现注解内存的模块,支持通过注解设置内存有效天数。

兼容Memcached服务器宕机或因其他原因无法连接Memcached服务器的情况,主要方式为抛出有关异常信息后继续执行原方法。

mykit-cache-memcached-spring-simple-core

mykit-cache-memcached-spring-simple下的核心模块,提供核心配置项

mykit-cache-memcached-spring-simple-xml

mykit-cache-memcached-spring-simple下以XML方式管理Spring容器的插件类,提供Spring容器管理Memcached的核心配置,

其他工程项目或工程只需导入此插件,同时在自身的Spring配置文件中加载此模块的Memcached的核心配置方可。

mykit-cache-memcached-spring-simple-test

通用测试工程,主要测试mykit-cache-memcached-spring下主要以simple-spring-memcached为内核的内存操作方式,此插件模块主要提供主要的测试用例PCB类。

mykit-cache-memcached-spring-simple-test-xml

mykit-cache-memcached-spring下测试simple-spring-memcached为内核的内存操作方式的入口工程, 测试入口类为:io.mykit.cache.test.memcached.test.xml.MemcachedTest, 同时,须要将此工程 下的classpath:properties/memcached.properties文件中的simple.memcache.server属性配置为自身Memcached服务器的IP和端口。

mykit-cache-redis

mykit-cache构架下与Redis内存有关的模块

mykit-cache-redis-java

mykit-cache-redis 下单独以Java方式使用Redis内存的PCB。

mykit-cache-redis-spring

mykit-cache-redis 下主要与 Spring 整合 Redis操作方式有关的模块,支持通过注解设置内存有效天数和主动刷新内存

mykit-cache-redis-spring-core

mykit-cache-redis-spring 下主要提供Spring整合Redis的通用工具方法等,核心同时实现由此模块提供

mykit-cache-redis-spring-annotation

mykit-cache-redis-spring 下主要与 Spring 整合 Redis操作方式有关的模块,支持通过注解设置内存有效天数和主动刷新内存,主要以Java注解的形式同时实现Spring容器的管理操作方式,兼容Redis集群宕机或其他原因无法连接Redis集群时的情况。

假如Redis集群宕机或其他原因无法连接Redis集群时,打印有关的日志,并继续向下执行原有方法。

mykit-cache-redis-spring-xml

mykit-cache-redis-spring 下主要与 Spring 整合 Redis操作方式有关的模块,支持通过注解设置内存有效天数和主动刷新内存,主要以XML配置的形式同时实现Spring容器的管理操作方式,不兼容Redis集群宕机或其他原因无法连接Redis集群时的情况,假如Redis集群宕机或其他原因无法连接Redis集群时,抛出异常,退出执行。

mykit-cache-redis-spring-test

mykit-cache-redis-spring 下测试Spring整合Redis的核心测试用例类,提供主要的测试PCB;

mykit-cache-redis-spring-test-annotation

mykit-cache-redis-spring 下测试以Java注解形式管理Spring容器的测试入口, 对mykit-cache-redis-spring-annotation提供单元测试用例。

测试入口为:io.mykit.cache.test.redis.spring.annotation.test.TestRedisConfig,执行测试方法前须要先依照自身的Redis集群情况配置classpath:properties/redis.properties文件,将redis.properties中的Redis集群的节点IP和端口修改为自身的Redis集群节点的IP和端口

mykit-cache-redis-spring-test-xml

mykit-cache-redis-spring 下测试以XML配置形式管理Spring容器的测试入口,mykit-cache-redis-spring-xml的测试模块,对mykit-cache-redis-spring-xml提供单元测试用例。

测试的入口为io.mykit.cache.test.redis.spring.test.xml.RedisTest, 执行测试方法前须要先依照自身的Redis集群情况配置classpath:properties/redis.properties文件,将redis.properties中的Redis集群的节点IP和端口修改为自身的Redis集群节点的IP和端口

mykit-cache-ehcache

mykit-cache构架下与ehcache内存有关的模块

mykit-cache-ehcache-spring

mykit-cache-ehcache 下主要与 Spring 整合Ehcache操作方式有关的模块,支持通过注解设置内存有效天数

使用场景如下表所示右图。

自动草稿

1.须要使用Java直接操作方式Redis

1)在Maven的pom.xml文件中加入如下表所示配置:

io.mykit.cachemykit-cache-redis-java1.0.0-SNAPSHOT2)在工程项目的resources目录下创建Redis的配置文件redis.properties文件

假如是Redis单机模式,则redis.properties文件的内容如下表所示右图。

redis.host=10.2.2.231redis.port=6379redis.max_idle=200redis.max_wait=10000redis.max_total=1024redis.timeout=3000redis.test_on_borrow=true假如是Redis集群模式,则redis.properties文件的内容如下表所示右图。

Redis集群模式redis.cluster.password=redis.cluster.max.total=100redis.cluster.max.idle=20redis.cluster.min.idle=10redis.cluster.timeout=2000redis.cluster.maxAttempts=100redis.cluster.redisDefaultExpiration=3600redis.cluster.usePrefix=trueredis.cluster.blockWhenExhausted=trueredis.cluster.maxWaitMillis=3000redis.cluster.testOnBorrow=falseredis.cluster.testOnReturn=falseredis.cluster.testWhileIdle=trueredis.cluster.minEvictableIdleTimeMillis=60000redis.cluster.timeBetweenEvictionRunsMillis=30000redis.cluster.numTestsPerEvictionRun=-1redis.cluster.defaultExpirationKey=defaultExpirationKeyredis.cluster.expirationSecondTime=300redis.cluster.preloadSecondTime=280virsual envredis.cluster.node.one=192.168.175.151redis.cluster.node.one.port=7001redis.cluster.node.two=192.168.175.151redis.cluster.node.two.port=7002redis.cluster.node.three=192.168.175.151redis.cluster.node.three.port=7003redis.cluster.node.four=192.168.175.151redis.cluster.node.four.port=7004redis.cluster.node.five=192.168.175.151redis.cluster.node.five.port=7005redis.cluster.node.six=192.168.175.151redis.cluster.node.six.port=7006redis.cluster.node.seven=192.168.175.151redis.cluster.node.seven.port=7006特别注意:

配置redis.properties文件时,能修改Redis的IP和端口号,但是文件中的Key必须与上述实例给出的Key相同,否则Redis客户端无法连接到Redis服务器。

3)在Java程序中使用Redis内存

假如配置的是单机模式,则使用如下表所示方式使用Redis内存

Jedis jedis = RedisBuilder.getInstance();jedis.set(“name”, “binghe”);String value = jedis.get(“name”);System.out.println(value);假如配置的是集群环境,则使用如下表所示方式使用Redis内存

JedisCluster jedisCluster = RedisClusterBuilder.getInstance();jedisCluster.set(“name”, “binghe”);String value = jedisCluster.get(“name”);System.out.println(value);2.须要使用Spring Redis集群配置内存

1)须要兼容Redis集群宕机或其他原因无法连接Redis集群时的情况:

在Maven的pom.xml中加入如下表所示配置方可:

io.mykit.cachemykit-cache-redis-spring-annotation1.0.0-SNAPSHOT此时,还须要依照具体内容情况在自身工程项目的合适模块中创建Redis的配置类,主要的功能为提供以Java注解的形式配置Spring和Redis集群整合的Spring容器管理。

实例程序为:mykit-cache-redis-spring-test-annotation测试模块中的io.mykit.cache.test.redis.spring.annotation.config.AnnotationConfig类。

package io.mykit.cache.test.redis.spring.annotation.config;import io.mykit.cache.redis.spring.annotation.config.CacheRedisConfig;import org.springframework.cache.annotation.EnableCaching;import org.springframework.context.annotation.ComponentScan;import org.springframework.context.annotation.Configuration;import org.springframework.context.annotation.EnableAspectJAutoProxy;import org.springframework.context.annotation.PropertySource;/*** @author binghe* @version 1.0.0* @description 提供以Java注解的形式配置Spring和Redis集群整合的Spring容器管理*/@Configuration@EnableCaching@EnableAspectJAutoProxy(proxyTargetClass = true)@ComponentScan(value = {“io.mykit.cache”})@PropertySource(value = {“classpath:properties/redis-default.properties”, “classpath:properties/redis.properties”})public class AnnotationConfig extends CacheRedisConfig {}2)不须要兼容Redis集群宕机或其他原因无法连接Redis集群时的情况:

在Maven的pom.xml中加入如下表所示配置方可:

io.mykit.cachemykit-cache-redis-spring-xml1.0.0-SNAPSHOT此时还须要依照具体内容情况在自身工程项目的spring配置文件中,进行有关的配置,主要的配置项有:开启Spring注解扫描及代理,扫描的基本类中加入io.mykit.cache包,并按照顺序加载

classpath*:properties/redis-default.properties, classpath*:properties/redis.properties文件,具体内容实例为:mykit-cache-redis-spring-test-xml下的classpath:spring/spring-context.xml配置文件:

特别注意:

(1)无论需不须要兼容Redis集群宕机或其他原因无法连接Redis集群时的情况,都须要在自身工程项目的classpath目录下创建redis.properties文件,配置自身Redis集群节点的IP和端口。

目前,mykit-cache-redis-spring-annotation和mykit-cache-redis-spring-xml最多支持7台Redis集群,可依照自身实际情况扩展;

假如自身的Redis集群不足7台,可在redis.properties文件中配置重复的Redis集群节点的IP和端口;

(2)在自身工程项目的classpath目录下创建redis.properties文件,此文件名不是强制要求的,可使用其他的文件名代替,但是此文件名必须和spring配置文件中加载的redis配置文件名以及以Java注解形式管理Spring容器的配置类中加载的redis配置文件名保持一致;

(3)自定义的Redis集群配置文件中的集群节点IP和端口的配置项名称必须和实例classpath:properties/redis.properties配置文件中的集群节点IP和端口的配置项名称相同;

(4)配置实例:

比如,在我自己工程项目中的classpath:properties下redis集群的配置文件为redis.properties,具体内容内容如下表所示:

redis cluster configredis.cluster.defaultExpirationKey=defaultExpirationKeyredis.cluster.expirationSecondTime=300000redis.cluster.preloadSecondTime=280000node inforedis.cluster.node.one=10.2.2.231redis.cluster.node.one.port=7001redis.cluster.node.two=10.2.2.231redis.cluster.node.two.port=7002redis.cluster.node.three=10.2.2.231redis.cluster.node.three.port=7003redis.cluster.node.four=10.2.2.231redis.cluster.node.four.port=7004redis.cluster.node.five=10.2.2.231redis.cluster.node.five.port=7005redis.cluster.node.six=10.2.2.231redis.cluster.node.six.port=7006redis.cluster.node.seven=10.2.2.231redis.cluster.node.seven.port=7006则在我工程项目的spring配置文件中须要加载的配置文件为:

或者在我工程项目的配置类中须要加载的配置文件注解为:

@PropertySource(value = {“classpath:properties/redis-default.properties”, “classpath:properties/redis.properties”})也就是说:classpath:properties/redis-default.properties文件要写到自定义的配置文件的前面,构架会先加载classpath:properties/redis-default.properties。

然后加载自定义的配置文件,假如自定义的配置文件中存在与classpath:properties/redis-default.properties文件相同的属性配置,则构架会用自定义的配置属性覆盖classpath:properties/redis-default.properties中相同的属性

(5)具体内容使用

1)在有关的查询方法上加上无key属性的@Cacheable注解:

@Cacheable(value={“test102”})没有配置@Cacheable的key属性,此时的@Cacheable的key属性值按照一定策略自定生成,即以当前类名(完整包名 类名) 方法名 方法类型列表 方法参数列表的HashCode为当前@Cacheable的key属性。具体内容的key生成策略类为mykit-cache-redis-spring-core中的io.mykit.cache.redis.spring.cache.CacheKeyGenerator类;

2)在有关的查询方法上加上有key属性的@Cacheable注解

@Cacheable(value={“test102″} key=”key” “.defaultValue”)配置了@Cacheable的key属性,此时@Cacheable的key属性值为key拼接参数defaultValue的值的结果的HashCode值。

特别注意:

(1)@Cacheable注解中没有key属性,构架会为@Cacheable生成Key属性,也就是说key属性不是必须的;

(2)@Cacheable注解没有配置key属性,则以当前类名(完整包名 类名) 方法名 方法类型列表 方法参数列表的HashCode为当前@Cacheable的key属性;

(3)@Cacheable注解配置了key属性,则以当前key的HashCode作为当前@Cacheable的key属性;

(4)@Cacheable的value属性中我们配置的值为 test102,此时表示@Cacheable的内存名称为test,其中10表示内存有效时长(单位为秒),2表示距离内存失效的剩余时长(单位为秒),

即@Cacheable的value属性配置格式为:内存名称expireTimereloadTime,构架规定必须以作为分隔符

expireTime:表示内存的有效时长,单位秒;reloadTime:表示距离内存失效的剩余时长,单位秒;expireTime 须要大于 reloadTime,否则无意义(5)@Cacheable的value属性说明

以内存名称expireTimereloadTime格式配置@Cacheable的value属性后,构架会将查询结果放到内存中,有效时长为expireTime秒,距离内存失效的剩余时长为reloadTime秒;当在将数据存入内存时,历经了0秒——(expireTime-reloadTime)秒天数范围时,再次调用方法,则直接从内存中获取数据;当在将数据存入内存时,历经了reloadTime秒——expireTime秒天数范围时,再次调用方法,构架会通过代理和反射的方式主动调用原方法从真正的数据源获取数据后刷新内存;当在将数据存入内存时,历经了超过expireTime秒的天数,则内存失效,再次调用方法,则执行原方法查询数据,构架会自动将查询结果存入内存;当构架通过代理和反射的方式主动调用原方法从真正的数据源获取数据后刷新内存时,为防止请求的多个线程同时执行刷新内存的操作方式,构架提供了分布式系统锁来保证只有两个线程执行刷新内存操作方式;构架主动调用原方法从真正的数据源获取数据后刷新内存的操作方式与用户的请求操作方式是异步的,不会影响用户请求的性能;构架主动调用原方法从真正的数据源获取数据后刷新内存的操作方式对用户请求透明,即用户感知不到构架主动刷新内存的操作方式;其他:

1)当 @Cacheable 的Value只配置了内存名称,比如配置为@Cacheable(value=”test”)

此时的expireTime默认为redis配置文件的redis.cluster.expirationSecondTime属性值,单位为秒;reloadTime默认为redis配置文件的redis.cluster.preloadSecondTime属性值,单位为秒;

属性值的加载顺序为:优先加载自定义的redis配置文件的redis.cluster.expirationSecondTime属性值和redis.cluster.preloadSecondTime属性值,假如自定义的redis配置文件无有关的属性值;则从构架默认的redis配置文件redis-default.properties文件中加载;

2)当 @Cacheable 的Value配置内存名称和失效时长,比如配置为@Cacheable(value=”test10″)

此时的reloadTime默认为redis配置文件的redis.cluster.preloadSecondTime属性值,单位为秒;

属性值的加载顺序为:优先加载自定义的redis配置文件的redis.cluster.preloadSecondTime属性值,假如自定义的redis配置文件无有关的属性值;则从构架默认的redis配置文件redis-default.properties文件中加载;

3)当 @Cacheable 的Value配置内存名称、失效时长和距离内存失效的剩余时长,比如配置为:@Cacheable(value=”test102″)

此时不会加载默认的expireTime和reloadTime,构架会直接使用@Cacheable注解中value属性配置的expireTime和reloadTime;

4)无论@Cacheable的Value属性是否配置了内存时长信息,则都不会出现只配置reloadTime,没有配置expireTime的情况,构架规定的value属性格式为:内存名称expireTimereloadTime

即只会出现的格式为:

内存名称内存名称expireTime内存名称expireTimereloadTime不会存在单独出现reloadTime的情况,会出现配置了内存名称expireTime,reloadTime使用配置文件默认的时长配置的情况;

特别注意事项

1.mykit-cache-redis-spring-xml引用和mykit-cache-redis-spring-annotation引用是互斥的,即在两个工程中mykit-cache-redis-spring-xml和mykit-cache-redis-spring-annotation只能同时引用两个;

2.mykit-cache-redis-spring-xml和mykit-cache-redis-spring-annotation的功能是一样的,但是mykit-cache-redis-spring-annotation工程兼容Redis集群宕机或其他原因无法连接Redis集群时的情况;

3.假如Redis集群宕机或其他原因无法连接Redis集群时,则mykit-cache-redis-spring-xml会抛出异常,退出执行;而mykit-cache-redis-spring-annotation则会打印有关的异常信息,继续向下执行原来的方法。4.假如你的工程项目中以XML配置的方式,配置了Spring容器和SpringMVC,而你想以兼容Redis集群宕机或其他原因连接不上Redis集群的方式配置内存,能历经如下表所示配置:

1)在工程项目中添加如下表所示配置类:

SpringContextConfig:配置Spring容器:

package io.mykit.cache.redis.spring.utils.config;import org.springframework.cache.annotation.EnableCaching;import org.springframework.context.annotation.ComponentScan;import org.springframework.context.annotation.Configuration;import org.springframework.context.annotation.EnableAspectJAutoProxy;import org.springframework.context.annotation.ImportResource;import org.springframework.context.annotation.PropertySource;import io.mykit.cache.redis.spring.annotation.config.CacheRedisConfig;/*** @ClassName SpringContextConfig* @Description Spring Java配置* @author binghe*/@Configuration@EnableCaching@EnableAspectJAutoProxy(proxyTargetClass = true)@ComponentScan(value = {“io.mykit.cache”})@PropertySource(value = {“classpath:properties/redis-default.properties”, “classpath:properties/redis.properties”})@ImportResource(“classpath:spring/applicationContext.xml”)publicclassSpringContextConfigextendsCacheRedisConfig{}SpringMVCConfig:配置SpringMVC:

package io.mykit.cache.redis.spring.utils.config;import org.springframework.context.annotation.Configuration;import org.springframework.context.annotation.ImportResource;/*** @ClassName SpringMVCConfig* @Description SpringMVC Java配置* @author binghe*/@Configuration@ImportResource(“classpath:spring/SpringMVC-servlet.xml”)publicclassSpringMVCConfig{}2)web工程项目的web.xml修改如下表所示:

org.springframework.web.context.ContextLoaderListenercontextClassorg.springframework.web.context.support.AnnotationConfigWebApplicationContextcontextConfigLocationio.mykit.cache.redis.spring.utils.config.SpringContextConfigorg.springframework.web.util.IntrospectorCleanupListenerSpringMVCorg.springframework.web.servlet.DispatcherServletcontextClassorg.springframework.web.context.support.AnnotationConfigWebApplicationContextcontextConfigLocationio.mykit.cache.redis.spring.utils.config.SpringMVCConfig1SpringMVC/3.须要使用Spring Memcached集群配置内存

1、须要在工程的pom.xml中引用

io.mykit.cachemykit-cache-memcached-spring-simple-xml1.0.0-SNAPSHOT特别注意:构架的此模块不支持主动刷新内存,底层核心使用的是simple-spring-memcached内核。

2、使用方法

1)在自身工程项目的classpath:properties目录下新建Memcached的配置文件,比如:memcached.properties文件,配置连接Memcached的属性;

属性配置如下表所示:

simple memcached configsimple.memcache.server=127.0.0.1:12000simple.memcache.consistenthashing=truesimple.memcache.connectionpoolsize=1simple.memcache.optimizeget=falsesimple.memcache.optimizemergebuffer=falsesimple.memcache.mergefactor=50simple.memcache.usebinaryprotocol=truesimple.memcache.connectiontimeout=3000simple.memcache.operationtimeout=2000simple.memcache.enableheartbeat=truesimple.memcache.failureMode=false特别注意:自定义的memcached文件的属性,必须和memcached-default.properties默认配置的属性key相同,也就是和上述配置的key相同,但能不用覆盖上述完整的配置,

能只配置:

simple.memcache.server=192.168.209.121:12000来覆盖simple.memcache.server属性

2)在自身工程项目的classpath目录下新建spring配置文件,比如:spring-context.xml,配置内容如下表所示:

依照上述配置加载properties文件顺序,构架会用自定义的memcached.properties文件属性覆盖memcached-default.properties文件的属性。

假如memcached-default.properties文件中存在memcached.properties中不存在的属性,构架会用memcached-default.properties中默认的属性。

至此,就能使用simple-spring-memcached提供的注解来配置使用内存了。

3、simple-spring-memcached如是说

3-1、基本如是说

simple-spring-memcached本质上是采用了AOP的方式来同时实现内存的调用和管理,其核心模块声明了一些Advice,当遇到相应的切入点时,会执行这些Advice来对memcached加以管理。

切入点是通过标签的方式来进行声明的,在工程项目开发时,通常在DAO的方法上加以相应的标签叙述,来表示模块对该方法的拦截 模块所提供的切入点主要包括以下几种:

ReadThroughSingleCache、ReadThroughMultiCache、ReadThroughAssignCache

1)当遇到查询方法声明这些切入点时,模块首先会从内存中读取数据,取到数据则跳过查询方法,直接返回。 取不到数据在执行查询方法,并将查询结果放入内存,以便下一次获取。InvalidateSingleCache、InvalidateMultiCache、InvalidateAssignCache

2)当遇到删除方法声明这些切入点时,模块会删除内存中的对应实体,以便下次从内存中读取出的数据状态是最新的 UpdateSingleCache、UpdateMultiCache、UpdateAssignCache

3-2、注解说明

各Annotation的详细说明

ReadThroughSingleCache作用:读取Cache中数据,假如不存在,则将读取的数据存入Cachekey生成规则:ParameterValueKeyProvider指定的参数,假如该参数对象中包含CacheKeyMethod注解的方法,则调用其方法,否则调用toString方法

@ReadThroughSingleCache(namespace = “Alpha”, expiration = 30)public String getDateString(@ParameterValueKeyProvider final String key){final Date now = new Date();try {Thread.sleep(1500);} catch (InterruptedException ex) {}return now.toString() “:” now.getTime();}InvalidateSingleCache作用:失效Cache中的数据

key生成规则:

1)使用 ParameterValueKeyProvider注解时,与ReadThroughSingleCache一致

2)使用 ReturnValueKeyProvider 注解时,key为返回的对象的CacheKeyMethod或toString方法生成

@InvalidateSingleCache(namespace = “Charlie”)publicvoidupdateRandomString(@ParameterValueKeyProvider final Long key){// Nothing really to do here.}@InvalidateSingleCache(namespace = “Charlie”)@ReturnValueKeyProviderpublic Long updateRandomStringAgain(final Long key){return key;}UpdateSingleCache作用:更新Cache中的数据

key生成规则:ParameterValueKeyProvider指定

1)ParameterDataUpdateContent:方法参数中的数据,作为更新内存的数据

2)ReturnDataUpdateContent:方法调用后生成的数据,作为更新内存的数据

注:上述两个注解,必须与Update*系列的注解一起使用

@UpdateSingleCache(namespace = “Alpha”, expiration = 30)publicvoidoverrideDateString(finalint trash, @ParameterValueKeyProvider final String key,@ParameterDataUpdateContent final String overrideData){}@UpdateSingleCache(namespace = “Bravo”, expiration = 300)@ReturnDataUpdateContentpublic String updateTimestampValue(@ParameterValueKeyProvider final Long key){try {Thread.sleep(100);} catch (InterruptedException ex) {}final Long now = new Date().getTime();final String result = now.toString() “-U-” key.toString();return result;}ReadThroughAssignCache作用:读取Cache中数据,假如不存在,则将读取的数据存入Cache

key生成规则:ReadThroughAssignCache 注解中的 assignedKey 字段指定

@ReadThroughAssignCache(assignedKey = “SomePhatKey”, namespace = “Echo”, expiration = 3000)public List getAssignStrings(){try {Thread.sleep(500);} catch (InterruptedException ex) {}final List results = new ArrayList();finallong extra = System.currentTimeMillis() % 20;final String base = System.currentTimeMillis() “”;for (int ix = 0; ix

1.本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2.分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3.不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4.本站提供的源码、模板、插件等其他资源,都不包含技术服务请大家谅解!
5.如有链接无法下载或失效,请联系管理员处理!
6.本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!