Springbootはredisを統合し、プロジェクトの起動時にredisキャッシュをロードします.
プロジェクトには辞書表、メカニズム表、ユーザー表があるため、これらの一般的な状況では、データが変更される確率は比較的小さく、クエリー、トランスコード、クエリーデータベースの頻度が高いため、プロジェクトの開始時にこれらのデータ表を保存にロードして使用します.
redisは高度なkey:valueストレージシステムで、valueは5つのデータ型をサポートしています.
1.文字列(strings)
2.文字列リスト(lists)
3.文字列セット(sets)
4.秩序文字列セット(sorted sets)
5.ハッシュ(hashes)
1.redis jarパッケージの構成
2.ymlファイルの構成
redis:database:2 host:IPアドレスport:6379 password:1
3.キャッシュステップの初期化
redisに格納されるデータ量が大きい場合は、データ量が小さい場合はスレッドプール方式を採用することができます.いいえ
4.辞書表キャッシュのロード
サービスインプリメンテーションクラス
スレッドプール方式のキャッシュのロード:
実装クラスは、前に書いたスレッドプールに注入する構成クラスが必要です.
@Autowired private TaskExecutor taskExecutor;
5 .RedisUtilクラス
redisは高度なkey:valueストレージシステムで、valueは5つのデータ型をサポートしています.
1.文字列(strings)
2.文字列リスト(lists)
3.文字列セット(sets)
4.秩序文字列セット(sorted sets)
5.ハッシュ(hashes)
1.redis jarパッケージの構成
org.springframework.boot
spring-boot-starter-data-redis
2.ymlファイルの構成
redis:database:2 host:IPアドレスport:6379 password:1
3.キャッシュステップの初期化
redisに格納されるデータ量が大きい場合は、データ量が小さい場合はスレッドプール方式を採用することができます.いいえ
@Configuration
@EnableAsync
public class AsyncConfig {
@Bean
public TaskExecutor taskExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
//
executor.setCorePoolSize(10);
//
executor.setMaxPoolSize(20);
//
executor.setQueueCapacity(40);
// ( )
executor.setKeepAliveSeconds(60);
//
executor.setThreadNamePrefix("async-");
//
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
//
executor.setWaitForTasksToCompleteOnShutdown(true);
return executor;
}
}
/**
*
*
* @author
*/
@Component
public class InitCache implements ApplicationRunner {
@Autowired
private ICacheService cache;
@Override
@Async
public void run(ApplicationArguments arg) throws Exception {
//
cache.initDictCache();
//
cache.initExpressionCache();
}
}
4.辞書表キャッシュのロード
サービスインプリメンテーションクラス
@Override
public void initDictCache() {
List systemDictList = systemDictMapper.querySystemDictTable();
if (CollectionUtils.isNotEmpty(systemDictList)) {
for (SystemDictTableEntity systemDictTableEntity : systemDictList) {
if (null != systemDictTableEntity) {
if (StringUtils.isNotBlank(systemDictTableEntity.getDictValue())
&& StringUtils.isNotBlank(systemDictTableEntity.getDictKey())) {
RedisUtils.set(RedisKeyPrefix.REDIS_SYSTEM_DICT_KEY + systemDictTableEntity.getDictKey(),
systemDictTableEntity.getDictValue());
}
}
}
}
}
スレッドプール方式のキャッシュのロード:
実装クラスは、前に書いたスレッドプールに注入する構成クラスが必要です.
@Autowired private TaskExecutor taskExecutor;
@Override
public void initExpressionCache() {
long start = System.currentTimeMillis();
log.info("Start Loading Expression into redis cache...");
//
List expressionCacheDtoList = mapper.getExpression();
//
if (CollectionUtils.isEmpty(expressionCacheDtoList)) {
log.info("There Is Nothing Need To Cache!");
return;
}
//
int pageCount = expressionCacheDtoList.size();
//
int pageSize = 300;
//
int threadCount = pageCount % pageSize == ConstantNumber.ZERO ? pageCount / pageSize
: pageCount / pageSize + ConstantNumber.ONE;
// threadCount
for (int pageNumber = 1; pageNumber <= threadCount; pageNumber++) {
//
final int executeNumber = pageSize * pageNumber;
taskExecutor.execute(() -> executeCache(expressionCacheDtoList, pageCount, pageSize, executeNumber));
}
//
double cost = (System.currentTimeMillis() - start) / 1000.000;
log.info("Started Loading Expression Cache in {}", cost + " seconds");
}
/**
* REDIS
*
* @param expressionCacheDtoList
* @param pageCount
* @param pageSize
* @param executeNumber
*/
private void executeCache(List expressionCacheDtoList, int pageCount, int pageSize,
int executeNumber) {
//
executeNumber = executeNumber < pageCount ? executeNumber : pageCount;
//
String expression;
Integer columnId;
Integer expressionTypeId;
StringBuilder sb = new StringBuilder();
//
// Thread-1 0( )~300( ),Thread-2 300~600( )
for (int j = executeNumber - pageSize; j < executeNumber; j++) {
ExpressionCacheDto expressionCacheDto = expressionCacheDtoList.get(j);
if (expressionCacheDto != null) {
// StringBuilder
sb.delete(ConstantNumber.ZERO, sb.length());
// Value
expression = expressionCacheDto.getExpression();
columnId = expressionCacheDto.getColumnId();
expressionTypeId = expressionCacheDto.getExpressionTypeId();
// RedisKey
sb.append(RedisKeyPrefix.REDIS_EXPRESSION_KEY).append(columnId).append(UNDERLINE)
.append(expressionTypeId);
//
RedisUtils.set(sb.toString(), expression);
} else {
log.info("cache value is null...");
}
}
}
5 .RedisUtilクラス
package cn.com.citydo.web.util;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.support.atomic.RedisAtomicLong;
import org.springframework.stereotype.Component;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.serializer.SerializerFeature;
import lombok.extern.slf4j.Slf4j;
/**
*
* Redis
*
* @author yss
*
*/
@Component
@Slf4j
public class RedisUtils {
private static RedisTemplate redisTemplate;
@Autowired
public void setRedisTemplate(RedisTemplate redisTemplate) {
if (null == redisTemplate) {
log.info("Redis , ");
} else {
log.info("Redis !");
}
RedisUtils.redisTemplate = redisTemplate;
}
/**
*
*
* @param key
*
* @param time
* ( )
* @return
*/
public static boolean expire(String key, long time) {
try {
if (time > 0) {
redisTemplate.expire(key, time, TimeUnit.SECONDS);
}
return true;
} catch (Exception e) {
log.error("expire() is error : {}", e);
return false;
}
}
/**
* key
*
* @param key
* null
* @return ( ) 0
*/
public static long getExpire(String key) {
return redisTemplate.getExpire(key, TimeUnit.SECONDS);
}
/**
* key
*
* @param key
*
* @return true false
*/
public static boolean hasKey(String key) {
try {
return redisTemplate.hasKey(key);
} catch (Exception e) {
log.error("hasKey() is error : {}", e);
return false;
}
}
/**
*
*
* @param key
*
* @return
*/
public static Object get(String key) {
return key == null ? null : redisTemplate.opsForValue().get(key);
}
/**
*
*
* @param key
*
* @param value
*
* @return true false
*/
public static boolean set(String key, Object value) {
try {
redisTemplate.opsForValue().set(key, value);
return true;
} catch (Exception e) {
log.error("set() is error : {}", e);
return false;
}
}
/**
*
*
* @param key
*
* @param value
*
* @param time
* ( ) time 0 time 0
* @return true false
*/
public static boolean set(String key, Object value, long time) {
try {
if (time > 0) {
redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS);
} else {
set(key, value);
}
return true;
} catch (Exception e) {
log.error("set() is error : {}", e);
return false;
}
}
/**
* HashGet
*
* @param key
* null
* @param item
* null
* @return
*/
public static Object hget(String key, String item) {
return redisTemplate.opsForHash().get(key, item);
}
/**
* hashKey
*
* @param key
*
* @return
*/
public static Map