package com.pig4cloud.pig.common.core.util;
import cn.hutool.core.convert.Convert;
import lombok.experimental.UtilityClass;
import org.springframework.data.redis.connection.RedisConnection;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.*;
import org.springframework.data.redis.core.script.DefaultRedisScript;
import org.springframework.data.redis.core.script.RedisScript;
import java.util.*;
import java.util.concurrent.TimeUnit;
/**
* 缓存工具类
*
* @author XX
* @date 2023/05/12
*/
@UtilityClass
public class RedisUtils {
private static final Long SUCCESS = 1L;
/**
* 指定缓存失效时间
* @param key 键
* @param time 时间(秒)
*/
public boolean expire(String key, long time) {
RedisTemplate<Object, Object> redisTemplate = SpringContextHolder.getBean(RedisTemplate.class);
Optional.ofNullable(redisTemplate)
.filter(template -> time > 0)
.ifPresent(template -> template.expire(key, time, TimeUnit.SECONDS));
return true;
}
/**
* 根据 key 获取过期时间
* @param key 键 不能为null
* @return 时间(秒) 返回0代表为永久有效
*/
public long getExpire(Object key) {
RedisTemplate<Object, Object> redisTemplate = SpringContextHolder.getBean(RedisTemplate.class);
return Optional.ofNullable(redisTemplate)
.map(template -> template.getExpire(key, TimeUnit.SECONDS))
.orElse(-1L);
}
/**
* 查找匹配key
* @param pattern key
* @return /
*/
public List<String> scan(String pattern) {
RedisTemplate<Object, Object> redisTemplate = SpringContextHolder.getBean(RedisTemplate.class);
ScanOptions options = ScanOptions.scanOptions().match(pattern).build();
return Optional.ofNullable(redisTemplate).map(template -> {
RedisConnectionFactory factory = template.getConnectionFactory();
RedisConnection rc = Objects.requireNonNull(factory).getConnection();
Cursor<byte[]> cursor = rc.scan(options);
List<String> result = new ArrayList<>();
while (cursor.hasNext()) {
result.add(new String(cursor.next()));
}
RedisConnectionUtils.releaseConnection(rc, factory);
return result;
}).orElse(Collections.emptyList());
}
/**
* 分页查询 key
* @param patternKey key
* @param page 页码
* @param size 每页数目
* @return /
*/
public List<String> findKeysForPage(String patternKey, int page, int size) {
RedisTemplate redisTemplate = SpringContextHolder.getBean(RedisTemplate.class);
ScanOptions options = ScanOptions.scanOptions().match(patternKey).build();
RedisConnectionFactory factory = redisTemplate.getConnectionFactory();
RedisConnection rc = Objects.requireNonNull(factory).getConnection();
Cursor<byte[]> cursor = rc.scan(options);
List<String> result = new ArrayList<>(size);
int tmpIndex = 0;
int fromIndex = page * size;
int toIndex = page * size + size;
while (cursor.hasNext()) {
if (tmpIndex >= fromIndex && tmpIndex < toIndex) {
result.add(new String(cursor.next()));
tmpIndex++;
continue;
}
// 获取到满足条件的数据后,就可以退出了
if (tmpIndex >= toIndex) {
break;
}
tmpIndex++;
cursor.next();
}
RedisConnectionUtils.releaseConnection(rc, factory);
return result;
}
/**
* 判断key是否存在
* @param key 键
* @return true 存在 false不存在
*/
public boolean hasKey(String key) {
RedisTemplate<Object, Object> redisTemplate = SpringContextHolder.getBean(RedisTemplate.class);
return Optional.ofNullable(redisTemplate).map(template -> template.hasKey(key)).orElse(false);
}
/**
* 删除缓存
* @param keys 可以传一个值 或多个
*/
public void del(String... keys) {
RedisTemplate<Object, Object> redisTemplate = SpringContextHolder.getBean(RedisTemplate.class);
if (keys != null) {
Arrays.stream(keys).forEach(redisTemplate::delete);
}
}
/**
* 获取锁
* @param lockKey 锁key
* @param value value
* @param expireTime:单位-秒
* @return boolean
*/
public boolean getLock(String lockKey, String value, int expireTime) {
RedisTemplate<Object, Object> redisTemplate = SpringContextHolder.getBean(RedisTemplate.class);
return Optional.ofNullable(redisTemplate)
.map(template -> template.opsForValue().setIfAbsent(lockKey, value, expireTime, TimeUnit.SECONDS))
.orElse(false);
}
/**
* 释放锁
* @param lockKey 锁key
* @param value value
* @return boolean
*/
public boolean releaseLock(String lockKey, String value) {
RedisTemplate<Object, Object> redisTemplate = SpringContextHolder.getBean(RedisTemplate.class);
String script = "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end";
RedisScript<Long> redisScript = new DefaultRedisScript<>(script, Long.class);
return Optional.ofNullable(redisTemplate.execute(redisScript, Collections.singletonList(lockKey), value))
.map(Convert::toLong)
.filter(SUCCESS::equals)
.isPresent();
}
// ============================String=============================
/**
* 普通缓存获取
* @param key 键
* @return 值
*/
public <T> T get(String key) {
RedisTemplate<String, T> redisTemplate = SpringContextHolder.getBean(RedisTemplate.class);
return redisTemplate.opsForValue().get(key);
}
/**
* 批量获取
* @param keys
* @return
*/
public <T> List<T> multiGet(List<String> keys) {
RedisTemplate<String, T> redisTemplate = SpringContextHolder.getBean(RedisTemplate.class);
return redisTemplate.opsForValue().multiGet(keys);
}
/**
* 普通缓存放入
* @param key 键
* @param value 值
* @return true成功 false失败
*/
public boolean set(String key, Object value) {
RedisTemplate<Object, Object> redisTemplate = SpringContextHolder.getBean(RedisTemplate.class);
Optional.ofNullable(redisTemplate).map(template -> {
template.opsForValue().set(key, value);
return true;
});
return true;
}
/**
* 普通缓存放入并设置时间
* @param key 键
* @param value 值
* @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期
* @return true成功 false 失败
*/
public boolean set(String key, Object value, long time) {
RedisTemplate<Object, Object> redisTemplate = SpringContextHolder.getBean(RedisTemplate.class);
return Optional.ofNullable(redisTemplate).map(template -> {
if (time > 0) {
template.opsForValue().set(key, value, time, TimeUnit.SECONDS);
}
else {
template.opsForValue().set(key, value);
}
return true;
}).orElse(false);
}
/**
* 普通缓存放入并设置时间
* @param key 键
* @param value 值
* @param time 时间
* @param timeUnit 类型
* @return true成功 false 失败
*/
public <T> boolean set(String key, T value, long time, TimeUnit timeUnit) {
RedisTemplate<String, T> redisTemplate = SpringContextHolder.getBean(RedisTemplate.class);
Optional.ofNullable(redisTemplate).map(template -> {
if (time > 0) {
template.opsForValue().set(key, value, time, timeUnit);
}
else {
template.opsForValue().set(key, value);
}
return true;
});
return true;
}
// ================================Map=================================
/**
* HashGet
* @param key 键 不能为null
* @param hashKey 项 不能为null
* @return 值
*/
public <HK, HV> HV hget(String key, HK hashKey) {
RedisTemplate<String, HV> redisTemplate = SpringContextHolder.getBean(RedisTemplate.class);
return redisTemplate.<HK, HV>opsForHash().get(key, hashKey);
}
/**
* 获取hashKey对应的所有键值
* @param key 键
* @return 对应的多个键值
*/
public <HK, HV> Map<HK, HV> hmget(String key) {
RedisTemplate<String, HV> redisTemplate = SpringContextHolder.getBean(RedisTemplate.class);
return redisTemplate.<HK, HV>opsForHash().entries(key);
}
/**
* HashSet
* @param key 键
* @param map 对应多个键值
* @return true 成功 false 失败
*/
public boolean hmset(String key, Ma
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
基于Spring Boot 3.3、 Spring Cloud 2023 & Alibaba、 SAS OAuth2 的微服务RBAC 权限管理系统。基于 Spring Cloud 、Spring Boot、 OAuth2 的 RBAC 企业快速开发平台, 同时支持微服务架构和单体架构。提供对 Spring Authorization Server 生产级实践,支持多种安全授权模式。提供对常见容器化方案支持 Kubernetes、Rancher2 、Kubesphere、EDAS、SAE 支持
资源推荐
资源详情
资源评论
收起资源包目录
基于SpringCloud、SpringBoot、OAuth2的RBAC企业快速开发平台, 同时支持微服务架构和单体架构 (598个子文件)
com.alibaba.nacos.core.paramcheck.AbstractHttpParamExtractor 670B
main.css 757KB
editor.main.css 168KB
console1412.css 153KB
bootstrap.css 120KB
bootstrap.min.css 118KB
font-awesome.css 33KB
codemirror.css 9KB
icon.css 5KB
merge.css 4KB
signin.css 2KB
Dockerfile 327B
Dockerfile 312B
Dockerfile 307B
Dockerfile 305B
Dockerfile 305B
Dockerfile 305B
Dockerfile 303B
Dockerfile 300B
Dockerfile 299B
.editorconfig 102B
aliyun-console-font.eot 166KB
roboto-bold.eot 23KB
roboto-regular.eot 22KB
roboto-medium.eot 22KB
roboto-light.eot 22KB
roboto-thin.eot 21KB
icon-font.eot 10KB
spring.factories 123B
login.ftl 3KB
confirm.ftl 2KB
.gitignore 595B
index.html 3KB
login.html 1KB
favicon.ico 4KB
org.springframework.boot.autoconfigure.AutoConfiguration.imports 527B
org.springframework.boot.autoconfigure.AutoConfiguration.imports 360B
org.springframework.cloud.openfeign.FeignClient.imports 322B
org.springframework.boot.autoconfigure.AutoConfiguration.imports 196B
org.springframework.boot.autoconfigure.AutoConfiguration.imports 62B
org.springframework.boot.autoconfigure.AutoConfiguration.imports 58B
org.springframework.boot.autoconfigure.AutoConfiguration.imports 53B
org.springframework.boot.autoconfigure.AutoConfiguration.imports 52B
org.springframework.boot.autoconfigure.AutoConfiguration.imports 50B
RedisUtils.java 18KB
SysUserServiceImpl.java 15KB
OAuth2ResourceOwnerBaseAuthenticationProvider.java 13KB
SysJobController.java 11KB
GeneratorServiceImpl.java 10KB
PigFeignClientsRegistrar.java 10KB
PigTokenEndpoint.java 9KB
GenTableServiceImpl.java 9KB
AuthorizationServerConfiguration.java 8KB
RetOps.java 8KB
PigBootSecurityServerConfiguration.java 8KB
OssTemplate.java 8KB
PigDaoAuthenticationProvider.java 8KB
SysDictController.java 7KB
GenTemplateServiceImpl.java 7KB
TaskUtil.java 7KB
SysMenuServiceImpl.java 7KB
SysDeptServiceImpl.java 7KB
SysUserController.java 7KB
NamespaceControllerV2.java 6KB
NacosApiExceptionHandler.java 6KB
PigSentinelInvocationHandler.java 6KB
PigRedisOAuth2AuthorizationService.java 6KB
GenDatasourceConfServiceImpl.java 5KB
PigAuthenticationSuccessEventHandler.java 5KB
SysRoleController.java 5KB
SysRoleServiceImpl.java 5KB
SysPublicParamController.java 5KB
GenTableController.java 5KB
GenTemplateController.java 5KB
NamespaceController.java 5KB
SysPostController.java 5KB
CustomeOAuth2AccessTokenGenerator.java 5KB
GlobalBizExceptionHandler.java 5KB
SysClientController.java 5KB
PigSentinelFeign.java 5KB
WebUtils.java 5KB
PigRemoteRegisteredClientRepository.java 5KB
GenGroupController.java 5KB
SecuritySecureConfig.java 5KB
GenTemplateGroupController.java 5KB
TaskInvokUtil.java 4KB
PigQuartzConfig.java 4KB
GenDsConfController.java 4KB
OssEndpoint.java 4KB
PigBearerTokenExtractor.java 4KB
SysFileController.java 4KB
SysFileServiceImpl.java 4KB
DynamicDataSourceAutoConfiguration.java 4KB
SysLogUtils.java 4KB
GenFieldTypeController.java 4KB
XssUtil.java 4KB
PigAuthenticationFailureEventHandler.java 4KB
LocalFileTemplate.java 4KB
ClassUtils.java 4KB
SysDeptController.java 4KB
共 598 条
- 1
- 2
- 3
- 4
- 5
- 6
资源评论
Java程序员-张凯
- 粉丝: 1w+
- 资源: 7528
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 汽车空调结课论文汽车空调的作用及工作原理.docx
- 燕山大学EDA综合实训实验报告.doc
- 燕山大学金工实习总结报告.docx
- 燕山大学数字电子技术实验报告1-5.docx
- 燕山大学大学物理实验报告.docx
- 考虑电动汽车可调度潜力的充电站两阶段市场投标策略 在电力市场环境下,充电站优化投标策略能降低电力成本,甚至通过电获取收益 考虑了电动汽车成为柔性储荷资源的潜力,提出了日前电力市场和实时电力市场下充电
- 汽车空调讨论课汽车空调异味研究以及解决措施.pptx
- ABB智能杯技术创新大赛贝加莱挑战组决赛答辩.pptx
- 学术海报模板.pptx
- 电机与拖动技术三级项目直流电机串电阻启动项目ppt.pptx
- 四旋翼飞行器基于 PID 的姿态控制建模与仿真simulink仿真
- COMSOL超声仿真:The effects of air gap reflections during air-coupled leaky Lamb wave inspection of thin
- protobuf-29.2
- 世界磁场模型 WMM2025
- 有源电力滤波器仿真,谐波检测有ipiq法,控制有双闭环或者滞环,只针对低于5%,可单出仿真和各种资料,需要另外付费(包括计算文档和原理图,依旧对应lun温思路去讲解,半天带你走入APF,全面保姆级 )
- 毕业设计-python在线自主评测系统(毕业全套文档+源代码).zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功