Преглед изворни кода

redis工具类、验证码接口

liyuan пре 3 месеци
родитељ
комит
09ed0e6f72

+ 2 - 1
blade-auth/src/main/java/org/springblade/auth/granter/PhoneTokenGranter.java

@@ -50,11 +50,12 @@ public class PhoneTokenGranter extends AbstractTokenGranter {
 	protected OAuth2Authentication getOAuth2Authentication(ClientDetails client, TokenRequest tokenRequest) {
 		HttpServletRequest request = WebUtil.getRequest();
 		// 获取前端传输的验证码
+		// key 是uuid 由前端生成
 		String key = request.getHeader(TokenUtil.CAPTCHA_HEADER_KEY);
 		String code = request.getHeader(TokenUtil.CAPTCHA_HEADER_CODE);
 		String phone = request.getHeader(TokenUtil.PHONE_HEADER_KEY);
 		// 获取缓存中的验证码
-		String redisCode = bladeRedis.get(CacheNames.CAPTCHA_KEY + key);
+		String redisCode = bladeRedis.get(CacheNames.APP_LOGIN_CODE_KEY + key);
 		// String redisCode = "wnxax";
 		// 判断验证码
 		if (code == null || !StringUtil.equalsIgnoreCase(redisCode, code)) {

+ 26 - 5
blade-auth/src/main/java/org/springblade/auth/verification/verificationController.java

@@ -3,14 +3,23 @@ package org.springblade.auth.verification;
 import com.alibaba.druid.util.StringUtils;
 import io.swagger.annotations.Api;
 import lombok.AllArgsConstructor;
+import me.zhyd.oauth.utils.IpUtils;
+import org.apache.commons.lang.math.RandomUtils;
 import org.springblade.auth.utils.ImgVerifyCode;
-import org.springframework.data.redis.core.RedisTemplate;
+import org.springblade.common.cache.CacheNames;
+import org.springblade.common.enums.NumberEnum;
+import org.springblade.common.utils.RedisUtils;
+import org.springblade.common.utils.VerificationCodeUtil;
+import org.springblade.core.secure.utils.AuthUtil;
+import org.springblade.core.tool.api.R;
 import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import java.awt.image.BufferedImage;
 import java.io.IOException;
+import java.util.Objects;
+import java.util.Random;
 
 
 @RestController
@@ -19,7 +28,7 @@ import java.io.IOException;
 @Api(value = "验证码", tags = "验证码相关接口")
 public class verificationController {
 
-	private final RedisTemplate<String, Object> redisTemplate;
+	private final RedisUtils redisUtils;
 
 
 	@GetMapping("/getVerificationCodeAction")
@@ -48,10 +57,22 @@ public class verificationController {
 	@ResponseBody
 	public boolean checkVerify(HttpServletRequest request, HttpServletResponse response, @RequestParam String validationCode) {
 		String rightValidationCode = (String) request.getSession().getAttribute("validationCode");
-		if (StringUtils.isEmpty(rightValidationCode) || !rightValidationCode.toLowerCase().equals(validationCode.toLowerCase())) {
-			return false;
+		return !StringUtils.isEmpty(rightValidationCode) && rightValidationCode.equalsIgnoreCase(validationCode);
+	}
+
+
+	@GetMapping("getPhoneVerifyCode")
+	public R<String> getPhoneVerifyCode(@RequestParam("phone") String phone, HttpServletRequest request) {
+		String uuid = request.getHeader("uuid");
+		String redisKey = uuid + "-" + phone;
+		Object redisCode = redisUtils.get(CacheNames.APP_LOGIN_CODE_KEY + redisKey);
+		if (Objects.nonNull(redisCode)) {
+			return R.fail("验证码已发送,请勿重复发送");
 		}
-		return true;
+		String code = VerificationCodeUtil.getVerificationCode(NumberEnum.SIX.number);
+		// TODO: 需要短信发送
+		redisUtils.set(phone, code, NumberEnum.THREE_HUNDRED.number);
+		return R.success(code);
 	}
 
 }

+ 5 - 0
blade-common/src/main/java/org/springblade/common/cache/CacheNames.java

@@ -37,6 +37,11 @@ public interface CacheNames {
 	String CAPTCHA_KEY = "blade:auth::blade:captcha:";
 
 	/**
+	 * 验证码key
+	 */
+	String APP_LOGIN_CODE_KEY = "blade:auth::blade:dealer:login:";
+
+	/**
 	 * 登录失败key
 	 */
 	String USER_FAIL_KEY = "blade:user::blade:fail:";

+ 117 - 0
blade-common/src/main/java/org/springblade/common/config/RedisConfig.java

@@ -0,0 +1,117 @@
+package org.springblade.common.config;
+
+import com.fasterxml.jackson.annotation.JsonAutoDetect;
+import com.fasterxml.jackson.annotation.JsonTypeInfo;
+import com.fasterxml.jackson.annotation.PropertyAccessor;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.jsontype.impl.LaissezFaireSubTypeValidator;
+import org.springframework.cache.annotation.CachingConfigurerSupport;
+import org.springframework.cache.annotation.EnableCaching;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.data.redis.connection.RedisConnectionFactory;
+import org.springframework.data.redis.core.*;
+import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
+import org.springframework.data.redis.serializer.StringRedisSerializer;
+
+
+/**
+ * @author rain
+ */
+@Configuration
+@EnableCaching
+public class RedisConfig extends CachingConfigurerSupport {
+
+    /**
+     * redis template相关配置
+     *
+     * @param factory 参数
+     * @return 结果
+     */
+    @Bean
+    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
+
+        RedisTemplate<String, Object> template = new RedisTemplate<>();
+        // 配置连接工厂
+        template.setConnectionFactory(factory);
+
+        //使用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值(默认使用JDK的序列化方式)
+        Jackson2JsonRedisSerializer jacksonSeial = new Jackson2JsonRedisSerializer(Object.class);
+
+        ObjectMapper om = new ObjectMapper();
+        // 指定要序列化的域,field,get和set,以及修饰符范围,ANY是都有包括private和public
+        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
+        // 指定序列化输入的类型,类必须是非final修饰的,final修饰的类,比如String,Integer等会跑出异常
+        // om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
+        om.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.WRAPPER_ARRAY);
+        jacksonSeial.setObjectMapper(om);
+
+        // 值采用json序列化
+        template.setValueSerializer(jacksonSeial);
+        //使用StringRedisSerializer来序列化和反序列化redis的key值
+        template.setKeySerializer(new StringRedisSerializer());
+
+        // 设置hash key 和value序列化模式
+        template.setHashKeySerializer(new StringRedisSerializer());
+        template.setHashValueSerializer(jacksonSeial);
+        template.afterPropertiesSet();
+
+        return template;
+    }
+
+    /**
+     * 对hash类型的数据操作
+     *
+     * @param redisTemplate 参数
+     * @return 结果
+     */
+    @Bean
+    public HashOperations<String, String, Object> hashOperations(RedisTemplate<String, Object> redisTemplate) {
+        return redisTemplate.opsForHash();
+    }
+
+    /**
+     * 对redis字符串类型数据操作
+     *
+     * @param redisTemplate 参数
+     * @return 结果
+     */
+    @Bean
+    public ValueOperations<String, Object> valueOperations(RedisTemplate<String, Object> redisTemplate) {
+        return redisTemplate.opsForValue();
+    }
+
+    /**
+     * 对链表类型的数据操作
+     *
+     * @param redisTemplate 参数
+     * @return 结果
+     */
+    @Bean
+    public ListOperations<String, Object> listOperations(RedisTemplate<String, Object> redisTemplate) {
+        return redisTemplate.opsForList();
+    }
+
+    /**
+     * 对无序集合类型的数据操作
+     *
+     * @param redisTemplate 参数
+     * @return 结果
+     */
+    @Bean
+    public SetOperations<String, Object> setOperations(RedisTemplate<String, Object> redisTemplate) {
+        return redisTemplate.opsForSet();
+    }
+
+    /**
+     * 对有序集合类型的数据操作
+     *
+     * @param redisTemplate 参数
+     * @return 结果
+     */
+    @Bean
+    public ZSetOperations<String, Object> zSetOperations(RedisTemplate<String, Object> redisTemplate) {
+        return redisTemplate.opsForZSet();
+    }
+
+}

+ 6 - 1
blade-common/src/main/java/org/springblade/common/enums/NumberEnum.java

@@ -59,7 +59,12 @@ public enum NumberEnum {
 	/**
 	 * 10
 	 */
-	TEN(10);
+	TEN(10),
+
+	/**
+	 * 300
+	 */
+	THREE_HUNDRED(300);
 
 	public final Integer number;
 

+ 0 - 11
blade-common/src/main/java/org/springblade/common/utils/CommonUtil.java

@@ -1,11 +0,0 @@
-
-package org.springblade.common.utils;
-
-/**
- * 通用工具类
- *
- * @author Chill
- */
-public class CommonUtil {
-
-}

+ 0 - 1389
blade-common/src/main/java/org/springblade/common/utils/RedisUtil.java

@@ -1,1389 +0,0 @@
-package org.springblade.common.utils;
-
-import org.springframework.dao.DataAccessException;
-import org.springframework.data.redis.connection.DataType;
-import org.springframework.data.redis.connection.RedisConnection;
-import org.springframework.data.redis.core.Cursor;
-import org.springframework.data.redis.core.RedisCallback;
-import org.springframework.data.redis.core.ScanOptions;
-import org.springframework.data.redis.core.StringRedisTemplate;
-import org.springframework.data.redis.core.ZSetOperations.TypedTuple;
-
-import java.util.*;
-import java.util.Map.Entry;
-import java.util.concurrent.TimeUnit;
-
-public class RedisUtil {
-
-	private StringRedisTemplate redisTemplate;
-
-	public void setRedisTemplate(StringRedisTemplate redisTemplate) {
-		this.redisTemplate = redisTemplate;
-	}
-
-	public StringRedisTemplate getRedisTemplate() {
-		return this.redisTemplate;
-	}
-
-	/** -------------------key相关操作--------------------- */
-
-	/**
-	 * 删除key
-	 *
-	 * @param key
-	 */
-	public void delete(String key) {
-		redisTemplate.delete(key);
-	}
-
-	/**
-	 * 批量删除key
-	 *
-	 * @param keys
-	 */
-	public void delete(Collection<String> keys) {
-		redisTemplate.delete(keys);
-	}
-
-	/**
-	 * 序列化key
-	 *
-	 * @param key
-	 * @return
-	 */
-	public byte[] dump(String key) {
-		return redisTemplate.dump(key);
-	}
-
-	/**
-	 * 是否存在key
-	 *
-	 * @param key
-	 * @return
-	 */
-	public Boolean hasKey(String key) {
-		return redisTemplate.hasKey(key);
-	}
-
-	/**
-	 * 设置过期时间
-	 * TimeUnit是时间单位,可选值有:
-	 * <p>
-	 * 天:TimeUnit.DAYS、
-	 * 小时:TimeUnit.HOURS、
-	 * 分钟:TimeUnit.MINUTES、
-	 * 秒:TimeUnit.SECONDS、
-	 * 毫秒:TimeUnit.MILLISECONDS。
-	 *
-	 * @param key
-	 * @param timeout
-	 * @param unit
-	 * @return
-	 */
-	public Boolean expire(String key, long timeout, TimeUnit unit) {
-		return redisTemplate.expire(key, timeout, unit);
-	}
-
-	/**
-	 * 设置过期时间
-	 *
-	 * @param key
-	 * @param date
-	 * @return
-	 */
-	public Boolean expireAt(String key, Date date) {
-		return redisTemplate.expireAt(key, date);
-	}
-
-	/**
-	 * 查找匹配的key
-	 *
-	 * @param pattern
-	 * @return
-	 */
-	public Set<String> keys(String pattern) {
-		return redisTemplate.keys(pattern);
-	}
-
-	/**
-	 * 将当前数据库的 key 移动到给定的数据库 db 当中
-	 *
-	 * @param key
-	 * @param dbIndex
-	 * @return
-	 */
-	public Boolean move(String key, int dbIndex) {
-		return redisTemplate.move(key, dbIndex);
-	}
-
-	/**
-	 * 移除 key 的过期时间,key 将持久保持
-	 *
-	 * @param key
-	 * @return
-	 */
-	public Boolean persist(String key) {
-		return redisTemplate.persist(key);
-	}
-
-	/**
-	 * 返回 key 的剩余的过期时间
-	 *
-	 * @param key
-	 * @param unit
-	 * @return
-	 */
-	public Long getExpire(String key, TimeUnit unit) {
-		return redisTemplate.getExpire(key, unit);
-	}
-
-	/**
-	 * 返回 key 的剩余的过期时间
-	 *
-	 * @param key
-	 * @return
-	 */
-	public Long getExpire(String key) {
-		return redisTemplate.getExpire(key);
-	}
-
-	/**
-	 * 从当前数据库中随机返回一个 key
-	 *
-	 * @return
-	 */
-	public String randomKey() {
-		return redisTemplate.randomKey();
-	}
-
-	/**
-	 * 修改 key 的名称
-	 *
-	 * @param oldKey
-	 * @param newKey
-	 */
-	public void rename(String oldKey, String newKey) {
-		redisTemplate.rename(oldKey, newKey);
-	}
-
-	/**
-	 * 仅当 newkey 不存在时,将 oldKey 改名为 newkey
-	 *
-	 * @param oldKey
-	 * @param newKey
-	 * @return
-	 */
-	public Boolean renameIfAbsent(String oldKey, String newKey) {
-		return redisTemplate.renameIfAbsent(oldKey, newKey);
-	}
-
-	/**
-	 * 返回 key 所储存的值的类型
-	 *
-	 * @param key
-	 * @return
-	 */
-	public DataType type(String key) {
-		return redisTemplate.type(key);
-	}
-
-	/** -------------------string相关操作--------------------- */
-
-	/**
-	 * 设置指定 key 的值
-	 *
-	 * @param key
-	 * @param value
-	 */
-	public void set(String key, String value) {
-		redisTemplate.opsForValue().set(key, value);
-	}
-
-	/**
-	 * 获取指定 key 的值
-	 *
-	 * @param key
-	 * @return
-	 */
-	public String get(String key) {
-		return redisTemplate.opsForValue().get(key);
-	}
-
-	/**
-	 * 返回 key 中字符串值的子字符
-	 *
-	 * @param key
-	 * @param start
-	 * @param end
-	 * @return
-	 */
-	public String getRange(String key, long start, long end) {
-		return redisTemplate.opsForValue().get(key, start, end);
-	}
-
-	/**
-	 * 将给定 key 的值设为 value ,并返回 key 的旧值(old value)
-	 *
-	 * @param key
-	 * @param value
-	 * @return
-	 */
-	public String getAndSet(String key, String value) {
-		return redisTemplate.opsForValue().getAndSet(key, value);
-	}
-
-	/**
-	 * 对 key 所储存的字符串值,获取指定偏移量上的位(bit)
-	 *
-	 * @param key
-	 * @param offset
-	 * @return
-	 */
-	public Boolean getBit(String key, long offset) {
-		return redisTemplate.opsForValue().getBit(key, offset);
-	}
-
-	/**
-	 * 批量获取
-	 *
-	 * @param keys
-	 * @return
-	 */
-	public List<String> multiGet(Collection<String> keys) {
-		return redisTemplate.opsForValue().multiGet(keys);
-	}
-
-	/**
-	 * bit 位示图
-	 * 设置ASCII码, 字符串'a'的ASCII码是97, 转为二进制是'01100001', 此方法是将二进制第offset位值变为value
-	 *
-	 * @param key
-	 * @param offset 位置
-	 * @param value  值,true为1, false为0
-	 * @return
-	 */
-	public boolean setBit(String key, long offset, boolean value) {
-		return redisTemplate.opsForValue().setBit(key, offset, value);
-	}
-
-	/**
-	 * 将值 value 关联到 key ,并将 key 的过期时间设为 timeout
-	 *
-	 * @param key
-	 * @param value
-	 * @param timeout 过期时间
-	 * @param unit    时间单位, 天:TimeUnit.DAYS 小时:TimeUnit.HOURS 分钟:TimeUnit.MINUTES
-	 *                秒:TimeUnit.SECONDS 毫秒:TimeUnit.MILLISECONDS
-	 */
-	public void setEx(String key, String value, long timeout, TimeUnit unit) {
-		redisTemplate.opsForValue().set(key, value, timeout, unit);
-	}
-
-	/**
-	 * 只有在 key 不存在时设置 key 的值
-	 *
-	 * @param key
-	 * @param value
-	 * @return 之前已经存在返回false, 不存在返回true
-	 */
-	public boolean setIfAbsent(String key, String value) {
-		return redisTemplate.opsForValue().setIfAbsent(key, value);
-	}
-
-	/**
-	 * 用 value 参数覆写给定 key 所储存的字符串值,从偏移量 offset 开始
-	 *
-	 * @param key
-	 * @param value
-	 * @param offset 从指定位置开始覆写
-	 */
-	public void setRange(String key, String value, long offset) {
-		redisTemplate.opsForValue().set(key, value, offset);
-	}
-
-	/**
-	 * 获取字符串的长度
-	 *
-	 * @param key
-	 * @return
-	 */
-	public Long size(String key) {
-		return redisTemplate.opsForValue().size(key);
-	}
-
-	/**
-	 * 批量添加
-	 *
-	 * @param maps
-	 */
-	public void multiSet(Map<String, String> maps) {
-		redisTemplate.opsForValue().multiSet(maps);
-	}
-
-	/**
-	 * 同时设置一个或多个 key-value 对,当且仅当所有给定 key 都不存在
-	 *
-	 * @param maps
-	 * @return 之前已经存在返回false, 不存在返回true
-	 */
-	public boolean multiSetIfAbsent(Map<String, String> maps) {
-		return redisTemplate.opsForValue().multiSetIfAbsent(maps);
-	}
-
-	/**
-	 * 增加(自增长), 负数则为自减
-	 *
-	 * @param key
-	 * @param increment
-	 * @return
-	 */
-	public Long incrBy(String key, long increment) {
-		return redisTemplate.opsForValue().increment(key, increment);
-	}
-
-	/**
-	 * 增加(自增长), 负数则为自减
-	 *
-	 * @param key
-	 * @param increment
-	 * @return
-	 */
-	public Double incrByFloat(String key, double increment) {
-		return redisTemplate.opsForValue().increment(key, increment);
-	}
-
-	/**
-	 * 追加到末尾
-	 *
-	 * @param key
-	 * @param value
-	 * @return
-	 */
-	public Integer append(String key, String value) {
-		return redisTemplate.opsForValue().append(key, value);
-	}
-
-	/** -------------------hash相关操作------------------------- */
-
-	/**
-	 * 获取存储在哈希表中指定字段的值
-	 *
-	 * @param key
-	 * @param field
-	 * @return
-	 */
-	public Object hGet(String key, String field) {
-		return redisTemplate.opsForHash().get(key, field);
-	}
-
-	/**
-	 * 获取所有给定字段的值
-	 *
-	 * @param key
-	 * @return
-	 */
-	public Map<Object, Object> hGetAll(String key) {
-		return redisTemplate.opsForHash().entries(key);
-	}
-
-	/**
-	 * 获取所有给定字段的值
-	 *
-	 * @param key
-	 * @param fields
-	 * @return
-	 */
-	public List<Object> hMultiGet(String key, Collection<Object> fields) {
-		return redisTemplate.opsForHash().multiGet(key, fields);
-	}
-
-	public void hPut(String key, String hashKey, String value) {
-		redisTemplate.opsForHash().put(key, hashKey, value);
-	}
-
-	public void hPutAll(String key, Map<String, String> maps) {
-		redisTemplate.opsForHash().putAll(key, maps);
-	}
-
-	/**
-	 * 仅当hashKey不存在时才设置
-	 *
-	 * @param key
-	 * @param hashKey
-	 * @param value
-	 * @return
-	 */
-	public Boolean hPutIfAbsent(String key, String hashKey, String value) {
-		return redisTemplate.opsForHash().putIfAbsent(key, hashKey, value);
-	}
-
-	/**
-	 * 删除一个或多个哈希表字段
-	 *
-	 * @param key
-	 * @param fields
-	 * @return
-	 */
-	public Long hDelete(String key, Object... fields) {
-		return redisTemplate.opsForHash().delete(key, fields);
-	}
-
-	/**
-	 * 查看哈希表 key 中,指定的字段是否存在
-	 *
-	 * @param key
-	 * @param field
-	 * @return
-	 */
-	public boolean hExists(String key, String field) {
-		return redisTemplate.opsForHash().hasKey(key, field);
-	}
-
-	/**
-	 * 为哈希表 key 中的指定字段的整数值加上增量 increment
-	 *
-	 * @param key
-	 * @param field
-	 * @param increment
-	 * @return
-	 */
-	public Long hIncrBy(String key, Object field, long increment) {
-		return redisTemplate.opsForHash().increment(key, field, increment);
-	}
-
-	/**
-	 * 为哈希表 key 中的指定字段的整数值加上增量 increment
-	 *
-	 * @param key
-	 * @param field
-	 * @param delta
-	 * @return
-	 */
-	public Double hIncrByFloat(String key, Object field, double delta) {
-		return redisTemplate.opsForHash().increment(key, field, delta);
-	}
-
-	/**
-	 * 获取所有哈希表中的字段
-	 *
-	 * @param key
-	 * @return
-	 */
-	public Set<Object> hKeys(String key) {
-		return redisTemplate.opsForHash().keys(key);
-	}
-
-	/**
-	 * 获取哈希表中字段的数量
-	 *
-	 * @param key
-	 * @return
-	 */
-	public Long hSize(String key) {
-		return redisTemplate.opsForHash().size(key);
-	}
-
-	/**
-	 * 获取哈希表中所有值
-	 *
-	 * @param key
-	 * @return
-	 */
-	public List<Object> hValues(String key) {
-		return redisTemplate.opsForHash().values(key);
-	}
-
-	/**
-	 * 迭代哈希表中的键值对
-	 *
-	 * @param key
-	 * @param options
-	 * @return
-	 */
-	public Cursor<Entry<Object, Object>> hScan(String key, ScanOptions options) {
-		return redisTemplate.opsForHash().scan(key, options);
-	}
-
-	/** ------------------------list相关操作---------------------------- */
-
-	/**
-	 * 通过索引获取列表中的元素
-	 *
-	 * @param key
-	 * @param index
-	 * @return
-	 */
-	public String lIndex(String key, long index) {
-		return redisTemplate.opsForList().index(key, index);
-	}
-
-	/**
-	 * 获取列表指定范围内的元素
-	 *
-	 * @param key
-	 * @param start 开始位置, 0是开始位置
-	 * @param end   结束位置, -1返回所有
-	 * @return
-	 */
-	public List<String> lRange(String key, long start, long end) {
-		return redisTemplate.opsForList().range(key, start, end);
-	}
-
-	/**
-	 * 存储在list头部
-	 *
-	 * @param key
-	 * @param value
-	 * @return
-	 */
-	public Long lLeftPush(String key, String value) {
-		return redisTemplate.opsForList().leftPush(key, value);
-	}
-
-	/**
-	 * @param key
-	 * @param value
-	 * @return
-	 */
-	public Long lLeftPushAll(String key, String... value) {
-		return redisTemplate.opsForList().leftPushAll(key, value);
-	}
-
-	/**
-	 * @param key
-	 * @param value
-	 * @return
-	 */
-	public Long lLeftPushAll(String key, Collection<String> value) {
-		return redisTemplate.opsForList().leftPushAll(key, value);
-	}
-
-	/**
-	 * 当list存在的时候才加入
-	 *
-	 * @param key
-	 * @param value
-	 * @return
-	 */
-	public Long lLeftPushIfPresent(String key, String value) {
-		return redisTemplate.opsForList().leftPushIfPresent(key, value);
-	}
-
-	/**
-	 * 如果pivot存在,再pivot前面添加
-	 *
-	 * @param key
-	 * @param pivot
-	 * @param value
-	 * @return
-	 */
-	public Long lLeftPush(String key, String pivot, String value) {
-		return redisTemplate.opsForList().leftPush(key, pivot, value);
-	}
-
-	/**
-	 * @param key
-	 * @param value
-	 * @return
-	 */
-	public Long lRightPush(String key, String value) {
-		return redisTemplate.opsForList().rightPush(key, value);
-	}
-
-	/**
-	 * @param key
-	 * @param value
-	 * @return
-	 */
-	public Long lRightPushAll(String key, String... value) {
-		return redisTemplate.opsForList().rightPushAll(key, value);
-	}
-
-	/**
-	 * @param key
-	 * @param value
-	 * @return
-	 */
-	public Long lRightPushAll(String key, Collection<String> value) {
-		return redisTemplate.opsForList().rightPushAll(key, value);
-	}
-
-	/**
-	 * 为已存在的列表添加值
-	 *
-	 * @param key
-	 * @param value
-	 * @return
-	 */
-	public Long lRightPushIfPresent(String key, String value) {
-		return redisTemplate.opsForList().rightPushIfPresent(key, value);
-	}
-
-	/**
-	 * 在pivot元素的右边添加值
-	 *
-	 * @param key
-	 * @param pivot
-	 * @param value
-	 * @return
-	 */
-	public Long lRightPush(String key, String pivot, String value) {
-		return redisTemplate.opsForList().rightPush(key, pivot, value);
-	}
-
-	/**
-	 * 通过索引设置列表元素的值
-	 *
-	 * @param key
-	 * @param index 位置
-	 * @param value
-	 */
-	public void lSet(String key, long index, String value) {
-		redisTemplate.opsForList().set(key, index, value);
-	}
-
-	/**
-	 * 移出并获取列表的第一个元素
-	 *
-	 * @param key
-	 * @return 删除的元素
-	 */
-	public String lLeftPop(String key) {
-		return redisTemplate.opsForList().leftPop(key);
-	}
-
-	/**
-	 * 移出并获取列表的第一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止
-	 *
-	 * @param key
-	 * @param timeout 等待时间
-	 * @param unit    时间单位
-	 * @return
-	 */
-	public String lBLeftPop(String key, long timeout, TimeUnit unit) {
-		return redisTemplate.opsForList().leftPop(key, timeout, unit);
-	}
-
-	/**
-	 * 移除并获取列表最后一个元素
-	 *
-	 * @param key
-	 * @return 删除的元素
-	 */
-	public String lRightPop(String key) {
-		return redisTemplate.opsForList().rightPop(key);
-	}
-
-	/**
-	 * 移出并获取列表的最后一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止
-	 *
-	 * @param key
-	 * @param timeout 等待时间
-	 * @param unit    时间单位
-	 * @return
-	 */
-	public String lBRightPop(String key, long timeout, TimeUnit unit) {
-		return redisTemplate.opsForList().rightPop(key, timeout, unit);
-	}
-
-	/**
-	 * 移除列表的最后一个元素,并将该元素添加到另一个列表并返回
-	 *
-	 * @param sourceKey
-	 * @param destinationKey
-	 * @return
-	 */
-	public String lRightPopAndLeftPush(String sourceKey, String destinationKey) {
-		return redisTemplate.opsForList().rightPopAndLeftPush(sourceKey,
-			destinationKey);
-	}
-
-	/**
-	 * 从列表中弹出一个值,将弹出的元素插入到另外一个列表中并返回它; 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止
-	 *
-	 * @param sourceKey
-	 * @param destinationKey
-	 * @param timeout
-	 * @param unit
-	 * @return
-	 */
-	public String lBRightPopAndLeftPush(String sourceKey, String destinationKey,
-										long timeout, TimeUnit unit) {
-		return redisTemplate.opsForList().rightPopAndLeftPush(sourceKey,
-			destinationKey, timeout, unit);
-	}
-
-	/**
-	 * 删除集合中值等于value得元素
-	 *
-	 * @param key
-	 * @param index index=0, 删除所有值等于value的元素; index>0, 从头部开始删除第一个值等于value的元素;
-	 *              index<0, 从尾部开始删除第一个值等于value的元素;
-	 * @param value
-	 * @return
-	 */
-	public Long lRemove(String key, long index, String value) {
-		return redisTemplate.opsForList().remove(key, index, value);
-	}
-
-	/**
-	 * 裁剪list
-	 *
-	 * @param key
-	 * @param start
-	 * @param end
-	 */
-	public void lTrim(String key, long start, long end) {
-		redisTemplate.opsForList().trim(key, start, end);
-	}
-
-	/**
-	 * 获取列表长度
-	 *
-	 * @param key
-	 * @return
-	 */
-	public Long lLen(String key) {
-		return redisTemplate.opsForList().size(key);
-	}
-
-	/** --------------------set相关操作-------------------------- */
-
-	/**
-	 * set添加元素
-	 *
-	 * @param key
-	 * @param values
-	 * @return
-	 */
-	public Long sAdd(String key, String... values) {
-		return redisTemplate.opsForSet().add(key, values);
-	}
-
-	/**
-	 * set移除元素
-	 *
-	 * @param key
-	 * @param values
-	 * @return
-	 */
-	public Long sRemove(String key, Object... values) {
-		return redisTemplate.opsForSet().remove(key, values);
-	}
-
-	/**
-	 * 移除并返回集合的一个随机元素
-	 *
-	 * @param key
-	 * @return
-	 */
-	public String sPop(String key) {
-		return redisTemplate.opsForSet().pop(key);
-	}
-
-	/**
-	 * 将元素value从一个集合移到另一个集合
-	 *
-	 * @param key
-	 * @param value
-	 * @param destKey
-	 * @return
-	 */
-	public Boolean sMove(String key, String value, String destKey) {
-		return redisTemplate.opsForSet().move(key, value, destKey);
-	}
-
-	/**
-	 * 获取集合的大小
-	 *
-	 * @param key
-	 * @return
-	 */
-	public Long sSize(String key) {
-		return redisTemplate.opsForSet().size(key);
-	}
-
-	/**
-	 * 判断集合是否包含value
-	 *
-	 * @param key
-	 * @param value
-	 * @return
-	 */
-	public Boolean sIsMember(String key, Object value) {
-		return redisTemplate.opsForSet().isMember(key, value);
-	}
-
-	/**
-	 * 获取两个集合的交集
-	 *
-	 * @param key
-	 * @param otherKey
-	 * @return
-	 */
-	public Set<String> sIntersect(String key, String otherKey) {
-		return redisTemplate.opsForSet().intersect(key, otherKey);
-	}
-
-	/**
-	 * 获取key集合与多个集合的交集
-	 *
-	 * @param key
-	 * @param otherKeys
-	 * @return
-	 */
-	public Set<String> sIntersect(String key, Collection<String> otherKeys) {
-		return redisTemplate.opsForSet().intersect(key, otherKeys);
-	}
-
-	/**
-	 * key集合与otherKey集合的交集存储到destKey集合中
-	 *
-	 * @param key
-	 * @param otherKey
-	 * @param destKey
-	 * @return
-	 */
-	public Long sIntersectAndStore(String key, String otherKey, String destKey) {
-		return redisTemplate.opsForSet().intersectAndStore(key, otherKey,
-			destKey);
-	}
-
-	/**
-	 * key集合与多个集合的交集存储到destKey集合中
-	 *
-	 * @param key
-	 * @param otherKeys
-	 * @param destKey
-	 * @return
-	 */
-	public Long sIntersectAndStore(String key, Collection<String> otherKeys,
-								   String destKey) {
-		return redisTemplate.opsForSet().intersectAndStore(key, otherKeys,
-			destKey);
-	}
-
-	/**
-	 * 获取两个集合的并集
-	 *
-	 * @param key
-	 * @param otherKeys
-	 * @return
-	 */
-	public Set<String> sUnion(String key, String otherKeys) {
-		return redisTemplate.opsForSet().union(key, otherKeys);
-	}
-
-	/**
-	 * 获取key集合与多个集合的并集
-	 *
-	 * @param key
-	 * @param otherKeys
-	 * @return
-	 */
-	public Set<String> sUnion(String key, Collection<String> otherKeys) {
-		return redisTemplate.opsForSet().union(key, otherKeys);
-	}
-
-	/**
-	 * key集合与otherKey集合的并集存储到destKey中
-	 *
-	 * @param key
-	 * @param otherKey
-	 * @param destKey
-	 * @return
-	 */
-	public Long sUnionAndStore(String key, String otherKey, String destKey) {
-		return redisTemplate.opsForSet().unionAndStore(key, otherKey, destKey);
-	}
-
-	/**
-	 * key集合与多个集合的并集存储到destKey中
-	 *
-	 * @param key
-	 * @param otherKeys
-	 * @param destKey
-	 * @return
-	 */
-	public Long sUnionAndStore(String key, Collection<String> otherKeys,
-							   String destKey) {
-		return redisTemplate.opsForSet().unionAndStore(key, otherKeys, destKey);
-	}
-
-	/**
-	 * 获取两个集合的差集
-	 *
-	 * @param key
-	 * @param otherKey
-	 * @return
-	 */
-	public Set<String> sDifference(String key, String otherKey) {
-		return redisTemplate.opsForSet().difference(key, otherKey);
-	}
-
-	/**
-	 * 获取key集合与多个集合的差集
-	 *
-	 * @param key
-	 * @param otherKeys
-	 * @return
-	 */
-	public Set<String> sDifference(String key, Collection<String> otherKeys) {
-		return redisTemplate.opsForSet().difference(key, otherKeys);
-	}
-
-	/**
-	 * key集合与otherKey集合的差集存储到destKey中
-	 *
-	 * @param key
-	 * @param otherKey
-	 * @param destKey
-	 * @return
-	 */
-	public Long sDifference(String key, String otherKey, String destKey) {
-		return redisTemplate.opsForSet().differenceAndStore(key, otherKey,
-			destKey);
-	}
-
-	/**
-	 * key集合与多个集合的差集存储到destKey中
-	 *
-	 * @param key
-	 * @param otherKeys
-	 * @param destKey
-	 * @return
-	 */
-	public Long sDifference(String key, Collection<String> otherKeys,
-							String destKey) {
-		return redisTemplate.opsForSet().differenceAndStore(key, otherKeys,
-			destKey);
-	}
-
-	/**
-	 * 获取集合所有元素
-	 *
-	 * @param key
-	 * @return
-	 */
-	public Set<String> setMembers(String key) {
-		return redisTemplate.opsForSet().members(key);
-	}
-
-	/**
-	 * 随机获取集合中的一个元素
-	 *
-	 * @param key
-	 * @return
-	 */
-	public String sRandomMember(String key) {
-		return redisTemplate.opsForSet().randomMember(key);
-	}
-
-	/**
-	 * 随机获取集合中count个元素
-	 *
-	 * @param key
-	 * @param count
-	 * @return
-	 */
-	public List<String> sRandomMembers(String key, long count) {
-		return redisTemplate.opsForSet().randomMembers(key, count);
-	}
-
-	/**
-	 * 随机获取集合中count个元素并且去除重复的
-	 *
-	 * @param key
-	 * @param count
-	 * @return
-	 */
-	public Set<String> sDistinctRandomMembers(String key, long count) {
-		return redisTemplate.opsForSet().distinctRandomMembers(key, count);
-	}
-
-	/**
-	 * @param key
-	 * @param options
-	 * @return
-	 */
-	public Cursor<String> sScan(String key, ScanOptions options) {
-		return redisTemplate.opsForSet().scan(key, options);
-	}
-
-	/**------------------zSet相关操作--------------------------------*/
-
-	/**
-	 * 添加元素,有序集合是按照元素的score值由小到大排列
-	 *
-	 * @param key
-	 * @param value
-	 * @param score
-	 * @return
-	 */
-	public Boolean zAdd(String key, String value, double score) {
-		return redisTemplate.opsForZSet().add(key, value, score);
-	}
-
-	/**
-	 * 添加多个值
-	 *
-	 * @param key
-	 * @param values
-	 * @return
-	 */
-	public Long zAdd(String key, Set<TypedTuple<String>> values) {
-		return redisTemplate.opsForZSet().add(key, values);
-	}
-
-	/**
-	 * 删除多个值
-	 *
-	 * @param key
-	 * @param values
-	 * @return
-	 */
-	public Long zRemove(String key, Object... values) {
-		return redisTemplate.opsForZSet().remove(key, values);
-	}
-
-	/**
-	 * 增加元素的score值,并返回增加后的值
-	 *
-	 * @param key
-	 * @param value
-	 * @param delta
-	 * @return
-	 */
-	public Double zIncrementScore(String key, String value, double delta) {
-		return redisTemplate.opsForZSet().incrementScore(key, value, delta);
-	}
-
-	/**
-	 * 返回元素在集合的排名,有序集合是按照元素的score值由小到大排列
-	 *
-	 * @param key
-	 * @param value
-	 * @return 0表示第一位
-	 */
-	public Long zRank(String key, Object value) {
-		return redisTemplate.opsForZSet().rank(key, value);
-	}
-
-	/**
-	 * 返回元素在集合的排名,按元素的score值由大到小排列
-	 *
-	 * @param key
-	 * @param value
-	 * @return
-	 */
-	public Long zReverseRank(String key, Object value) {
-		return redisTemplate.opsForZSet().reverseRank(key, value);
-	}
-
-	/**
-	 * 获取集合的元素, 从小到大排序
-	 *
-	 * @param key
-	 * @param start 开始位置
-	 * @param end   结束位置, -1查询所有
-	 * @return
-	 */
-	public Set<String> zRange(String key, long start, long end) {
-		return redisTemplate.opsForZSet().range(key, start, end);
-	}
-
-	/**
-	 * 获取集合元素, 并且把score值也获取
-	 *
-	 * @param key
-	 * @param start
-	 * @param end
-	 * @return
-	 */
-	public Set<TypedTuple<String>> zRangeWithScores(String key, long start,
-													long end) {
-		return redisTemplate.opsForZSet().rangeWithScores(key, start, end);
-	}
-
-	/**
-	 * 根据Score值查询集合元素
-	 *
-	 * @param key
-	 * @param min 最小值
-	 * @param max 最大值
-	 * @return
-	 */
-	public Set<String> zRangeByScore(String key, double min, double max) {
-		return redisTemplate.opsForZSet().rangeByScore(key, min, max);
-	}
-
-	/**
-	 * 根据Score值查询集合元素, 从小到大排序
-	 * 根据score范围查询元素,并返回score
-	 *
-	 * @param key
-	 * @param min 最小值
-	 * @param max 最大值
-	 * @return
-	 */
-	public Set<TypedTuple<String>> zRangeByScoreWithScores(String key,
-														   double min, double max) {
-		return redisTemplate.opsForZSet().rangeByScoreWithScores(key, min, max);
-	}
-
-	/**
-	 * 根据score查询元素,s开始e结束位置
-	 *
-	 * @param key
-	 * @param min
-	 * @param max
-	 * @param start
-	 * @param end
-	 * @return
-	 */
-	public Set<TypedTuple<String>> zRangeByScoreWithScores(String key,
-														   double min, double max, long start, long end) {
-		return redisTemplate.opsForZSet().rangeByScoreWithScores(key, min, max,
-			start, end);
-	}
-
-	/**
-	 * 获取集合的元素, 从大到小排序
-	 *
-	 * @param key
-	 * @param start
-	 * @param end
-	 * @return
-	 */
-	public Set<String> zReverseRange(String key, long start, long end) {
-		return redisTemplate.opsForZSet().reverseRange(key, start, end);
-	}
-
-	/**
-	 * 获取集合的元素, 从大到小排序, 并返回score值
-	 *
-	 * @param key
-	 * @param start
-	 * @param end
-	 * @return
-	 */
-	public Set<TypedTuple<String>> zReverseRangeWithScores(String key,
-														   long start, long end) {
-		return redisTemplate.opsForZSet().reverseRangeWithScores(key, start,
-			end);
-	}
-
-	/**
-	 * 根据Score值查询集合元素, 从大到小排序
-	 *
-	 * @param key
-	 * @param min
-	 * @param max
-	 * @return
-	 */
-	public Set<String> zReverseRangeByScore(String key, double min,
-											double max) {
-		return redisTemplate.opsForZSet().reverseRangeByScore(key, min, max);
-	}
-
-	/**
-	 * 根据Score值查询集合元素, 从大到小排序
-	 *
-	 * @param key
-	 * @param min
-	 * @param max
-	 * @return
-	 */
-	public Set<TypedTuple<String>> zReverseRangeByScoreWithScores(
-		String key, double min, double max) {
-		return redisTemplate.opsForZSet().reverseRangeByScoreWithScores(key,
-			min, max);
-	}
-
-	/**
-	 * 根据score范围查询元素,从大到小排序 s开始 end 结束位置
-	 *
-	 * @param key
-	 * @param min
-	 * @param max
-	 * @param start
-	 * @param end
-	 * @return
-	 */
-	public Set<String> zReverseRangeByScore(String key, double min,
-											double max, long start, long end) {
-		return redisTemplate.opsForZSet().reverseRangeByScore(key, min, max,
-			start, end);
-	}
-
-	/**
-	 * 根据score值获取集合元素数量
-	 *
-	 * @param key
-	 * @param min
-	 * @param max
-	 * @return
-	 */
-	public Long zCount(String key, double min, double max) {
-		return redisTemplate.opsForZSet().count(key, min, max);
-	}
-
-	/**
-	 * 获取集合大小
-	 *
-	 * @param key
-	 * @return
-	 */
-	public Long zSize(String key) {
-		return redisTemplate.opsForZSet().size(key);
-	}
-
-	/**
-	 * 获取集合大小
-	 *
-	 * @param key
-	 * @return
-	 */
-	public Long zZCard(String key) {
-		return redisTemplate.opsForZSet().zCard(key);
-	}
-
-	/**
-	 * 获取集合中value元素的score值
-	 *
-	 * @param key
-	 * @param value
-	 * @return
-	 */
-	public Double zScore(String key, Object value) {
-		return redisTemplate.opsForZSet().score(key, value);
-	}
-
-	/**
-	 * 移除指定索引位置的成员
-	 *
-	 * @param key
-	 * @param start
-	 * @param end
-	 * @return
-	 */
-	public Long zRemoveRange(String key, long start, long end) {
-		return redisTemplate.opsForZSet().removeRange(key, start, end);
-	}
-
-	/**
-	 * 根据指定的score值的范围来移除成员
-	 *
-	 * @param key
-	 * @param min
-	 * @param max
-	 * @return
-	 */
-	public Long zRemoveRangeByScore(String key, double min, double max) {
-		return redisTemplate.opsForZSet().removeRangeByScore(key, min, max);
-	}
-
-	/**
-	 * 获取key和otherKey的并集并存储在destKey中
-	 *
-	 * @param key
-	 * @param otherKey
-	 * @param destKey
-	 * @return
-	 */
-	public Long zUnionAndStore(String key, String otherKey, String destKey) {
-		return redisTemplate.opsForZSet().unionAndStore(key, otherKey, destKey);
-	}
-
-	/**
-	 * @param key
-	 * @param otherKeys
-	 * @param destKey
-	 * @return
-	 */
-	public Long zUnionAndStore(String key, Collection<String> otherKeys,
-							   String destKey) {
-		return redisTemplate.opsForZSet()
-			.unionAndStore(key, otherKeys, destKey);
-	}
-
-	/**
-	 * 交集
-	 *
-	 * @param key
-	 * @param otherKey
-	 * @param destKey
-	 * @return
-	 */
-	public Long zIntersectAndStore(String key, String otherKey,
-								   String destKey) {
-		return redisTemplate.opsForZSet().intersectAndStore(key, otherKey,
-			destKey);
-	}
-
-	/**
-	 * 交集
-	 *
-	 * @param key
-	 * @param otherKeys
-	 * @param destKey
-	 * @return
-	 */
-	public Long zIntersectAndStore(String key, Collection<String> otherKeys,
-								   String destKey) {
-		return redisTemplate.opsForZSet().intersectAndStore(key, otherKeys,
-			destKey);
-	}
-
-	/**
-	 * @param key
-	 * @param options
-	 * @return
-	 */
-	public Cursor<TypedTuple<String>> zScan(String key, ScanOptions options) {
-		return redisTemplate.opsForZSet().scan(key, options);
-	}
-
-	/**
-	 * 获取Redis List 序列化
-	 *
-	 * @param key
-	 * @param targetClass
-	 * @param <T>
-	 * @return
-	 */
-	public <T> List<T> getListCache(final String key, Class<T> targetClass) {
-		byte[] result = redisTemplate.execute(new RedisCallback<byte[]>() {
-			@Override
-			public byte[] doInRedis(RedisConnection connection) throws DataAccessException {
-				return connection.get(key.getBytes());
-			}
-		});
-		if (result == null) {
-			return null;
-		}
-		return ProtoStuffSerializerUtil.deserializeList(result, targetClass);
-	}
-
-	/***
-	 * 将List 放进缓存里面
-	 * @param key
-	 * @param objList
-	 * @param expireTime
-	 * @param <T>
-	 * @return
-	 */
-	public <T> boolean putListCacheWithExpireTime(String key, List<T> objList, final long expireTime) {
-		final byte[] bkey = key.getBytes();
-		final byte[] bvalue = ProtoStuffSerializerUtil.serializeList(objList);
-		boolean result = redisTemplate.execute(new RedisCallback<Boolean>() {
-			@Override
-			public Boolean doInRedis(RedisConnection connection) throws DataAccessException {
-				connection.setEx(bkey, expireTime, bvalue);
-				return true;
-			}
-		});
-		return result;
-	}
-
-}

+ 592 - 0
blade-common/src/main/java/org/springblade/common/utils/RedisUtils.java

@@ -0,0 +1,592 @@
+package org.springblade.common.utils;
+
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.stereotype.Component;
+import org.springframework.util.StringUtils;
+
+import javax.annotation.Resource;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * redisTemplate封装
+ *
+ * @author rain
+ */
+@Component
+public class RedisUtils {
+
+    @Resource
+    private RedisTemplate<String, Object> redisTemplate;
+
+    public RedisUtils(RedisTemplate<String, Object> redisTemplate) {
+        this.redisTemplate = redisTemplate;
+    }
+
+
+    /**
+     * 指定缓存失效时间
+     *
+     * @param key  键
+     * @param time 时间(秒)
+     * @return 结果
+     */
+    public boolean expire(String key, long time) {
+        try {
+            if (time > 0) {
+                redisTemplate.expire(key, time, TimeUnit.SECONDS);
+            }
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    /**
+     * 根据key 获取过期时间
+     *
+     * @param key 键 不能为null
+     * @return 时间(秒) 返回0代表为永久有效
+     */
+    public Long getExpire(String key) {
+        if (!StringUtils.hasText(key)) {
+            throw new NullPointerException("key不能为空");
+        }
+        Long data = redisTemplate.getExpire(key, TimeUnit.SECONDS);
+        return data == null ? 0L : data;
+
+    }
+
+    /**
+     * 判断key是否存在
+     *
+     * @param key 键
+     * @return true 存在 false不存在
+     */
+    public boolean hasKey(String key) {
+        try {
+            return redisTemplate.hasKey(key);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    /**
+     * 删除缓存
+     *
+     * @param key 可以传一个值 或多个
+     */
+    @SuppressWarnings("unchecked")
+    public void del(String... key) {
+        if (key != null && key.length > 0) {
+            if (key.length == 1) {
+                redisTemplate.delete(key[0]);
+            } else {
+                redisTemplate.delete(Arrays.asList(key));
+            }
+        }
+    }
+
+
+    /**
+     * 普通缓存获取
+     *
+     * @param key 键
+     * @return 值
+     */
+    public Object get(String key) {
+        return key == null ? null : redisTemplate.opsForValue().get(key);
+    }
+
+    /**
+     * 普通缓存放入
+     *
+     * @param key   键
+     * @param value 值
+     * @return true成功 false失败
+     */
+    public boolean set(String key, Object value) {
+        try {
+            redisTemplate.opsForValue().set(key, value);
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    /**
+     * 普通缓存放入并设置时间
+     *
+     * @param key   键
+     * @param value 值
+     * @param time  时间(秒) time要大于0 如果time小于等于0 将设置无限期
+     * @return true成功 false 失败
+     */
+    public 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) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    /**
+     * 递增
+     *
+     * @param key   键
+     * @param delta 要增加几(大于0)
+     * @return 结果
+     */
+    public long incr(String key, long delta) {
+        if (delta < 0) {
+            throw new RuntimeException("递增因子必须大于0");
+        }
+        return redisTemplate.opsForValue().increment(key, delta);
+    }
+
+    /**
+     * 递减
+     *
+     * @param key   键
+     * @param delta 要减少几(小于0)
+     * @return 结果
+     */
+    public long decr(String key, long delta) {
+        if (delta < 0) {
+            throw new RuntimeException("递减因子必须大于0");
+        }
+        return redisTemplate.opsForValue().increment(key, -delta);
+    }
+
+    //================================Map=================================
+
+    /**
+     * HashGet
+     *
+     * @param key  键 不能为null
+     * @param item 项 不能为null
+     * @return 值
+     */
+    public Object hget(String key, String item) {
+        return redisTemplate.opsForHash().get(key, item);
+    }
+
+    /**
+     * 获取hashKey对应的所有键值
+     *
+     * @param key 键
+     * @return 对应的多个键值
+     */
+    public Map<Object, Object> hmget(String key) {
+        return redisTemplate.opsForHash().entries(key);
+    }
+
+    /**
+     * HashSet
+     *
+     * @param key 键
+     * @param map 对应多个键值
+     * @return true 成功 false 失败
+     */
+    public boolean hmset(String key, Map<String, Object> map) {
+        try {
+            redisTemplate.opsForHash().putAll(key, map);
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    /**
+     * HashSet 并设置时间
+     *
+     * @param key  键
+     * @param map  对应多个键值
+     * @param time 时间(秒)
+     * @return true成功 false失败
+     */
+    public boolean hmset(String key, Map<String, Object> map, long time) {
+        try {
+            redisTemplate.opsForHash().putAll(key, map);
+            if (time > 0) {
+                expire(key, time);
+            }
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    /**
+     * 向一张hash表中放入数据,如果不存在将创建
+     *
+     * @param key   键
+     * @param item  项
+     * @param value 值
+     * @return true 成功 false失败
+     */
+    public boolean hset(String key, String item, Object value) {
+        try {
+            redisTemplate.opsForHash().put(key, item, value);
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    /**
+     * 向一张hash表中放入数据,如果不存在将创建
+     *
+     * @param key   键
+     * @param item  项
+     * @param value 值
+     * @param time  时间(秒)  注意:如果已存在的hash表有时间,这里将会替换原有的时间
+     * @return true 成功 false失败
+     */
+    public boolean hset(String key, String item, Object value, long time) {
+        try {
+            redisTemplate.opsForHash().put(key, item, value);
+            if (time > 0) {
+                expire(key, time);
+            }
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    /**
+     * 删除hash表中的值
+     *
+     * @param key  键 不能为null
+     * @param item 项 可以使多个 不能为null
+     */
+    public void hdel(String key, Object... item) {
+        redisTemplate.opsForHash().delete(key, item);
+    }
+
+    /**
+     * 判断hash表中是否有该项的值
+     *
+     * @param key  键 不能为null
+     * @param item 项 不能为null
+     * @return true 存在 false不存在
+     */
+    public boolean hHasKey(String key, String item) {
+        return redisTemplate.opsForHash().hasKey(key, item);
+    }
+
+    /**
+     * hash递增 如果不存在,就会创建一个 并把新增后的值返回
+     *
+     * @param key  键
+     * @param item 项
+     * @param by   要增加几(大于0)
+     * @return 结果
+     */
+    public double hincr(String key, String item, double by) {
+        return redisTemplate.opsForHash().increment(key, item, by);
+    }
+
+    /**
+     * hash递减
+     *
+     * @param key  键
+     * @param item 项
+     * @param by   要减少记(小于0)
+     * @return 结果
+     */
+    public double hdecr(String key, String item, double by) {
+        return redisTemplate.opsForHash().increment(key, item, -by);
+    }
+
+    //============================set=============================
+
+    /**
+     * 根据key获取Set中的所有值
+     *
+     * @param key 键
+     * @return 结果
+     */
+    public Set<Object> sGet(String key) {
+        try {
+            return redisTemplate.opsForSet().members(key);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return null;
+        }
+    }
+
+    /**
+     * 根据value从一个set中查询,是否存在
+     *
+     * @param key   键
+     * @param value 值
+     * @return true 存在 false不存在
+     */
+    public boolean sHasKey(String key, Object value) {
+        try {
+            return redisTemplate.opsForSet().isMember(key, value);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    /**
+     * 将数据放入set缓存
+     *
+     * @param key    键
+     * @param values 值 可以是多个
+     * @return 成功个数
+     */
+    public long sSet(String key, Object... values) {
+        try {
+            return redisTemplate.opsForSet().add(key, values);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return 0;
+        }
+    }
+
+    /**
+     * 将set数据放入缓存
+     *
+     * @param key    键
+     * @param time   时间(秒)
+     * @param values 值 可以是多个
+     * @return 成功个数
+     */
+    public long sSetAndTime(String key, long time, Object... values) {
+        try {
+            Long count = redisTemplate.opsForSet().add(key, values);
+            if (time > 0) {
+                expire(key, time);
+            }
+            return count;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return 0;
+        }
+    }
+
+    /**
+     * 获取set缓存的长度
+     *
+     * @param key 键
+     * @return 结果
+     */
+    public long sGetSetSize(String key) {
+        try {
+            return redisTemplate.opsForSet().size(key);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return 0;
+        }
+    }
+
+    /**
+     * 移除值为value的
+     *
+     * @param key    键
+     * @param values 值 可以是多个
+     * @return 移除的个数
+     */
+    public long setRemove(String key, Object... values) {
+        try {
+            Long count = redisTemplate.opsForSet().remove(key, values);
+            return count;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return 0;
+        }
+    }
+    //===============================list=================================
+
+    /**
+     * 获取list缓存的内容
+     *
+     * @param key   键
+     * @param start 开始
+     * @param end   结束  0 到 -1代表所有值
+     * @return
+     */
+    public List<Object> lGet(String key, long start, long end) {
+        try {
+            return redisTemplate.opsForList().range(key, start, end);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return null;
+        }
+    }
+
+    /**
+     * 获取list缓存的长度
+     *
+     * @param key 键
+     * @return 结果
+     */
+    public long lGetListSize(String key) {
+        try {
+            return redisTemplate.opsForList().size(key);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return 0;
+        }
+    }
+
+    /**
+     * 通过索引 获取list中的值
+     *
+     * @param key   键
+     * @param index 索引  index>=0时, 0 表头,1 第二个元素,依次类推;index<0时,-1,表尾,-2倒数第二个元素,依次类推
+     * @return 结果
+     */
+    public Object lGetIndex(String key, long index) {
+        try {
+            return redisTemplate.opsForList().index(key, index);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return null;
+        }
+    }
+
+    /**
+     * 将list放入缓存
+     *
+     * @param key   键
+     * @param value 值
+     * @return 结果
+     */
+    public boolean lSet(String key, Object value) {
+        try {
+            redisTemplate.opsForList().rightPush(key, value);
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    /**
+     * 将list放入缓存
+     *
+     * @param key   键
+     * @param value 值
+     * @param time  时间(秒)
+     * @return 结果
+     */
+    public boolean lSet(String key, Object value, long time) {
+        try {
+            redisTemplate.opsForList().rightPush(key, value);
+            if (time > 0) {
+                expire(key, time);
+            }
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    /**
+     * 将list放入缓存
+     *
+     * @param key   键
+     * @param value 值
+     * @return 结果
+     */
+    public boolean lSet(String key, List<Object> value) {
+        try {
+            redisTemplate.opsForList().rightPushAll(key, value);
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    /**
+     * 将list放入缓存
+     *
+     * @param key   键
+     * @param value 值
+     * @param time  时间(秒)
+     * @return 结果
+     */
+    public boolean lSet(String key, List<Object> value, long time) {
+        try {
+            redisTemplate.opsForList().rightPushAll(key, value);
+            if (time > 0) {
+                expire(key, time);
+            }
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    /**
+     * 根据索引修改list中的某条数据
+     *
+     * @param key   键
+     * @param index 索引
+     * @param value 值
+     * @return 结果
+     */
+    public boolean lUpdateIndex(String key, long index, Object value) {
+        try {
+            redisTemplate.opsForList().set(key, index, value);
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    /**
+     * 移除N个值为value
+     *
+     * @param key   键
+     * @param count 移除多少个
+     * @param value 值
+     * @return 移除的个数
+     */
+    public long lRemove(String key, long count, Object value) {
+        try {
+            return redisTemplate.opsForList().remove(key, count, value);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return 0;
+        }
+    }
+
+	/**
+	 * 增加(自增长), 负数则为自减
+	 *
+	 * @param key
+	 * @param increment
+	 * @return
+	 */
+	public Long incrBy(String key, long increment) {
+		return redisTemplate.opsForValue().increment(key, increment);
+	}
+
+}

+ 22 - 0
blade-common/src/main/java/org/springblade/common/utils/VerificationCodeUtil.java

@@ -0,0 +1,22 @@
+package org.springblade.common.utils;
+
+import org.apache.commons.lang.math.RandomUtils;
+
+/**
+ * @author Rain
+ */
+public class VerificationCodeUtil {
+
+
+
+
+	public static String getVerificationCode(int length) {
+		StringBuilder sb = new StringBuilder();
+		for (int i = 0; i < length; i++) {
+			sb.append(RandomUtils.nextInt(10));
+		}
+		return sb.toString();
+	}
+
+
+}