- redis批量数据操作
一个service中的方法里,forEach循环中,对每条记录调用redis加锁操作(中间注释的),数据量多时每次执行总耗时比一次pipe执行高几十倍或上百倍,修改为使用pipelined一次提交redis执行。【需要注意下过期seconds分散设置未体现,避免大数量同时过期】
Map<String,String> lockMap = new HashMap<String,String>();
transportList.forEach(data -> {
/**
* 注释掉循环中每次操作,改为循环外面批量操作,增加lockMap集合。
*/
// boolean b = redisLockHelper.tryLock(TRANSPORT_LOCK_KEY_PREFIX + data.getTaskNo(), 180L);
// if (!b) {
// throw BusinessException.fail("*******单加锁失败!" + data.getTaskNo());
// }
lockMap.put(TRANSPORT_LOCK_KEY_PREFIX + data.getTaskNo(), System.currentTimeMillis() + "");
});
/**
* 修改redis批量操作。
*/
boolean result = redisLockHelper.tryLockWithPipelined(lockMap, 180L);
RedisLockHelper类方法
public boolean tryLock(String key, Long second) {
if (StringUtils.isBlank(key)) {
throw BusinessException.fail("获取内容时 key 不能为空");
}
boolean ret = false;
try {
String value = System.currentTimeMillis() + "";
Boolean result = stri