package com.cac.cc.common;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson2.JSONObject;
import com.caac.emergency.dto.system.PageDto;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.formula.functions.T;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Repository;
import java.util.List;
import java.util.Set;
import java.util.concurrent.TimeUnit;
@Repository
@Slf4j
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class RedisClient {
private final StringRedisTemplate stringRedisTemplate;
public <T> boolean set(String key, T value) {
try {
//任意类型转换成String
String val = beanToString(value);
if (val == null || val.length() <= 0) {
return false;
}
stringRedisTemplate.opsForValue().set(key, val);
return true;
} catch (Exception e) {
log.error("系统错误:" + e.getMessage(), e);
return false;
}
}
public <T> boolean delete(String key) {
try {
stringRedisTemplate.delete(key);
return true;
} catch (Exception e) {
log.error("系统错误:" + e.getMessage(), e);
return false;
}
}
public <T> Long getLock(String key, long time, TimeUnit type) {
try {
Long res = stringRedisTemplate.opsForValue().increment(key);
stringRedisTemplate.expire(key, time, type);
return res;
} catch (Exception e) {
log.error("系统错误:" + e.getMessage(), e);
return Long.valueOf(0);
}
}
public <T> boolean set(String key, T value, long time, TimeUnit type) {
try {
//任意类型转换成String
String val = beanToString(value);
if (val == null || val.length() <= 0) {
return false;
}
stringRedisTemplate.opsForValue().set(key, val, time, type);
return true;
} catch (Exception e) {
log.error("系统错误:" + e.getMessage(), e);
return false;
}
}
public <T> T get(String key, Class<T> clazz) {
try {
String value = stringRedisTemplate.opsForValue().get(key);
return stringToBean(value, clazz);
} catch (Exception e) {
log.error("系统错误:" + e.getMessage(), e);
return null;
}
}
public <T> List<T> getList(String key, Class<T> clazz) {
try {
String value = stringRedisTemplate.opsForValue().get(key);
return stringToList(value, clazz);
} catch (Exception e) {
log.error("系统错误:" + e.getMessage(), e);
return null;
}
}
/**
* key计数
*
* @param key
* @return
*/
public synchronized Integer setCount(String key) {
try {
Integer count = this.get(key, Integer.class);
if (count == null) {
count = 1;
} else {
count++;
}
this.set(key, count);
return count;
} catch (Exception e) {
log.error("系统错误:" + e.getMessage(), e);
return null;
}
}
/**
* 添加指定元素到有序集合中
*
* @param key
* @param score
* @param value
* @return
*/
public boolean sortSetAdd(String key, double score, String value) {
try {
return stringRedisTemplate.opsForZSet().add(key, value, score);
} catch (Exception e) {
log.error("系统错误:" + e.getMessage(), e);
return false;
}
}
/**
* 有序集合中对指定成员的分数加上增量 increment
*
* @param key
* @param value
* @param i
* @return
*/
public double sortSetZincrby(String key, String value, double i) {
try {
//返回新增元素后的分数
return stringRedisTemplate.opsForZSet().incrementScore(key, value, i);
} catch (Exception e) {
log.error("系统错误:" + e.getMessage(), e);
return -1;
}
}
/**
* 有序集合中对指定成员的分数加上增量 increment
*
* @param key
* @param value
* @return
*/
public double delMember(String key, String value) {
try {
return stringRedisTemplate.opsForZSet().remove(key, value);
} catch (Exception e) {
log.error("系统错误:" + e.getMessage(), e);
return -1;
}
}
/**
* 获得有序集合指定范围元素 (从大到小)
*
* @param key
* @param start
* @param end
* @return
*/
public Set sortSetRange(String key, int start, int end) {
try {
return stringRedisTemplate.opsForZSet().reverseRange(key, start, end);
} catch (Exception e) {
log.error("系统错误:" + e.getMessage(), e);
return null;
}
}
/**
* 获得有序集合大小
*
* @param key
* @return
*/
public Long count(String key) {
try {
return stringRedisTemplate.opsForZSet().size(key);
} catch (Exception e) {
log.error("系统错误:" + e.getMessage(), e);
return null;
}
}
/**
* 获得指定元素的分数
*
* @param key
* @param value
* @param key
* @return
*/
public Double getScope(String key, String value) {
try {
return stringRedisTemplate.opsForZSet().score(key, value);
} catch (Exception e) {
log.error("系统错误:" + e.getMessage(), e);
return null;
}
}
/******************************** set操作 **************/
/**
* 是否为Set成员
*
* @param key
* @param value
* @return
*/
public Boolean isMember(String key, String value) {
try {
return stringRedisTemplate.opsForSet().isMember(key, value);
} catch (Exception e) {
log.error("系统错误:" + e.getMessage(), e);
return null;
}
}
/**
* 新增成员
*
* @param key
* @param value
* @return
*/
public void addMember(String key, String value) {
try {
stringRedisTemplate.opsForSet().add(key, value);
} catch (Exception e) {
log.error("系统错误:" + e.getMessage(), e);
}
}
/**
* 删除成员
*
* @param key
* @param value
* @return
*/
public Long removeMember(String key, String value) {
try {
return stringRedisTemplate.opsForSet().remove(key, value);
} catch (Exception e) {
log.error("系统错误:" + e.getMessage(), e);
return null;
}
}
/**
* 获取所有成员
*
* @param key
* @return
*/
public Set getMembers(String key) {
try {
//获取成员
return stringRedisTemplate.opsForSet().members(key);
} catch (Exception e) {
log.error("系统错误:" + e.getMessage(), e);
return null;
}
}
/**
* 获取所有成员数
*
* @param key
* @return
*/
public Long getMemberSize(String key) {
try {
//获取成员
return stringRedisTemplate.opsForSet().size(key);
} catch (Exception e) {
log.error("系统错误:" + e.getMessage(), e);
return null;
}
}
@SuppressWarnings("unchecked")
private <T> T stringToBean(String value, Class<T> clazz) {
if (value == null || value.length() <= 0 || clazz == null || "null".equals(value)) {
return null;
}
if (clazz == int.class || clazz == Integer.class) {
return (T) Integer.valueOf(value);
} else if (clazz == long.class || clazz == Long.class) {
return (T) Long.valueOf(value);
} else if (clazz == String.class) {
return (T) value;
} else {
return JSON.toJavaObject(JSON.parseObject(value), clazz);
}
}
private <T> List<T> stringToList(String value, Class<T> clazz) {
if (value == null || value.length() <= 0 || clazz == null || "null".equals(value)) {
return null;
}
return JSON.parseArray(value, clazz);
}
/**
* @param value
* @return String
*/
private <T> String beanToString(T value) {
if (value == null) {
return null;
}
Class<?> clazz = value.getClass();
if (clazz == int.class || clazz == Integer.class) {
return "" + value;
} else if (clazz == long.class || clazz == Long.class) {
return "" + value;
} else if (clazz == String.class) {
return (String) value;
} else {
return JSON.toJSONString(value);
}
}
/**
* 获得指定 key的所有key
* 可以是 key* ,*key ,*key* 进行模糊匹配
*
* @param key
* @return
*/
public Set<String> getKeys(String key) {
return stringRedisTemplate.keys(key);
}
/**
* 删除指定key的所有 key的值
* 可以是 key* , *key,*key* 进行模糊匹配
*
* @param key
*/
public void deleteKeys(String key) {
Set<String> keys = stringRedisTemplate.keys(key);
stringRedisTemplate.delete(keys);
}
public synchronized void setContIncrement(String key){
setContIncrement(key,1);
}
/**
* 获取计数器数值
* @param key key
* @return int
*/
public int getContIncrement(String key){
try {
Boolean redisKey = stringRedisTemplate.hasKey(key);
if (redisKey) {
// log.info("获取计数器:"+key);
return Integer.parseInt((String) stringRedisTemplate.opsForValue().get(key));
}else{
return 0;
}
}catch (Exception e){
log.error("获取计数器系统错误:" + e.getMessage(), e);
return 0;
}
}
/**
* 设置计数器
* @param key key
* @param step step
* @return void
*/
public synchronized void setContIncrement(String key,int step){
try{
Boolean redisKey = stringRedisTemplate.hasKey(key);
if (redisKey) {
// log.info("设置计数器"+key);
// 对value进行加1操作
stringRedisTemplate.opsForValue().increment(key,step);
} else{
// log.info("创建计数器"+key);
// 如果没有key值,对他进行添加到redis中
stringRedisTemplate.opsForValue().set(key,step+"");
}
}catch (Exception e){
log.error("自增计数器系统错误:" + e.getMessage(), e);
}
}
public <T> boolean setPage(String key, PageDto<T> page,int time,TimeUnit timeUnit){
try {
JSONObject jsonObject = new JSONObject();
jsonObject.put("totalPage", page.getTotalPage());
jsonObject.put("currentPage", page.getCurrentPage());
jsonObject.put("total", page.getTotal());
jsonObject.put("list", JSONObject.toJSONString(page.getList()));
stringRedisTemplate.opsForValue().set(key, jsonObject.toJSONString(), time, timeUnit);
return true;
}catch (Exception e){
log.error("设置PageDto 缓存异常:"+e.getMessage(),e);
return false;
}
}
public <T> PageDto<T> getPage(String key,Class<T> clazz){
String json = stringRedisTemplate.opsForValue().get(key);
if(json == null || json.isEmpty()){
return null;
}
JSONObject jsonObject = JSONObject.parseObject(json);
PageDto<T> pageDto = PageDto.<T>builder()
.currentPage(jsonObject.getLongValue("currentPage"))
.totalPage(jsonObject.getLongValue("totalPage"))
.total(jsonObject.getLongValue("total"))
.list(stringToList(jsonObject.getString("list"),clazz)).build();
return pageDto;
}
}
// 应用代码
/**
* 忘记密码验证邮件
*
* @return
*/
@PostMapping("/website/search/sendEmail")
@Operation(summary = "忘记密码验证邮件")
@Log("发送邮件")
public ResultDto<String> sendEmail(String receiveAdress,String imgCode ,String uuid ) throws NoSuchAlgorithmException {
//判断用户是否存在
if (StringUtils.isEmpty(receiveAdress) || userService.getByEmail(receiveAdress) == null) {
return ResultDtoUtil.toError("邮箱不合法", "");
}
// 图形验证码校验
String codeRedis = redisClient.get("base_code_" + uuid, String.class);
if (!imgCode.equals(codeRedis)) {
return ResultDtoUtil.toError("图形验证码错误", "");
}
//防攻击
if (redisClient.get("pwdCode_" + receiveAdress, String.class) != null) {
return ResultDtoUtil.toError("验证码发送失败,请60s后再试!", "");
} else {
redisClient.set("pwdCode_" + receiveAdress, "1", 59, TimeUnit.SECONDS);
}
//生成随机6位验证码
SecureRandom random = SecureRandom.getInstance("SHA1PRNG");
String code = (int) ((random.nextDouble() * 9 + 1) * 100000) + "";
//发送
emailCilent.sentCode(sendAdress, receiveAdress, code);
//存到redis中
redisClient.set("pwdCode_email_" + receiveAdress, code, 600000, TimeUnit.MILLISECONDS);
return ResultDtoUtil.toSuccess("验证码发送成功", "");
}
Redis 使用大全---java
于 2024-05-11 09:05:35 首次发布