首页
留言
导航
统计
Search
1
追番推荐!免费看动漫的网站 - 支持在线观看和磁力下载
3,017 阅读
2
推荐31个docker应用,每一个都很实用
1,455 阅读
3
PVE自动启动 虚拟机 | 容器 顺序设置及参数说明
1,019 阅读
4
一条命令,永久激活!Office 2024!
668 阅读
5
优选 Cloudflare 官方 / 中转 IP
531 阅读
默认分类
服务器
宝塔
VPS
Docker
OpenWRT
Nginx
群晖
前端编程
Vue
React
Angular
NodeJS
uni-app
后端编程
Java
Python
SpringBoot
SpringCloud
流程引擎
检索引擎
Linux
CentOS
Ubuntu
Debian
数据库
Redis
MySQL
Oracle
虚拟机
VMware
VirtualBox
PVE
Hyper-V
计算机
网络技术
网站源码
主题模板
登录
Search
标签搜索
Java
小程序
Redis
SpringBoot
docker
Typecho
Cloudflare
docker部署
虚拟机
WordPress
群晖
uni-app
CentOS
Vue
Java类库
Linux命令
防火墙配置
Mysql
脚本
Nginx
微醺
累计撰写
265
篇文章
累计收到
11
条评论
首页
栏目
默认分类
服务器
宝塔
VPS
Docker
OpenWRT
Nginx
群晖
前端编程
Vue
React
Angular
NodeJS
uni-app
后端编程
Java
Python
SpringBoot
SpringCloud
流程引擎
检索引擎
Linux
CentOS
Ubuntu
Debian
数据库
Redis
MySQL
Oracle
虚拟机
VMware
VirtualBox
PVE
Hyper-V
计算机
网络技术
网站源码
主题模板
页面
留言
导航
统计
搜索到
265
篇与
的结果
2023-02-11
SpringBoot集成JWT实现token验证
JWT官网:https://jwt.io/ 什么是JWT Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).定义了一种简洁的,自包含的方法用于通信双方之间以JSON对象的形式安全的传递信息。因为数字签名的存在,这些信息是可信的,JWT可以使用HMAC算法或者是RSA的公私秘钥对进行签名。 JWT请求流程 1. 用户使用账号和面发出post请求; 2. 服务器使用私钥创建一个jwt; 3. 服务器返回这个jwt给浏览器; 4. 浏览器将该jwt串在请求头中像服务器发送请求; 5. 服务器验证该jwt; 6. 返回响应的资源给浏览器。 JWT的主要应用场景 身份认证在这种场景下,一旦用户完成了登陆,在接下来的每个请求中包含JWT,可以用来验证用户身份以及对路由,服务和资源的访问权限进行验证。由于它的开销非常小,可以轻松的在不同域名的系统中传递,所有目前在单点登录(SSO)中比较广泛的使用了该技术。 信息交换在通信的双方之间使用JWT对数据进行编码是一种非常安全的方式,由于它的信息是经过签名的,可以确保发送者发送的信息是没有经过伪造的。 优点 1.简洁(Compact): 可以通过URL,POST参数或者在HTTP header发送,因为数据量小,传输速度也很快 2.自包含(Self-contained):负载中包含了所有用户所需要的信息,避免了多次查询数据库 3.因为Token是以JSON加密的形式保存在客户端的,所以JWT是跨语言的,原则上任何web形式都支持。 4.不需要在服务端保存会话信息,特别适用于分布式微服务。 JWT的结构 JWT是由三段信息构成的,将这三段信息文本用.连接一起就构成了JWT字符串。 就像这样: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ JWT包含了三部分: Header 头部(标题包含了令牌的元数据,并且包含签名和/或加密算法的类型) Payload 负载 (类似于飞机上承载的物品) Signature 签名/签证 Header JWT的头部承载两部分信息:token类型和采用的加密算法。 { "alg": "HS256", "typ": "JWT" } 声明类型:这里是jwt 声明加密的算法:通常直接使用 HMAC SHA256 加密算法是单向函数散列算法,常见的有MD5、SHA、HAMC。 MD5(message-digest algorithm 5) (信息-摘要算法)缩写,广泛用于加密和解密技术,常用于文件校验。校验?不管文件多大,经过MD5后都能生成唯一的MD5值 SHA (Secure Hash Algorithm,安全散列算法),数字签名等密码学应用中重要的工具,安全性高于MD5 HMAC (Hash Message Authentication Code),散列消息鉴别码,基于密钥的Hash算法的认证协议。用公开函数和密钥产生一个固定长度的值作为认证标识,用这个标识鉴别消息的完整性。常用于接口签名验证 Payload 载荷就是存放有效信息的地方。 有效信息包含三个部分 1.标准中注册的声明 2.公共的声明 3.私有的声明 标准中注册的声明 (建议但不强制使用) : iss: jwt签发者 sub: 面向的用户(jwt所面向的用户) aud: 接收jwt的一方 exp: 过期时间戳(jwt的过期时间,这个过期时间必须要大于签发时间) nbf: 定义在什么时间之前,该jwt都是不可用的. iat: jwt的签发时间 jti: jwt的唯一身份标识,主要用来作为一次性token,从而回避重放攻击。 公共的声明 : 公共的声明可以添加任何的信息,一般添加用户的相关信息或其他业务需要的必要信息.但不建议添加敏感信息,因为该部分在客户端可解密. 私有的声明 : 私有声明是提供者和消费者所共同定义的声明,一般不建议存放敏感信息,因为base64是对称解密的,意味着该部分信息可以归类为明文信息。 Signature jwt的第三部分是一个签证信息 这个部分需要base64加密后的header和base64加密后的payload使用.连接组成的字符串,然后通过header中声明的加密方式进行加盐secret组合加密,然后就构成了jwt的第三部分。 密钥secret是保存在服务端的,服务端会根据这个密钥进行生成token和进行验证,所以需要保护好。 下面来进行SpringBoot和JWT的集成 引入JWT依赖,由于是基于Java,所以需要的是java-jwt <dependency> <groupId>com.auth0</groupId> <artifactId>java-jwt</artifactId> <version>3.4.0</version> </dependency> 需要自定义两个注解 用来跳过验证的PassToken @Target({ElementType.METHOD, ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) public @interface PassToken { boolean required() default true; } 需要登录才能进行操作的注解UserLoginToken @Target({ElementType.METHOD, ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) public @interface UserLoginToken { boolean required() default true; } @Target:注解的作用目标 @Target(ElementType.TYPE)——接口、类、枚举、注解 @Target(ElementType.FIELD)——字段、枚举的常量 @Target(ElementType.METHOD)——方法 @Target(ElementType.PARAMETER)——方法参数 @Target(ElementType.CONSTRUCTOR) ——构造函数 @Target(ElementType.LOCAL_VARIABLE)——局部变量 @Target(ElementType.ANNOTATION_TYPE)——注解 @Target(ElementType.PACKAGE)——包 @Retention:注解的保留位置 RetentionPolicy.SOURCE:这种类型的Annotations只在源代码级别保留,编译时就会被忽略,在class字节码文件中不包含。 RetentionPolicy.CLASS:这种类型的Annotations编译时被保留,默认的保留策略,在class文件中存在,但JVM将会忽略,运行时无法获得。 RetentionPolicy.RUNTIME:这种类型的Annotations将被JVM保留,所以他们能在运行时被JVM或其他使用反射机制的代码所读取和使用。 @Document:说明该注解将被包含在javadoc中 @Inherited:说明子类可以继承父类中的该注解 简单自定义一个实体类User,使用lombok简化实体类的编写 @Data @AllArgsConstructor @NoArgsConstructor public class User { String Id; String username; String password; } 需要写token的生成方法 public String getToken(User user) { String token=""; token= JWT.create().withAudience(user.getId()) .sign(Algorithm.HMAC256(user.getPassword())); return token; } Algorithm.HMAC256():使用HS256生成token,密钥则是用户的密码,唯一密钥的话可以保存在服务端。 withAudience()存入需要保存在token的信息,这里我把用户ID存入token中 接下来需要写一个拦截器去获取token并验证token public class AuthenticationInterceptor implements HandlerInterceptor { @Autowired UserService userService; @Override public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object object) throws Exception { String token = httpServletRequest.getHeader("token");// 从 http 请求头中取出 token // 如果不是映射到方法直接通过 if(!(object instanceof HandlerMethod)){ return true; } HandlerMethod handlerMethod=(HandlerMethod)object; Method method=handlerMethod.getMethod(); //检查是否有passtoken注释,有则跳过认证 if (method.isAnnotationPresent(PassToken.class)) { PassToken passToken = method.getAnnotation(PassToken.class); if (passToken.required()) { return true; } } //检查有没有需要用户权限的注解 if (method.isAnnotationPresent(UserLoginToken.class)) { UserLoginToken userLoginToken = method.getAnnotation(UserLoginToken.class); if (userLoginToken.required()) { // 执行认证 if (token == null) { throw new RuntimeException("无token,请重新登录"); } // 获取 token 中的 user id String userId; try { userId = JWT.decode(token).getAudience().get(0); } catch (JWTDecodeException j) { throw new RuntimeException("401"); } User user = userService.findUserById(userId); if (user == null) { throw new RuntimeException("用户不存在,请重新登录"); } // 验证 token JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256(user.getPassword())).build(); try { jwtVerifier.verify(token); } catch (JWTVerificationException e) { throw new RuntimeException("401"); } return true; } } return true; } @Override public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception { } @Override public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception { } 实现一个拦截器就需要实现HandlerInterceptor接口 HandlerInterceptor接口主要定义了三个方法 1.boolean preHandle (): 预处理回调方法,实现处理器的预处理,第三个参数为响应的处理器,自定义Controller,返回值为true表示继续流程(如调用下一个拦截器或处理器)或者接着执行 postHandle()和afterCompletion();false表示流程中断,不会继续调用其他的拦截器或处理器,中断执行。 2.void postHandle(): 后处理回调方法,实现处理器的后处理(DispatcherServlet进行视图返回渲染之前进行调用),此时我们可以通过modelAndView(模型和视图对象)对模型数据进行处理或对视图进行处理,modelAndView也可能为null。 3.void afterCompletion(): 整个请求处理完毕回调方法,该方法也是需要当前对应的Interceptor的preHandle()的返回值为true时才会执行,也就是在DispatcherServlet渲染了对应的视图之后执行。用于进行资源清理。整个请求处理完毕回调方法。如性能监控中我们可以在此记录结束时间并输出消耗时间,还可以进行一些资源清理,类似于try-catch-finally中的finally,但仅调用处理器执行链中 主要流程: 1.从 http 请求头中取出 token, 2.判断是否映射到方法 3.检查是否有passtoken注释,有则跳过认证 4.检查有没有需要用户登录的注解,有则需要取出并验证 5.认证通过则可以访问,不通过会报相关错误信息 配置拦截器 在配置类上添加了注解@Configuration,标明了该类是一个配置类并且会将该类作为一个SpringBean添加到IOC容器内 @Configuration public class InterceptorConfig extends WebMvcConfigurerAdapter { @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(authenticationInterceptor()) .addPathPatterns("/**"); // 拦截所有请求,通过判断是否有 @LoginRequired 注解 决定是否需要登录 } @Bean public AuthenticationInterceptor authenticationInterceptor() { return new AuthenticationInterceptor(); } } WebMvcConfigurerAdapter该抽象类其实里面没有任何的方法实现,只是空实现了接口 WebMvcConfigurer内的全部方法,并没有给出任何的业务逻辑处理,这一点设计恰到好处的让我们不必去实现那些我们不用的方法,都交由WebMvcConfigurerAdapter抽象类空实现,如果我们需要针对具体的某一个方法做出逻辑处理,仅仅需要在 WebMvcConfigurerAdapter子类中@Override对应方法就可以了。 注: 在SpringBoot2.0及Spring 5.0中WebMvcConfigurerAdapter已被废弃 网上有说改为继承WebMvcConfigurationSupport,不过试了下,还是过期的 解决方法: 直接实现WebMvcConfigurer (官方推荐) @Configuration public class InterceptorConfig implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(authenticationInterceptor()) .addPathPatterns("/**"); } @Bean public AuthenticationInterceptor authenticationInterceptor() { return new AuthenticationInterceptor(); } } InterceptorRegistry内的addInterceptor需要一个实现HandlerInterceptor接口的拦截器实例,addPathPatterns方法用于设置拦截器的过滤路径规则。 这里我拦截所有请求,通过判断是否有@LoginRequired注解 决定是否需要登录 在数据访问接口中加入登录操作注解 @RestController @RequestMapping("api") public class UserApi { @Autowired UserService userService; @Autowired TokenService tokenService; //登录 @PostMapping("/login") public Object login(@RequestBody User user){ JSONObject jsonObject=new JSONObject(); User userForBase=userService.findByUsername(user); if(userForBase==null){ jsonObject.put("message","登录失败,用户不存在"); return jsonObject; }else { if (!userForBase.getPassword().equals(user.getPassword())){ jsonObject.put("message","登录失败,密码错误"); return jsonObject; }else { String token = tokenService.getToken(userForBase); jsonObject.put("token", token); jsonObject.put("user", userForBase); return jsonObject; } } } @UserLoginToken @GetMapping("/getMessage") public String getMessage(){ return "你已通过验证"; } } 不加注解的话默认不验证,登录接口一般是不验证的。在getMessage()中我加上了登录注解,说明该接口必须登录获取token后,在请求头中加上token并通过验证才可以访问 下面进行测试,启动项目,使用postman测试接口 在没token的情况下访问api/getMessage接口 我这里使用了统一异常处理,所以只看到错误message 下面进行登录,从而获取token 登录操作我没加验证注解,所以可以直接访问 把token加在请求头中,再次访问api/getMessage接口 注意:这里的key一定不能错,因为在拦截器中是取关键字token的值 String token = httpServletRequest.getHeader("token"); 加上token之后就可以顺利通过验证和进行接口访问了
2023年02月11日
174 阅读
1 评论
0 点赞
2023-02-11
uni-app中的版本更新
主要是拿本地的版本号和后端返回的版本号做对比(在每次修改完代码以后,要打个更新包或者整包给后端喔) <template> <view> <sxPopup ref="appUpdate" @closeMaks="closeMaks"> <view class="update-main"> <image src="/static/images/update_close.png" class="update-close" @tap="hide"></image> <view class="update-content"> 最新安装包已准备就绪恭请主人体验尝 </view> <view class="update-btn btn-solid" @tap="updateApp"> 立即体验 </view> </view> </sxPopup> </view> </template> 在data中定义 version:"", // 当前版本 serverVersion:"", // 服务器版本 clientType:'', // 客户端类型 updateInfo:{}, // 更新信息 curDownSize:0, // 当前下载大小 在props中 autoChangeUpdate:{ // 是否自动检测更新 type:Boolean, default:false } mounted() { _this = this; this.changeUpdate() }, 在methods中 show(){ //显示更新弹窗 this.$refs.appUpdate.open() }, hide(){ //隐藏更新弹窗 uni.showTabBar(); this.$refs.appUpdate.close() }, changeUpdate(){ // 检测更新 //如果父组件选择自动更新 if(this.autoChangeUpdate){ this.getServerVersion() } }, isUpdate(curVersion,serVersion){ // 判断是否需要更新 let [serArray,curArray] = [serVersion.split("."),curVersion.split(".")] if(parseInt(serArray[0]) > parseInt(curArray[0])){ return true }else if(parseInt(serArray[1]) > parseInt(curArray[1])){ return true }else if(parseInt(serArray[1]) >= parseInt(curArray[1]) && parseInt(serArray[2]) > parseInt(curArray[2])){ return true }else{ return false } }, computedVersion(version){ // 计算版本 let array = version.split("."); let sum = 0; sum += array[0]*10 sum += array[1]+array[2] return sum; }, getServerVersion(){ // 获取服务器版本 if(!this.autoChangeUpdate){ uni.showLoading({ title:"检测更新" }) } this.$ajax("index/apiUpdateVersion",{}).then(res=>{ uni.hideLoading() if(res.code == 200){ this.updateInfo = res.data plus.runtime.getProperty(plus.runtime.appid, function(wgtinfo) { // 获取当前app版本 _this.version = wgtinfo.version; console.log(uni.getSystemInfoSync().platform) // 判断手机类型 switch (uni.getSystemInfoSync().platform) { case 'android': if (_this.isUpdate(_this.version,res.data.android_version)) { _this.serverVersion = res.data.android_version; _this.clientType = 'android' _this.show() uni.hideTabBar(); }else{ if(!_this.autoChangeUpdate){ _this.$toast("当前已是最新版本") } } break; case 'ios': if (_this.isUpdate(_this.version,res.data.ios_version)) { _this.serverVersion = res.data.ios_version; _this.clientType = 'ios' _this.show() uni.hideTabBar(); }else{ if(!_this.autoChangeUpdate){ _this.$toast("当前已是最新版本") } } break; } // _this.$emit('isUpdata',false) }); }else{ this.$toast(res.data.msg) } }) }, updateApp(){ // 更新app let version = this.version.split('.'); let updateVersion = this.serverVersion.split('.'); this.hide() // 大更新 if (parseInt(updateVersion[0]) > parseInt(version[0])) { if(_this.clientType == 'android'){ console.log(_this.clientType) console.log(this.updateInfo.android_url) this.downApp(this.updateInfo.android_url,'bigUpdate'); }else{ plus.runtime.openURL(this.updateInfo.ios_url) } } else if (parseInt(updateVersion.join('.').replace(/\./g, '')) > parseInt(version.join('.').replace(/\./g, ''))) { //小更新 // 热更新 this.downApp(this.updateInfo.hot_update,'thermalRenewal'); } }, downApp(url,updateType){ // 文件大小 let fileSize = ''; if(updateType == 'bigUpdate'){ fileSize = this.updateInfo.android_url_file_size; }else{ fileSize = this.updateInfo.hot_update_file_size; } fileSize = parseFloat(fileSize) * 1024 * 1024 console.log(fileSize) let waiting = plus.nativeUI.showWaiting('下载中...'); // 创建下载任务 let dtask = plus.downloader.createDownload(url,{ filename: '_doc/update/' // 文件下载保存路径 },function(d, status) { console.log(status,5555) if (status == 200) { console.log(status,'.............') waiting.setTitle('安装中...'); // 下载成功 plus.runtime.install(d.filename, {}, function() { plus.nativeUI.closeWaiting(); plus.nativeUI.alert('更新完成!', function() { uni.showTabBar(); // 清除所有下载的包 plus.downloader.clear(-1); // 热更新自动安装 if(updateType == 'thermalRenewal'){ plus.runtime.restart(); } }); }, function(e) { plus.nativeUI.closeWaiting(); plus.nativeUI.alert('安装失败[' + e.code + ']:' + e.message); }); } else { //下载失败 plus.nativeUI.alert('下载失败!'); setTimeout(()=>{ plus.nativeUI.closeWaiting(); },1000) if(updateType == 'bigUpdate'){ plus.runtime.openURL(url) //打开网页手动下载 } } }) // 监听下载状态 // dtask.addEventListener("statechanged", function(download, status) { // // console.log(`监听:下载状态${status}`) // if (status == 200) { // let i = download.downloadedSize // i *= 100 / fileSize; // console.log(`监听:下载大小${i}`) // if(!isNaN(i)){ // i = parseInt(i) // waiting.setTitle('已下载 ' + i + "%"); // // waiting.setTitle(i); // } // }else if(status == 404){ // plus.nativeUI.closeWaiting(); // plus.runtime.toast("下载地址错误") // } // }, true); dtask.start(); }
2023年02月11日
63 阅读
0 评论
0 点赞
2023-02-11
Activiti工作流引擎数据库表结构
文档适用于 Activiti 5—6 Activiti 工作流总共包含 23 张数据表(现在是25张,新增了 ACT_EVT_LOG 和 ACT_PROCDEF_INFO ) 一、结构设计 1、逻辑结构设计 Activiti使用到的表都是ACT_开头的。 表开头说明ACT_RE_*’RE’表示repository(存储),RepositoryService接口所操作的表。带此前缀的表包含的是静态信息,如,流程定义,流程的资源(图片,规则等)ACT_RU_*‘RU’表示runtime,运行时表-RuntimeService。这是运行时的表 存储着流程变量,用户任务,变量,职责(job)等运行时的数据。Activiti只存储实例执行期间的运行时数据,当流程实例结束时,将删除这些记录。 这就保证了这些运行时的表小且快ACT_ID_*’ID’表示identity (组织机构),IdentityService接口所操作的表。用户记录,流程中使用到的用户和组。这些表包含标识的信息,如用户,用户组,等等ACT_HI_*’HI’表示history,历史数据表,HistoryService。就是这些表包含着流程执行的历史相关数据,如结束的流程实例,变量,任务,等等ACT_GE_*全局通用数据及设置(general),各种情况都使用的数据 2、所有表的含义 一般数据 (ACT_GE_) 表名解释ACT_GE_BYTEARRAY二进制数据表,存储通用的流程定义和流程资源。ACT_GE_PROPERTY系统相关属性,属性数据表存储整个流程引擎级别的数据,初始化表结构时,会默认插入三条记录。 流程历史记录 (ACT_HI_) 表名解释ACT_HI_ACTINST历史节点表ACT_HI_ATTACHMENT历史附件表ACT_HI_COMMENT历史意见表ACT_HI_DETAIL历史详情表,提供历史变量的查询ACT_HI_IDENTITYLINK历史流程人员表ACT_HI_PROCINST历史流程实例表ACT_HI_TASKINST历史任务实例表ACT_HI_VARINST历史变量表 用户用户组表 (ACT_ID_) 表名解释ACT_ID_GROUP用户组信息表ACT_ID_INFO用户扩展信息表ACT_ID_MEMBERSHIP用户与用户组对应信息表ACT_ID_USER用户信息表 流程定义表 (ACT_RE_) 表名解释ACT_RE_DEPLOYMENT部署信息表ACT_RE_MODEL流程设计模型部署表ACT_RE_PROCDEF流程定义数据表 运行实例表 (ACT_RU_) 表名解释ACT_RU_EVENT_SUBSCR运行时事件 throwEvent、catchEvent 时间监听信息表ACT_RU_EXECUTION运行时流程执行实例ACT_RU_IDENTITYLINK运行时流程人员表,主要存储任务节点与参与者的相关信息ACT_RU_JOB运行时定时任务数据表ACT_RU_TASK运行时任务节点表ACT_RU_VARIABLE运行时流程变量数据表 其它 表名解释ACT_EVT_LOG事件日志ACT_PROCDEF_INFO流程定义的动态变更信息 二、表以及索引信息 1、act_ge_bytearray 二进制数据表,存储通用的流程定义和流程资源。(act_ge_bytearray) 保存流程定义图片和xml、Serializable(序列化)的变量,即保存所有二进制数据,特别注意类路径部署时候,不要把svn等隐藏文件或者其他与流程无关的文件也一起部署到该表中,会造成一些错误(可能导致流程定义无法删除)。 表结构说明 字段名称字段描述数据类型主键为空取值说明ID_ID_nvarchar(64)Y主键IDREV_乐观锁intYVersion(版本)NAME_名称nvarchar(255)Y部署的文件名称,如:leave.bpmn.png,leave.bpmn20.xmlDEPLOYMENT_ID_部署IDnvarchar(64)Y部署表IDBYTES_字节varbinary(max)Y部署文件GENERATED_是否是引擎生成tinyintY0为用户生成,1为activiti生成 索引说明 2、act_ge_property 属性数据表(act_ge_property) 属性数据表。存储整个流程引擎级别的数据。 表结构说明 字段名称字段描述数据类型主键为空取值说明NAME_名称nvarchar(64)√schema.versionschema.historynext.dbidVALUE_值nvarchar(300)√5.create(5.)REV_乐观锁int√version 索引说明 3、act_hi_actinst 历史节点表(act_hi_actinst) 历史活动信息。这里记录流程流转过的所有节点,与HI_TASKINST不同的是,taskinst只记录usertask内容 表结构说明 字段名称字段描述数据类型主键为空取值说明ID_ID_nvarchar(64)√PROC_DEF_ID_流程定义IDnvarchar(64)PROC_INST_ID_流程实例IDnvarchar(64)EXECUTION_ID_执行实例IDnvarchar(64)ACT_ID_节点IDnvarchar(225)节点定义IDTASK_ID_任务实例IDnvarchar(64)√任务实例ID 其他节点类型实例ID在这里为空CALL_PROC_INST_ID_调用外部的流程实例IDnvarchar(64)√调用外部流程的流程实例ID’ACT_NAME_节点名称nvarchar(225)√节点定义名称ACT_TYPE_节点类型nvarchar(225)如startEvent、userTaskASSIGNEE_签收人nvarchar(64)√节点签收人START_TIME_开始时间datetime2013-09-15 11:30:00END_TIME_结束时间datetime√2013-09-15 11:30:00DURATION_耗时numeric(19,0)√毫秒值 索引说明 4、act_hi_attachment 历史附件表( act_hi_attachment ) 表结构说明 字段名称字段描述数据类型主键为空取值说明ID_ID_nvarchar(64)√主键IDREV_乐观锁integer√VersionUSER_ID_用户IDnvarchar(255)√用户IDNAME_名称nvarchar(255)√附件名称DESCRIPTION_描述nvarchar(4000)√描述TYPE_类型nvarchar(255)√附件类型TASK_ID_任务实例IDnvarchar(64)√节点实例IDPROC_INST_ID_流程实例IDnvarchar(64)√流程实例IDURL_URL_nvarchar(4000)√附件地址CONTENT_ID_字节表的IDnvarchar(64)√ACT_GE_BYTEARRAY的ID 索引说明 5、act_hi_comment 历史意见表( act_hi_comment ) 表结构说明 字段名称字段描述数据类型主键为空取值说明ID_ID_nvarchar(64)√主键IDTYPE_类型nvarchar(255)√类型:event(事件)comment(意见)TIME_时间datetime填写时间’USER_ID_用户IDnvarchar(64)√填写人TASK_ID_节点任务IDnvarchar(64)√节点实例IDPROC_INST_ID_流程实例IDnvarchar(255)√流程实例IDACTION_行为类型nvarchar(64)√见备注1MESSAGE_基本内容nvarchar(4000)√用于存放流程产生的信息,比如审批意见FULL_MSG_全部内容varbinary(max)√附件地址 索引说明 6、act_hi_detail 历史详情表( act_hi_detail ) 流程中产生的变量详细,包括控制流程流转的变量,业务表单中填写的流程需要用到的变量等。 表结构说明 字段名称字段描述数据类型主键为空取值说明ID_ID_nvarchar(64)√主键TYPE_类型nvarchar(255)见备注2PROC_INST_ID_流程实例IDnvarchar(64)√流程实例IDEXECUTION_ID_执行实例IDnvarchar(64)√执行实例IDTASK_ID_任务实例IDnvarchar(64)√任务实例IDACT_INST_ID_节点实例IDnvarchar(64)√ACT_HI_ACTINST表的IDNAME_名称nvarchar(255)名称VAR_TYPE_参数类型nvarchar(255)√见备注3REV_乐观锁int√VersionTIME_时间戳datetime创建时间BYTEARRAY_ID_字节表IDnvarchar√ACT_GE_BYTEARRAY表的IDDOUBLE_DOUBLE_double precision√存储变量类型为DoubleLONG_LONG_numeric√存储变量类型为longTEXT_TEXT_nvarchar√存储变量值类型为StringTEXT2_TEXT2_nvarchar√此处存储的是JPA持久化对象时,才会有值。此值为对象ID 索引说明 7、act_ru_identitylink 历史流程人员表( act_ru_identitylink ) 任务参与者数据表。主要存储历史节点参与者的信息 表结构说明 字段名称字段描述数据类型主键为空取值说明ID_ID_nvarchar(64)√ID_GROUP_ID_组IDnvarchar(255)√组IDTYPE_类型nvarchar(255)√备注4USER_ID_用户IDnvarchar(255)√用户IDTASK_ID_节点实例IDnvarchar(64)√节点实例IDPROC_INST_ID_流程实例IDnvarchar(64)√流程实例ID 索引说明 8、act_hi_procinst 历史流程实例表(act_hi_procinst) 表结构说明 字段名称字段描述数据类型主键为空取值说明ID_ID_nvarchar(64)√主键IDPROC_INST_ID_流程实例IDnvarchar(64)流程实例IDBUSINESS_KEY_业务主键nvarchar(255)√业务主键,业务表单的IDPROC_DEF_ID_流程定义IDnvarchar(64)流程定义IDSTART_TIME_开始时间datetime开始时间END_TIME_结束时间datetime√结束时间DURATION_耗时Numeric(19)√耗时START_USER_ID_起草人nvarchar(255)√起草人START_ACT_ID_开始节点IDnvarchar(255)√起草环节IDEND_ACT_ID_结束节点IDnvarchar(255)√结束环节IDSUPER_PROCESS_INSTANCE_ID_父流程实例IDnvarchar(64)√父流程实例IDDELETE_REASON_删除原因nvarchar(4000)√删除原因 索引说明 9、act_hi_taskinst 历史任务实例表( act_hi_taskinst ) 表结构说明 字段名称字段描述数据类型主键为空取值说明ID_ID_nvarchar(64)√主键IDPROC_DEF_ID_流程定义IDnvarchar(64)√流程定义IDTASK_DEF_KEY_节点定义IDnvarchar(255)√节点定义IDPROC_INST_ID_流程实例IDnvarchar(64)√流程实例IDEXECUTION_ID_执行实例IDnvarchar(64)√执行实例IDNAME_名称varchar(255)√名称PARENT_TASK_ID_父节点实例IDnvarchar(64)√父节点实例IDDESCRIPTION_描述nvarchar(400)√描述OWNER_实际签收人 任务的拥有者nvarchar(255)√签收人(默认为空,只有在委托时才有值)ASSIGNEE_签收人或被委托nvarchar(255)√签收人或被委托START_TIME_开始时间datetime开始时间CLAIM_TIME_提醒时间datetime√提醒时间END_TIME_结束时间datetime√结束时间DURATION_耗时numeric(19)√耗时DELETE_REASON_删除原因nvarchar(4000)√删除原因(completed,deleted)PRIORITY_优先级别int√优先级别DUE_DATE_过期时间datetime√过期时间,表明任务应在多长时间内完成FORM_KEY_节点定义的formkeynvarchar(255)√desinger节点定义的form_key属性 索引说明 10、act_hi_varinst 历史变量表( act_hi_varinst ) 表结构说明 字段名称字段描述数据类型主键为空取值说明ID_ID_nvarchar(64)√ID_PROC_INST_ID_流程实例IDnvarchar(64)√流程实例IDEXECUTION_ID_执行实例IDnvarchar(255)√执行实例IDTASK_ID_任务实例IDnvarchar(64)√任务实例IDNAME_名称nvarchar(64)参数名称(英文)VAR_TYPE_参数类型varchar(255)√备注5REV_乐观锁nvarchar(64)√乐观锁 VersionBYTEARRAY_ID_字节表IDnvarchar(400)√ACT_GE_BYTEARRAY表的主键DOUBLE_DOUBLE_nvarchar(255)√存储DoubleType类型的数据LONG_LONG_nvarchar(255)√存储LongType类型的数据TEXT_TEXT_datetime√备注6TEXT2_TEXT2_datetime√此处存储的是JPA持久化对象时,才会有值。此值为对象ID 索引说明 11、act_id_group 用户组信息表( act_id_group ) 表结构说明 字段名称字段描述数据类型主键为空取值说明ID_ID_nvarchar(64)√主键IDREV_乐观锁int√乐观锁VersionNAME_名称nvarchar(255)√组名称TYPE_类型nvarchar(255)√类型 索引说明 12、act_id_info 用户扩展信息表( act_id_info ) 表结构说明 字段名称字段描述数据类型主键为空取值说明ID_ID_nvarchar(64)√主键IDREV_乐观锁int√乐观锁VersionUSER_ID_用户IDnvarchar(64)√TYPE_类型nvarchar(64)√KEY_nvarchar(255)√VALUE_nvarchar(255)√PASSWORD_Image√PARENT_ID_nvarchar(255)√ 索引说明 13、act_id_membership 用户与分组对应信息表( act_id_membership ) 用来保存用户的分组信息。 表结构说明 字段名称字段描述数据类型主键为空取值说明USER_ID用户IDnvarchar(64)√GROUP_ID用户组IDnvarchar(64)√ 索引说明 14、act_id_user 用户信息表( act_id_user ) 表结构说明 字段名称字段描述数据类型主键为空取值说明ID_ID_nvarchar(64)√主键IDREV_乐观锁int√乐观锁VersionFIRST_姓nvarchar(255)√LAST_名nvarchar(255)√EMAIL_EMAIL_nvarchar(255)√PWD_密码nvarchar(255)√PICTURE_ID_图片IDnvarchar(64)√ 索引说明 15、act_re_deployment 部署信息表( act_re_deployment ) 部署流程定义时需要被持久化保存下来的信息。 表结构说明 字段名称字段描述数据类型主键为空取值说明ID_ID_nvarchar(64)√主键IDNAME_部署名称nvarchar(255)√部署文件名CATEGORY_分类nvarchar(255)√类别DEPLOY_TIME_部署时间datetime√部署时间 索引说明 16、act_re_model 流程设计模型部署表( act_re_model ) 流程设计器设计流程后,保存数据到该表。 表结构说明 字段名称字段描述数据类型主键为空取值说明ID_ID_nvarchar(64)√ID_REV_乐观锁int√乐观锁NAME_名称nvarchar(255)√名称KEY_KEY_nvarchar(255)√分类CATEGORY_分类nvarchar(255)√分类CREATE_TIME_创建时间datetime√创建时间LAST_UPDATE_TIME_最新修改时间datetime√最新修改时间VERSION_版本int√版本META_INFO_META_INFO_nvarchar(255)√以json格式保存流程定义的信息DEPLOYMENT_ID_部署IDnvarchar(255)√部署IDEDITOR_SOURCE_VALUE_ID_datetime√EDITOR_SOURCE_EXTRA_VALUE_ID_datetime√ 索引说明 17、act_re_procdef 流程定义数据表( act_re_procdef ) 业务流程定义数据表。此表和 ACT_RE_DEPLOYMENT 是多对一的关系,即,一个部署的bar包里可能包含多个流程定义文件,每个流程定义文件都会有一条记录在 ACT_REPROCDEF 表内,每个流程定义的数据,都会对于 ACT_GE_BYTEARRAY 表内的一个资源文件和 PNG 图片文件。和 ACT_GE_BYTEARRAY 的关联是通过程序用ACT_GE_BYTEARRAY.NAME 与 ACT_RE_PROCDEF.NAME 完成的,在数据库表结构中没有体现。 表结构说明 字段名称字段描述数据类型主键为空取值说明ID_ID_nvarchar(64)√ID_REV_乐观锁int√乐观锁CATEGORY_分类nvarchar(255)√流程定义的Namespace就是类别NAME_名称nvarchar(255)√名称KEY_定义的KEYnvarchar(255)流程定义IDVERSION_版本int版本DEPLOYMENT_ID_部署表IDnvarchar(64)√部署表IDRESOURCE_NAME_bpmn文件名称nvarchar(4000)√流程bpmn文件名称DGRM_RESOURCE_NAME_png图片名称nvarchar(4000)√流程图片名称DESCRIPTION_描述nvarchar(4000)√描述HAS_START_FORM_KEY_是否存在开始节点formKeytinyint√start节点是否存在formKey 0否 1是SUSPENSION_STATE_是否挂起tinyint√1 激活 2挂起 索引说明 18、act_ru_event_subscr 事件订阅表(act_ru_event_subscr) 事件订阅表。此表包含所有当前存在的事件订阅。它包括预期事件的类型,名称和配置,以及有关相应流程实例和执行的信息。 表结构说明 字段名称字段描述数据类型主键为空取值说明ID_事件IDnvarchar(64)√事件IDREV_版本int√乐观锁VersionEVENT_TYPE_事件类型nvarchar(255)事件类型EVENT_NAME_事件名称nvarchar(255)√事件名称EXECUTION_ID_执行实例IDnvarchar(64)√执行实例IDPROC_INST_ID_流程实例IDnvarchar(64)√流程实例IDACTIVITY_ID_活动实例IDnvarchar(64)√活动实例IDCONFIGURATION_配置nvarchar(255)√配置CREATED_是否创建datetime默认值 当前系统时间戳CURRENT_TIMESTAMP 索引说明 19、act_ru_execution 运行时流程执行实例表( act_ru_execution ) 表结构说明 字段名称字段描述数据类型主键为空取值说明ID_ID_nvarchar(64)√ID_REV_乐观锁int√乐观锁PROC_INST_ID_流程实例IDnvarchar(64)流程实例IDBUSINESS_KEY_业务主键IDnvarchar(255)√业务主键IDPARENT_ID_父节点实例IDnvarchar(64)√父节点实例IDPROC_DEF_ID_流程定义IDnvarchar(64)√流程定义IDSUPER_EXEC_SUPER_EXEC_nvarchar(64)√SUPER_EXEC_ACT_ID_节点实例IDnvarchar(255)√节点实例ID即ACT_HI_ACTINST中IDIS_ACTIVE_是否存活tinyint√是否存活IS_CONCURRENT_是否并行tinyint√是否为并行(true/false)IS_SCOPE_IS_SCOPE_tinyint√IS_SCOPE_IS_EVENT_SCOPE_IS_EVENT_SCOPE_tinyint√IS_EVENT_SCOPE_SUSPENSION_STATE_是否挂起tinyint√挂起状态 1激活 2挂起CACHED_ENT_STATE_int√ 索引说明 20、act_ru_identitylink 运行时流程人员表( act_ru_identitylink ) 任务参与者数据表。主要存储当前节点参与者的信息。 表结构说明 字段名称字段描述数据类型主键为空取值说明ID_ID_nvarchar(64)√ID_REV_乐观锁int√乐观锁GROUP_ID_组IDnvarchar(64)√组IDTYPE_类型nvarchar(255)√备注7USER_ID_用户IDnvarchar(64)√用户IDTASK_ID_节点实例IDnvarchar(64)√节点实例IDPROC_INST_ID_流程实例IDnvarchar(64)√流程实例IDPROC_DEF_ID_流程定义IDnvarchar(255)√流程定义ID 索引说明 21、act_ru_job 运行时定时任务数据表( act_ru_job ) 表结构说明 字段名称字段描述数据类型主键为空取值说明ID_标识nvarchar(64)√标识REV_版本int√版本TYPE_类型nvarchar(255)类型LOCK_EXP_TIME_锁定释放时间datetime√锁定释放时间LOCK_OWNER_挂起者nvarchar(255)√挂起者EXCLUSIVE_bit√EXECUTION_ID_执行实例IDnvarchar(64)√执行实例IDPROCESS_INSTANCE_ID_流程实例IDnvarchar(64)√流程实例IDPROC_DEF_ID_流程定义IDnvarchar(64)√流程定义IDRETRIES_int√EXCEPTION_STACK_ID_异常信息IDnvarchar(64)√异常信息IDEXCEPTION_MSG_异常信息nvarchar(4000)√异常信息DUEDATE_到期时间datetime√到期时间REPEAT_重复nvarchar(255)√重复HANDLER_TYPE_处理类型nvarchar(255)√处理类型HANDLER_CFG_nvarchar(4000)√标识 索引说明 22、act_ru_task 运行时任务节点表( act_ru_task ) 表结构说明 字段名称字段描述数据类型主键为空取值说明ID_ID_nvarchar(64)√ID_REV_乐观锁int√乐观锁EXECUTION_ID_执行实例IDnvarchar(64)√执行实例IDPROC_INST_ID_流程实例IDnvarchar(64)√流程实例IDPROC_DEF_ID_流程定义IDnvarchar(64)√流程定义IDNAME_节点定义名称nvarchar(255)√节点定义名称PARENT_TASK_ID_父节点实例IDnvarchar(64)√父节点实例IDDESCRIPTION_节点定义描述nvarchar(4000)√节点定义描述TASK_DEF_KEY_节点定义的KEYnvarchar(255)√任务定义的IDOWNER_实际签收人nvarchar(255)√拥有者(一般情况下为空,只有在委托时才有值)ASSIGNEE_签收人或委托人nvarchar(255)√签收人或委托人DELEGATION_委托类型nvarchar(64)√备注8PRIORITY_优先级别int√优先级别,默认为:50CREATE_TIME_创建时间datetime√创建时间DUE_DATE_过期时间datetime√耗时SUSPENSION_STATE_是否挂起int√1代表激活 2代表挂起 索引说明 23、act_ru_variable 运行时流程变量数据表( act_ru_variable ) 表结构说明 字段名称字段描述数据类型主键为空取值说明ID_ID_nvarchar(64)√主键标识REV_乐观锁int√乐观锁TYPE_类型nvarchar(255)备注9NAME_名称nvarchar(255)变量名称EXECUTION_ID_执行实例IDnvarchar(64)√执行的IDPROC_INST_ID_流程实例IDnvarchar(64)√流程实例IDTASK_ID_节点实例IDnvarchar(64)√节点实例ID(Local)BYTEARRAY_ID_字节表IDnvarchar(64)√字节表的ID(ACT_GE_BYTEARRAY)DOUBLE_DOUBLE_float√存储变量类型为DoubleLONG_LONG_numeric(19)√存储变量类型为longTEXT_TEXT_nvarchar(4000)√‘存储变量值类型为String 如此处存储持久化对象时,值jpa对象的classTEXT2_TEXT2_nvarchar(4000)√此处存储的是JPA持久化对象时,才会有值。此值为对象ID 索引说明
2023年02月11日
49 阅读
0 评论
1 点赞
2023-02-10
Windows下搭建Redis集群的方法步骤
Windows下搭建Redis集群的方法步骤本文主要介绍了Windows下搭建Redis集群的方法步骤,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下目录Redis集群:在Windows系统下搭建Redis集群:1.下载并安装Redis2.下载并安装ruby3.创建Redis集群Redis集群:如果部署到多台电脑,就跟普通的集群一样;因为Redis是单线程处理的,多核CPU也只能使用一个核,所以部署在同一台电脑上,通过运行多个Redis实例组成集群,然后能提高CPU的利用率。在Windows系统下搭建Redis集群:需要4个部件:Redis、Ruby语言运行环境、Redis的Ruby驱动redis-xxxx.gem、创建Redis集群的工具redis-trib.rb安装Redis,并运行3个实例(Redis集群需要至少3个以上节点,低于3个无法创建);使用redis-trib.rb工具来创建Redis集群,由于该文件是用ruby语言写的,所以需要安装Ruby开发环境,以及驱动redis-xxxx.gem1.下载并安装Redis其GitHub路径如下:https://github.com/MSOpenTech/redis/releases/Redis提供msi和zip格式的下载文件,这里下载zip格式 3.0.504版本将下载到的Redis-x64-3.0.504.zip解压即可,为了方便使用,建议放在盘符根目录下,并修改目录名为Redis,如:C:\Redis 或者D:\Redis 通过配置文件来启动3个不同的Redis实例,由于Redis默认端口为6379,所以这里使用了6380、6381、6382来运行3个Redis实例。注意:为了避免不必要的错误,配置文件尽量保存为utf8格式,并且不要包含注释;配置文件中以下两种保存日志的方式(保存在文件中、保存到System Log中)请根据需求选择其中一种即可:loglevel notice #日志的记录级别,notice是适合生产环境的 logfile "D:/Redis/Logs/redis6380_log.txt" #指定log的保持路径,默认是创建在Redis安装目录下,如果有子目录需要手动创建,如此处的Logs目录 syslog-enabled yes #是否使用系统日志 syslog-ident redis6380 #在系统日志的标识名这里使用了保存在文件中的方式,所以先在Redis目录D:/Redis下新建Logs文件夹[/code]redis.6380.conf 内容如下:port 6380 loglevel notice logfile "D:/Redis/Logs/redis6380_log.txt" appendonly yes appendfilename "appendonly.6380.aof" cluster-enabled yes cluster-config-file nodes.6380.conf cluster-node-timeout 15000 cluster-slave-validity-factor 10 cluster-migration-barrier 1 cluster-require-full-coverage yesredis.6381.conf 内容如下:port 6381 loglevel notice logfile "D:/Redis/Logs/redis6381_log.txt" appendonly yes appendfilename "appendonly.6381.aof" cluster-enabled yes cluster-config-file nodes.6381.conf cluster-node-timeout 15000 cluster-slave-validity-factor 10 cluster-migration-barrier 1 cluster-require-full-coverage yesredis.6382.conf 内容如下:port 6382 loglevel notice logfile "D:/Redis/Logs/redis6382_log.txt" appendonly yes appendfilename "appendonly.6382.aof" cluster-enabled yes cluster-config-file nodes.6382.conf cluster-node-timeout 15000 cluster-slave-validity-factor 10 cluster-migration-barrier 1 cluster-require-full-coverage yes配置内容的解释如下:port 6380 #端口号 loglevel notice #日志的记录级别,notice是适合生产环境的 logfile "Logs/redis6380_log.txt" #指定log的保持路径,默认是创建在Redis安装目录下,如果有子目录需要手动创建,如此处的Logs目录 syslog-enabled yes #是否使用系统日志 syslog-ident redis6380 #在系统日志的标识名 appendonly yes #数据的保存为aof格式 appendfilename "appendonly.6380.aof" #数据保存文件 cluster-enabled yes #是否开启集群 cluster-config-file nodes.6380.conf cluster-node-timeout 15000 cluster-slave-validity-factor 10 cluster-migration-barrier 1 cluster-require-full-coverage yes将上述配置文件保存到Redis目录下,并使用这些配置文件安装3个redis服务,命令如下:注意:redis.6380.conf等配置文件最好使用完整路径,避免重启Redis集群出现问题,博主的安装目录为D:/RedisD:/Redis/redis-server.exe --service-install D:/Redis/redis.6380.conf --service-name redis6380 D:/Redis/redis-server.exe --service-install D:/Redis/redis.6381.conf --service-name redis6381 D:/Redis/redis-server.exe --service-install D:/Redis/redis.6382.conf --service-name redis6382启动这3个服务,命令如下:D:/Redis/redis-server.exe --service-start --service-name Redis6380 D:/Redis/redis-server.exe --service-start --service-name Redis6381 D:/Redis/redis-server.exe --service-start --service-name Redis6382执行结果:2.下载并安装ruby2.1. 下载路径如下:http://dl.bintray.com/oneclick/rubyinstaller/rubyinstaller-2.2.4-x64.exe下载后,双击安装即可,同样,为了操作方便,也是建议安装在盘符根目录下,如: C:\Ruby22-x64 ,安装时这里选中后两个选项,意思是将ruby添加到系统的环境变量中,在cmd命令中能直接使用ruby的命令2.2.下载ruby环境下Redis的驱动,考虑到兼容性,这里下载的是3.2.2版本https://rubygems.org/gems/redis/versions/3.2.2注意:下载在页面右下角相关连接一项中安装该驱动,命令如下:gem install --local path_to_gem/filename.gem实际操作如下:2.3.下载Redis官方提供的创建Redis集群的ruby脚本文件redis-trib.rb,路径如下:https://raw.githubusercontent.com/MSOpenTech/redis/3.0/src/redis-trib.rb打开该链接如果没有下载,而是打开一个页面,那么将该页面保存为redis-trib.rb建议保存到Redis的目录下。注意:因为redis-trib.rb是ruby代码,必须用ruby来打开,若redis-trib.rb无法识别,需要手动选择该文件的打开方式:**选择ruby为的打开方式后,redis-trib.rb的logo都会发生改变,如下图:3.创建Redis集群CMD下切换到Redis目录,使用redis-trib.rb来创建Redis集群:redis-trib.rb create --replicas 0 127.0.0.1:6380 127.0.0.1:6381 127.0.0.1:6382 执行结果:当出现提示时,需要手动输入yes,输入后,当出现以下内容,说明已经创建了Redis集群检验是否真的创建成功,输入以下命令:redis-trib.rb check 127.0.0.1:6380出现以下信息,说明创建的Redis集群是没问题的使用Redis客户端Redis-cli.exe来查看数据记录数,以及集群相关信息D:/Redis/redis-cli.exe -c -p 6380-c 表示 cluster-p 表示 port 端口号输入dbsize查询 记录总数dbsize或者一次输入完整命令:D:/Redis/redis-cli.exe -c -p 6380 dbsize结果如下:输入cluster info可以从客户端的查看集群的信息:cluster info结果如下: 到此这篇关于Windows下搭建Redis集群的方法步骤的文章就介绍到这了。
2023年02月10日
70 阅读
0 评论
0 点赞
2023-02-10
【宝塔运维】php7.4 安装 zip 扩展
【宝塔运维】php7.4 安装 zip 扩展在 CentOS 7 系统中,通过【宝塔 Linux】安装了 PHP7.4,运行业务系统时,报错:it is missing from your system. Install or enable PHP's zip extension.提示需要 php 的 zip 扩展,但是在后台面板中,又没有找到 zip 扩展,不然的话,可以直接点击安装:其实在 PHP 安装包下面,已经有了这个扩展,进入目录,直接安装:1、提前建立好常用的软链接:rm -rf /usr/local/bin/php rm -rf /usr/local/bin/phpize rm -rf /usr/local/bin/php-config rm -rf /usr/local/bin/composer ln -sf /www/server/php/74/bin/php /usr/local/bin/php ln -sf /www/server/php/74/bin/phpize /usr/local/bin/phpize ln -sf /www/server/php/74/bin/php-config /usr/local/bin/php-config ln -sf /www/server/php/74/bin/composer /usr/local/bin/composer2、进入 PHP 源码目录的 ext 文件夹,安装 zip 扩展cd /www/server/php/74/src/ext/zip ./configure报错:checking for zip archive read/write support... yes, shared checking for libzip >= 0.11... no configure: error: Package requirements (libzip >= 0.11) were not met: Requested 'libzip >= 0.11' but version of libzip is 0.10.1 Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables LIBZIP_CFLAGS and LIBZIP_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details.3、按照提示,升级 libzip\# 先删除原有的 libzipyum remove -y libzip\# 下载并手动编译安装, 自己下载到合适的位置wget https://nih.at/libzip/libzip-1.2.0.tar.gz\# 解压tar -zxvf libzip-1.2.0.tar.gz\# 进入到源码目录cd libzip-1.2.0\# 配置./configure\# 编译并安装make && make install\# 更新依赖路径,CentOS 版本小于 8 的,一定要执行下面这个命令,不然还是找不到 libzipexport PKG_CONFIG_PATH="/usr/local/lib/pkgconfig/"\# 重新编译 php zip 扩展cd /www/server/php/74/src/ext/zip ./configure make && make install编译正常\# 在 php.ini 中,配置扩展vim /www/server/php/74/etc/php.ini增加配置:extension=zip\# 重启 php-fpm(可以到 宝塔后台去重启)
2023年02月10日
63 阅读
0 评论
0 点赞
1
...
26
27