2019-12-03 14:48:12
浏览数 (1)
设置一个考试,给考试上锁 reditsUtil缓存工具类 代码语言: javascript
复制 package com.rc.common.redis.utils;
import java.time.Duration;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.util.CollectionUtils;
import com.rc.common.mapper.JsonMapper;
import com.rc.common.utils.SpringContextHolder;
import com.rc.common.utils.StringUtils;
public class RedisUtil {
public static RedisTemplate<String, Object> redisTemplate;
public static RedisTemplate<String, Object> getTmp() {
if (redisTemplate == null) {
redisTemplate = SpringContextHolder.getBean("redisSOTemplate");
}
return redisTemplate;
}
// =============================common============================
/**
* redis分布式锁
* @param key
* @param time 秒
* @return
*/
public static boolean setIfAbsent(String key, long time) {
return getTmp().opsForValue().setIfAbsent(key, 1, Duration.ofSeconds(time));
}
/**
*
* 指定缓存失效时间
*
* @param key 键
*
* @param time 时间(秒)
*
* @return
*
*/
public static boolean expire(String key, long time) {
try {
if (time > 0) {
getTmp().expire(key, time, TimeUnit.SECONDS);
}
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
*
* 删除缓存
*
* @param key 可以传一个值 或多个
*
*/
@SuppressWarnings("unchecked")
public static void del(String... key) {
if (key != null && key.length > 0) {
if (key.length == 1) {
getTmp().delete(key[0]);
} else {
getTmp().delete(CollectionUtils.arrayToList(key));
}
}
}
public static void delAll(String key) {
if (key != null) {
Set<String> kes = getTmp().keys(key);
getTmp().delete(kes);
}
}
}
考试校验 代码语言: javascript
复制 //考试校验
public boolean kscheck(String paperId){
String id = RedisUtil.getString(paperId);
if (StringUtils.isBlank(id)) {
ExamPaper paper = MongoUtils.checkGet(paperId, ExamPaper.class, "试卷");
//判断是否开始考试或者结束考试
//没开始提示
//结束提示试卷作答结束
//在考试的时间段
try {
//加锁,设置失效时间为30秒
if (RedisUtil.setIfAbsent(paperId "ExamPaper", 30)) {
//设置失效时间,指定缓存失效时间
// DateUtils.pastMinutesByTime(paper.getEndTime()这个方法就是取考试结束时间-当前时间所得到的秒数
RedisUtil.expire(paperId, DateUtils.pastMinutesByTime(paper.getEndTime()));
return true;
}
} catch (Exception e) {
Ast.astFalse("请刷新页面");
} finally {
//无论怎么都删除锁
RedisUtil.del(paperId "ExamPaper");
}
} else {
return true;
}
return false;
}
得到考试结束时间-当前时间所得到的秒数的方法,我把它写在 DateUtils工具类里了 代码语言: javascript
复制 /**
* 判断某一时间离当前时间的秒数
*/
public static long pastMinutesByTime(String date) {
long t = parseDate(date).getTime() - new Date().getTime();
return t / 1000;
}