搜索词>>git-commit-id 耗时0.0100
  • Spring Boot 2.0 使用Maven git-commit-id插件

    Spring Boot 2.0 使用Maven git-commit-id插件Spring Boot 2.0 使用Maven git-commit-id插件
  • svn: E165001: Commit blocked by pre-commit hook

    Java编程中,svn提交代码报错svn: E165001: Commit blocked by pre-commit hook (exit code 1) with output:解决方法Java编程中,svn提交代码报错<br /> svn: E165001: Commit blocked by pre-commit hook (exit code 1) with output:<br /> <br /> 导致问题的原因<br /> comment内容太少<br /> <br /> <br /> 解决办法:comment内容多写点儿。就是提交svn的备注内容写多点儿就搞定。
  • Spring data-mongodb ID自增长注解实现

    Spring data-mongodb ID自增长注解实现,mongodb ID自增长<h2>1.创建一个文档。类似一个序列的作用</h2> <pre> <code class="language-java">package com.leftso.autoid; import org.springframework.data.annotation.Id; import org.springframework.data.mongodb.core.mapping.Document; import org.springframework.data.mongodb.core.mapping.Field; /** * 系统自增长表id存放表 * * @author xq * */ @Document(collection = "sys_sequence") public class SequenceId { @Id private String id; @Field("seq_id") private long seqId; @Field("coll_name") private String collName; public String getId() { return id; } public void setId(String id) { this.id = id; } public long getSeqId() { return seqId; } public void setSeqId(long seqId) { this.seqId = seqId; } public String getCollName() { return collName; } public void setCollName(String collName) { this.collName = collName; } } </code></pre> <h2>2.创建一个自定义注解用于处理需要自增长的ID</h2> <pre> <code class="language-java">package com.leftso.autoid; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** * 自定义自增长ID注解 * * @author xq * */ @Retention(RetentionPolicy.RUNTIME) @Target({ ElementType.FIELD }) public @interface AutoValue { } </code></pre> <h2><br /> 3.重写新增的监听事件</h2> <span style="color:#27ae60"><strong>注意:各大网站可能会有相似的代码。以下部分和spring data mongodb版本有关。下面代码中重写的public void onBeforeConvert(final Object source)方法在1.8版本开始就废弃了,不过官方推荐: Please use onBeforeConvert(BeforeConvertEvent),以下则为1.8以后版本的使用方法</strong></span> <pre> <code class="language-java">package com.leftso.autoid; import java.lang.reflect.Field; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.mongodb.core.FindAndModifyOptions; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.mapping.event.AbstractMongoEventListener; import org.springframework.data.mongodb.core.mapping.event.BeforeSaveEvent; import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.data.mongodb.core.query.Query; import org.springframework.data.mongodb.core.query.Update; import org.springframework.stereotype.Component; import org.springframework.util.ReflectionUtils; @Component public class SaveEventListener extends AbstractMongoEventListener<Object> { @Autowired private MongoTemplate mongo; @Override public void onBeforeSave(BeforeSaveEvent<Object> event) { Object source = event.getSource(); if (source != null) { ReflectionUtils.doWithFields(source.getClass(), new ReflectionUtils.FieldCallback() { public void doWith(Field field) throws IllegalArgumentException, IllegalAccessException { ReflectionUtils.makeAccessible(field); // 如果字段添加了我们自定义的AutoValue注解 if (field.isAnnotationPresent(AutoValue.class) && field.get(source) instanceof Number && field.getLong(source) == 0) { // field.get(source) instanceof Number && // field.getLong(source)==0 // 判断注解的字段是否为number类型且值是否等于0.如果大于0说明有ID不需要生成ID // 设置自增ID field.set(source, getNextId(source.getClass().getSimpleName())); } } }); } } /** * 获取下一个自增ID * * @param collName * 集合(这里用类名,就唯一性来说最好还是存放长类名)名称 * @return 序列值 */ private Long getNextId(String collName) { Query query = new Query(Criteria.where("coll_name").is(collName)); Update update = new Update(); update.inc("seq_id", 1); FindAndModifyOptions options = new FindAndModifyOptions(); options.upsert(true); options.returnNew(true); SequenceId seq = mongo.findAndModify(query, update, options, SequenceId.class); return seq.getSeqId(); } } </code></pre> <h2><br /> 4.使用自定义注解完成ID自增长的实现</h2> <pre> <code class="language-java">package com.leftso.entity; import org.springframework.data.annotation.Id; import org.springframework.data.mongodb.core.mapping.Document; import com.leftso.autoid.AutoValue; @Document public class Student { @AutoValue @Id private long id; private String name; public Student(String name) { super(); this.name = name; } public long getId() { return id; } public void setId(long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } } </code></pre> <br />  
  • Java编程中在高规模分布式环境中生成唯一的ID

    Java编程中在高规模分布式环境中生成唯一的IDJava编程中在高规模分布式环境中生成唯一的ID
  • window中使用tortoisegit(俗称小乌龟)提交代码到GitHub网站

    图文详解在window中如何使用tortoisegit(俗称小乌龟)提交代码到GitHub网站图文详解在window中如何使用tortoisegit(俗称小乌龟)提交代码到GitHub网站<br /> <br /> 1.下载git环境<br /> https://git-for-windows.github.io/<br /> 推荐使用下载工具下载,网页下载国内很慢<br /> <br /> 2.下载tortoisegit<br /> https://tortoisegit.org/<br /> 下载语言包(可选)<br /> <br /> 3.安装git环境<br /> 双击安装文件,一直下一步就ok<br /> <br /> 4.安装tortoisegit<br /> 双击安装文件,一直下一步就ok<br /> <br /> 5.配置tortoisegit<br /> 打开设置页面,如图1<br /> <img alt="图1" class="img-thumbnail" src="/resources/assist/images/blog/db071e1e-f272-4985-a90d-9ab6cb40687e.png" /><br /> 图1<br /> 如果下载了语言包,设置语言<br /> 点击General->右边有个Language选择中文即可,如下图2<br /> <img alt="​图2" class="img-thumbnail" src="/resources/assist/images/blog/fbd5aff5-0378-43b5-8aa3-c257519f3f34.png" /><br /> 图2<br /> <br /> 6.配置network<br /> 点击Network>SSH client,找到安装git的目录,下面有个sh.exe或者ssh.exe,如下图3<br /> <img alt="图3" class="img-thumbnail" src="/resources/assist/images/blog/3dbb21e5-fd4a-45fc-9f73-882698fa8a18.png" /><br /> 图3<br /> 7.配置Git<br /> Git->Config Source  -->Global<br /> Name---->输入你的名字随意的<br /> Email:输入你的邮箱,随意<br /> 如下图4<br /> <img alt="图4" class="img-thumbnail" src="/resources/assist/images/blog/abe2ff9e-75f7-4def-8994-0a132346f8a5.png" /><br /> 图4<br /> 8.去github网站登录账户创建一个项目<br /> GitHub创建项目,如图5<br /> <img alt="​图5" class="img-thumbnail" src="/resources/assist/images/blog/cac5ebb9-9d02-4cbd-843d-183799daa841.png" /><br /> 图5<br /> 9.将GitHub创建的项目拉下来<br /> 鼠标右键选择->Git克隆弹出克隆面板,如图7注意输入url地址<br /> <img alt="图7" class="img-thumbnail" src="/resources/assist/images/blog/ce769f78-35ff-4099-b583-80b1d05e0b99.png" /><br /> 图7<br /> 拉取完毕,如图8<br /> <img alt="​图8" class="img-thumbnail" src="/resources/assist/images/blog/1b39671c-f449-4170-b4d7-34eb15d3dfc5.png" /><br /> 图8<br /> <br /> 10.打开拉下来的项目创建一个简单文件README.MD,文件是一个文本改名来的,内容随意输入,如图9<br /> <img alt="图9" class="img-thumbnail" src="/resources/assist/images/blog/ce7a5c1c-2e76-4d92-9420-782ed2a4d3c7.png" /><br /> 图9<br /> <br /> 11.将新创建的文件加入版本管理,如图10<br /> <img alt="图10" class="img-thumbnail" src="/resources/assist/images/blog/f7025301-43a1-4682-b24b-1676fe73eb86.png" /><br /> 图10<br /> 选择需要加入版本管理的文件,默认工具会选择所有需要未添加的文件,如图11<br /> <img alt="图11" class="img-thumbnail" src="/resources/assist/images/blog/a6cb54cd-c08b-4f9b-9c5e-a3cfc19efc2e.png" /><br /> 图11<br /> 添加到管理成功,如图12<br /> <img alt="图12" class="img-thumbnail" src="/resources/assist/images/blog/4754efa0-f57d-4d19-b2a4-17158b6578c0.png" /><br /> 图12<br /> <br /> 12.注意图12中添加完成后有个提交,点击提交到版本管理,如图13<br /> <img alt="图13" class="img-thumbnail" src="/resources/assist/images/blog/94840f84-524b-4ad5-9116-a1211c01a421.png" /><br /> 图13<br /> 输入提交版本的日志,并选择提交模式,可以选择提交,或提交并推送,这里选择的提交,弹出推送的提示如图14<br /> <img alt="图14" class="img-thumbnail" src="/resources/assist/images/blog/ab1582c0-6065-48f6-91b5-01d1ca37daf7.png" /><br /> 图14<br /> 选择确定将开始推送,推送过程中会要求输入用户和密码,如图15<br /> <img alt="图15" class="img-thumbnail" src="/resources/assist/images/blog/4eff05ad-2294-4567-af35-e0e0e45ee6a0.png" /><br /> 图15<br /> 输入完成用户密码推送开始,推送完毕如图16:<br /> <img alt="图16" class="img-thumbnail" src="/resources/assist/images/blog/2ee5443a-1d86-4b1f-86fd-4fc819b742ef.png" /><br /> 图16<br /> <br /> 13.查看推送内容,如图提交并推送的内容已经在GitHub网站上咯。<br /> <img alt="图17" class="img-thumbnail" src="/resources/assist/images/blog/9bedc705-52c1-4646-91fc-c8745ff633db.png" /><br /> 图17<br />  
  • PowerDesigner教程 PowerDesigner设置MySQL自增长ID教程

    PowerDesigner配置MySQL数据库ID自增长教程PowerDesigner配置MySQL数据库ID自增长教程。PowerDesigner如何配置ID自增长?下面开始讲解1.确认当前选择的数据库(当然是选择MySQL啦)在PowerDesigner的菜单中选择database->Change Current DBMS...在打开的菜单中选择MySQL5.02.双击需要设置自增长ID的表头在打开的PowerDesigner表对话框中选择Cloumns这个tab页,也就是创建表字段的tab界面。点击Customize Cloumns and Filter,具体位置在哪里呢?看下面的图吧:​3.选中identity在步骤二弹出的PowerDesigner对话框中滚动下拉条找到identity并点击鼠标将其√上。如图:​勾上后点击ok按钮关闭对话框。4.Physical Options设置 在表的tab中找到Physical Options,点击切换该该tab界面。左边有一列的选择列表,找到auto_increment=(%d)点击选中并点击tab中间三个按钮中的 >>按钮将其放入右边的列表中。具体操作如图:​这里下面还可以设置自增长的启始值。5.设置字段的identity属性 表tab切换到columns tab,这时候会发现字段后面多了一个I的选择框,将鼠标放到I的顶部表头看到I代表的identity。这时候需要使用自增长的字段勾选I的选择框即可。如图:​6.PowerDesigner自增长sql预览 ​
  • zTree实现打开页面时异步加载数据及选中项ID提交到后台

    zTree实现打开页面时异步加载数据及选中项ID提交到后台1.页面 <pre> <code class="language-html"><!DOCTYPE html> <HTML> <HEAD> <TITLE> ZTREE DEMO </TITLE> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> <link rel="stylesheet" href="demoStyle/demo.css" type="text/css"> <link rel="stylesheet" href="zTreeStyle/zTreeStyle.css" type="text/css"> <script type="text/javascript" src="ztreeJs/jquery-1.4.4.min.js"></script> <script type="text/javascript" src="ztreeJs/jquery.ztree.all.min.js"></script> </HEAD> <BODY> <div style="margin-left: 5%"> <article class="page-container"> <div class="row cl"> <label class="form-label col-xs-3 col-sm-3"><span class="c-red">*</span>角色名称:</label> <div class="formControls col-xs-6 col-sm-6"> <input type="hidden" name="roleId" value="111" id="roleId"/> <input type="text" class="input-text" value="测试" id="roleName" name="roleName"> </div> </div> <div class="row cl"> <label class="form-label col-xs-3 col-sm-3">权限列表:</label> <div class="formControls col-xs-6 col-sm-6"> <!-- 权限代码 zTree--> <div class="content_wrap"> <div class="zTreeDemoBackground left"> <ul id="treeDemo" class="ztree"></ul> </div> </div> </div> </div> <div class="row cl"> <div class="col-xs-3 col-sm-3 col-xs-offset-3 col-sm-offset-3"> <button type="button" class="btn btn-success radius sbm""> <i class="icon-ok"></i> 确定 </button> <button type="button" class="btn btn-success radius reset"> <i class="icon-ok"></i> 取消 </button> </div> </div> </article> </div> </BODY> </HTML></code></pre> <br /> 2.js <pre> <code class="language-java">//假设我们做的是为某个角色设置菜单权限,并且新增和修改权限用的一个页面 $(function() { var roleId=$("#roleId").val(); onLoadZTree(roleId); }); var setting = { check : { enable : true }, data : { simpleData : { enable : true, idKey : "id", pIdKey : "pId", rootPId : "" } } }; var treeNodes; function onLoadZTree(roleId) { $.ajax({ type:'post',//请求方式:post dataType : 'json',//数据传输格式:json url:'/sysRoleMenu/menuTreeAjax',//获取角色菜单URL地址 data:{"sysRoleId":roleId}, async:false,//是否异步 cache : false,//是否使用缓存 error:function(errorMsg){ //请求失败处理函数 alert('亲,请求失败!'); }, success:function(data){ if(data.errCode == 'ok'){ treeNodes = data.data;//把后台封装好的简单Json格式赋给treeNodes }else{ alert('亲,初始化角色菜单失败'); } } }); //这里我们假设返回的数据是: var treeNodes =[ { id:1, pId:0, name:"父节点1", open:true, checked:true}, { id:11, pId:1, name:"父节点11", checked:true}, { id:111, pId:11, name:"叶子节点111", checked:true}, { id:112, pId:11, name:"叶子节点112", checked:true}, { id:113, pId:11, name:"叶子节点113", checked:true}, { id:114, pId:11, name:"叶子节点114", checked:true}, { id:12, pId:1, name:"父节点12"}, { id:121, pId:12, name:"叶子节点121"}, { id:122, pId:12, name:"叶子节点122"}, { id:123, pId:12, name:"叶子节点123"}, { id:124, pId:12, name:"叶子节点124"}, { id:13, pId:1, name:"父节点13", isParent:true}, { id:2, pId:0, name:"父节点2"}, { id:21, pId:2, name:"父节点21", open:true}, { id:211, pId:21, name:"叶子节点211"}, { id:212, pId:21, name:"叶子节点212"}, { id:213, pId:21, name:"叶子节点213"}, { id:214, pId:21, name:"叶子节点214"}, { id:22, pId:2, name:"父节点22"}, { id:221, pId:22, name:"叶子节点221"}, { id:222, pId:22, name:"叶子节点222"}, { id:223, pId:22, name:"叶子节点223"}, { id:224, pId:22, name:"叶子节点224"}, { id:23, pId:2, name:"父节点23"}, { id:231, pId:23, name:"叶子节点231"}, { id:232, pId:23, name:"叶子节点232"}, { id:233, pId:23, name:"叶子节点233"}, { id:234, pId:23, name:"叶子节点234"}, { id:3, pId:0, name:"父节点3", isParent:true} ]; var t = $("#treeDemo"); t = $.fn.zTree.init(t, setting, treeNodes) }; //组装被选中的菜单为jsonArray格式 function onCheck() { var roleId = $("#roleId").val(); var roleName = $("#roleName").val(); var treeObj = $.fn.zTree.getZTreeObj("treeDemo"); var nodes = treeObj.getCheckedNodes(true);//获取被选中的节点 var jsonArr = "["; for (var i = 0; i < nodes.length; i++) { jsonArr += "{"; jsonArr += "\"roleId\":\""+roleId+"\","; jsonArr += "\"roleName\":\""+roleName+"\","; jsonArr += "\"menuId\":\""+nodes[i].id+"\","; jsonArr += "\"menuName\":\""+nodes[i].name+"\""; jsonArr += "}" jsonArr += ',' } jsonArr = jsonArr.substring(0, jsonArr.length - 1); jsonArr += "]"; return jsonArr; }; $(function() { $(".sbm").click(function(){ var roleId= $("#roleId").val(); var sysRoleMenuStr = onCheck(); $.ajax({ type:'post',//请求方式:post dataType : 'json',//数据传输格式:json url:'/sysRoleMenu/createSysRoleMenu', data:{"sysRoleId":roleId,"sysRoleMenuStr":sysRoleMenuStr}, async:false,//是否异步 cache : false,//是否使用缓存 error:function(errorMsg){ alert("亲分配权限菜单成功"); //成功之后你需要做什么操作都在这里写 }, success:function(data){ if(data.errCode == 'ok'){ alert("亲分配权限菜单出错"); }else{ alert("亲分配权限菜单出错"); } } }); } }); }); </code></pre> 3.控制层 <pre> <code class="language-java">@Controller @RequestMapping(value = "/sysRoleMenu") public class SysRoleMenuController{ /** * 初始化菜单树列表 * * @param model * @param sysRoleId * @return */ @ResponseBody @RequestMapping("/menuTreeAjax") public BaseResult initMenuTreeList(Model model, String sysRoleId) { BaseResult baseResult = new BaseResult(); try { List<SysMenuTreeVo> MenuTreeList = sysRoleMenuService.getSysMenuTreeVo(sysRoleId); baseResult = new BaseResult(ResultCode.AJAX_OK, MenuTreeList, "数据加载成功"); } catch (Exception e) { baseResult = new BaseResult(ResultCode.AJAX_Err, "", e.getMessage()); return baseResult; } return baseResult; } /** * 创建角色菜单权限 * * @param model * @param sysRoleId * @param sysRoleMenuStr * @return */ @ResponseBody @RequestMapping("/createSysRoleMenu") public BaseResult createSysRoleMenu(Model model, String sysRoleId, String sysRoleMenuStr) { // 解析数据 List<SysRoleMenu> sysRoleMenuList = changeSysRoleMenuList(sysRoleMenuStr); BaseResult baseResult = new BaseResult(); try { sysRoleMenuService.createSysRoleMenu(sysRoleId, sysRoleMenuList);//这个方法我采用的是先删除角色下面的所有菜单权限,然后再执行的新增,这样新增修改就只用一个页面 baseResult = new BaseResult(ResultCode.AJAX_OK, "", "创建成功"); } catch (Exception e) { baseResult = new BaseResult(ResultCode.AJAX_Err, "", e.getMessage()); log.error("SysRoleMenuController类createSysRoleMenu方法,创建菜单权限出错!", e); return baseResult; } return baseResult; } /** * 解析菜单jsonArray数据 * * @param sysRoleMenuStr * @return * @throws LoadRecordException */ public List<SysRoleMenu> changeSysRoleMenuList(String sysRoleMenuStr) throws LoadRecordException { List<SysRoleMenu> sysRoleMenus = null; if (StringUtil.isBlank(sysRoleMenuStr)) { return sysRoleMenus; } try { sysRoleMenus = new ArrayList<SysRoleMenu>(); JSONArray jsonArray = JSON.parseArray(sysRoleMenuStr); for (Object object : jsonArray) { SysRoleMenu sysRoleMenu = new SysRoleMenu(); JSONObject jsonObject = JSON.parseObject(object.toString()); String roleId = jsonObject.getString("roleId"); String roleName = jsonObject.getString("roleName"); String menuId = jsonObject.getString("menuId"); String menuName = jsonObject.getString("menuName"); sysRoleMenu.setRoleId(roleId); sysRoleMenu.setRoleName(roleName); sysRoleMenu.setMenuId(menuId); sysRoleMenu.setMenuName(menuName); sysRoleMenus.add(sysRoleMenu); } } catch (Exception e) { log.error("解析菜单数据出错,class:SysRoleMenuController;method:changeProductSaleRegionList;exception:Exception", e); throw new LoadRecordException("解析菜单数据错误,请确定你的格式:" + e.getMessage(), e); } return sysRoleMenus; } }</code></pre> 4.前台需要的封装对象 <pre> <code class="language-java">public class SysMenuTreeVo { // 菜单主键ID private String id; // 上级菜单 private String pId; // 菜单名称 private String name; // 是否展开 private Boolean open = Boolean.FALSE; // 是否选中 private Boolean checked = Boolean.FALSE; public SysMenuTreeVo() { } public SysMenuTreeVo(SysMenu sysMenu, Boolean checked, Boolean open) { if (sysMenu != null) { this.id = sysMenu.getId(); if (StringUtil.isNotBlank(sysMenu.getParentId())) { this.pId = sysMenu.getParentId(); } else { this.pId = "0"; } this.name = sysMenu.getName(); } this.open = open; this.checked = checked; } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getpId() { return pId; } public void setpId(String pId) { this.pId = pId; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Boolean getOpen() { return open; } public void setOpen(Boolean open) { this.open = open; } public Boolean getChecked() { return checked; } public void setChecked(Boolean checked) { this.checked = checked; } @Override public String toString() { return "SysMenuTreeVo [id=" + id + ", pId=" + pId + ", name=" + name + ", open=" + open + ", checked=" + checked + "]"; }</code></pre> 5.页面展示效果<br /> <img alt="" class="img-thumbnail" src="/resources/assist/images/blog/8601236fd58f40269b72ca344c8008bd.png" /><br /> <br />  
  • redis 命令查看使用情况redis info命令详解_redis查看内存使用情况

    redis 命令查看使用情况redis info命令详解,redis查看内存使用情况。redis info命令的详细解释<p>通过redis-cli连接到redis服务</p> <pre> <code class="language-html">redis-cli -h 192.168.1.3 -p 6300 192.168.1.3:6300> 192.168.1.3:6300> auth pass 192.168.1.3:6300> info all</code></pre> <pre> <code class="language-bash"># Server(服务器信息) redis_version:3.0.0                              #redis服务器版本 redis_git_sha1:00000000                  #Git SHA1 redis_git_dirty:0                                    #Git dirty flag redis_build_id:6c2c390b97607ff0    #redis build id redis_mode:cluster                              #运行模式,单机或者集群 os:Linux 2.6.32-358.2.1.el6.x86_64 x86_64 #redis服务器的宿主操作系统 arch_bits:64                                         #架构(32或64位) multiplexing_api:epoll                        #redis所使用的事件处理机制 gcc_version:4.4.7                                #编译redis时所使用的gcc版本 process_id:12099                               #redis服务器进程的pid run_id:63bcd0e57adb695ff0bf873cf42d403ddbac1565  #redis服务器的随机标识符(用于sentinel和集群) tcp_port:9021                                #redis服务器监听端口 uptime_in_seconds:26157730   #redis服务器启动总时间,单位是秒 uptime_in_days:302                    #redis服务器启动总时间,单位是天 hz:10                                #redis内部调度(进行关闭timeout的客户端,删除过期key等等)频率,程序规定serverCron每秒运行10次。 lru_clock:14359959      #自增的时钟,用于LRU管理,该时钟100ms(hz=10,因此每1000ms/10=100ms执行一次定时任务)更新一次。 config_file:/redis_cluster/etc/9021.conf  #配置文件路径 # Clients(已连接客户端信息) connected_clients:1081       #已连接客户端的数量(不包括通过slave连接的客户端) client_longest_output_list:0 #当前连接的客户端当中,最长的输出列表,用client list命令观察omem字段最大值 client_biggest_input_buf:0   #当前连接的客户端当中,最大输入缓存,用client list命令观察qbuf和qbuf-free两个字段最大值 blocked_clients:0                   #正在等待阻塞命令(BLPOP、BRPOP、BRPOPLPUSH)的客户端的数量 # Memory(内存信息) used_memory:327494024                 #由redis分配器分配的内存总量,以字节为单位 used_memory_human:312.32M       #以人类可读的格式返回redis分配的内存总量 used_memory_rss:587247616         #从操作系统的角度,返回redis已分配的内存总量(俗称常驻集大小)。这个值和top命令的输出一致 used_memory_peak:1866541112    #redis的内存消耗峰值(以字节为单位)  used_memory_peak_human:1.74G #以人类可读的格式返回redis的内存消耗峰值 used_memory_lua:35840                   #lua引擎所使用的内存大小(以字节为单位) mem_fragmentation_ratio:1.79          #used_memory_rss和used_memory之间的比率,小于1表示使用了swap,大于1表示碎片比较多 mem_allocator:jemalloc-3.6.0            #在编译时指定的redis所使用的内存分配器。可以是libc、jemalloc或者tcmalloc # Persistence(rdb和aof的持久化相关信息) loading:0                                                    #服务器是否正在载入持久化文件 rdb_changes_since_last_save:28900855 #离最近一次成功生成rdb文件,写入命令的个数,即有多少个写入命令没有持久化 rdb_bgsave_in_progress:0                  #服务器是否正在创建rdb文件 rdb_last_save_time:1482358115        #离最近一次成功创建rdb文件的时间戳。当前时间戳 - rdb_last_save_time=多少秒未成功生成rdb文件 rdb_last_bgsave_status:ok                   #最近一次rdb持久化是否成功 rdb_last_bgsave_time_sec:2                #最近一次成功生成rdb文件耗时秒数 rdb_current_bgsave_time_sec:-1        #如果服务器正在创建rdb文件,那么这个域记录的就是当前的创建操作已经耗费的秒数 aof_enabled:1                                          #是否开启了aof aof_rewrite_in_progress:0                     #标识aof的rewrite操作是否在进行中 aof_rewrite_scheduled:0               #rewrite任务计划,当客户端发送bgrewriteaof指令,如果当前rewrite子进程正在执行,那么将客户端请求的bgrewriteaof变为计划任务,待aof子进程结束后执行rewrite  aof_last_rewrite_time_sec:-1            #最近一次aof rewrite耗费的时长 aof_current_rewrite_time_sec:-1      #如果rewrite操作正在进行,则记录所使用的时间,单位秒 aof_last_bgrewrite_status:ok             #上次bgrewriteaof操作的状态 aof_last_write_status:ok                     #上次aof写入状态 aof_current_size:4201740                 #aof当前尺寸 aof_base_size:4201687                    #服务器启动时或者aof重写最近一次执行之后aof文件的大小 aof_pending_rewrite:0                       #是否有aof重写操作在等待rdb文件创建完毕之后执行? aof_buffer_length:0                             #aof buffer的大小 aof_rewrite_buffer_length:0              #aof rewrite buffer的大小 aof_pending_bio_fsync:0                  #后台I/O队列里面,等待执行的fsync调用数量 aof_delayed_fsync:0                          #被延迟的fsync调用数量 # Stats(一般统计信息) total_connections_received:209561105 #新创建连接个数,如果新创建连接过多,过度地创建和销毁连接对性能有影响,说明短连接严重或连接池使用有问题,需调研代码的连接设置 total_commands_processed:2220123478  #redis处理的命令数 instantaneous_ops_per_sec:279                  #redis当前的qps,redis内部较实时的每秒执行的命令数 total_net_input_bytes:118515678789          #redis网络入口流量字节数 total_net_output_bytes:236361651271       #redis网络出口流量字节数 instantaneous_input_kbps:13.56                  #redis网络入口kps instantaneous_output_kbps:31.33               #redis网络出口kps rejected_connections:0                                   #拒绝的连接个数,redis连接个数达到maxclients限制,拒绝新连接的个数 sync_full:1                                                          #主从完全同步成功次数 sync_partial_ok:0                                             #主从部分同步成功次数 sync_partial_err:0                                            #主从部分同步失败次数 expired_keys:15598177                                #运行以来过期的key的数量 evicted_keys:0                                                 #运行以来剔除(超过了maxmemory后)的key的数量 keyspace_hits:1122202228                          #命中次数 keyspace_misses:577781396                     #没命中次数 pubsub_channels:0                                       #当前使用中的频道数量 pubsub_patterns:0                                         #当前使用的模式的数量 latest_fork_usec:15679                                 #最近一次fork操作阻塞redis进程的耗时数,单位微秒 migrate_cached_sockets:0                          # # Replication(主从信息,master上显示的信息) role:master                               #实例的角色,是master or slave connected_slaves:1              #连接的slave实例个数 slave0:ip=192.168.64.104,port=9021,state=online,offset=6713173004,lag=0 #lag从库多少秒未向主库发送REPLCONF命令 master_repl_offset:6713173145  #主从同步偏移量,此值如果和上面的offset相同说明主从一致没延迟 repl_backlog_active:1                   #复制积压缓冲区是否开启 repl_backlog_size:134217728    #复制积压缓冲大小 repl_backlog_first_byte_offset:6578955418  #复制缓冲区里偏移量的大小 repl_backlog_histlen:134217728   #此值等于 master_repl_offset - repl_backlog_first_byte_offset,该值不会超过repl_backlog_size的大小 # Replication(主从信息,slave上显示的信息) role:slave                                        #实例的角色,是master or slave master_host:192.168.64.102       #此节点对应的master的ip master_port:9021                          #此节点对应的master的port master_link_status:up                   #slave端可查看它与master之间同步状态,当复制断开后表示down master_last_io_seconds_ago:0  #主库多少秒未发送数据到从库? master_sync_in_progress:0        #从服务器是否在与主服务器进行同步 slave_repl_offset:6713173818   #slave复制偏移量 slave_priority:100                          #slave优先级 slave_read_only:1                         #从库是否设置只读 connected_slaves:0                      #连接的slave实例个数 master_repl_offset:0          repl_backlog_active:0                  #复制积压缓冲区是否开启 repl_backlog_size:134217728   #复制积压缓冲大小 repl_backlog_first_byte_offset:0 #复制缓冲区里偏移量的大小 repl_backlog_histlen:0           #此值等于 master_repl_offset - repl_backlog_first_byte_offset,该值不会超过repl_backlog_size的大小 # CPU(CPU计算量统计信息) used_cpu_sys:96894.66             #将所有redis主进程在核心态所占用的CPU时求和累计起来 used_cpu_user:87397.39           #将所有redis主进程在用户态所占用的CPU时求和累计起来 used_cpu_sys_children:6.37     #将后台进程在核心态所占用的CPU时求和累计起来 used_cpu_user_children:52.83 #将后台进程在用户态所占用的CPU时求和累计起来 # Commandstats(各种不同类型的命令的执行统计信息) cmdstat_get:calls=1664657469,usec=8266063320,usec_per_call=4.97   #call每个命令执行次数,usec总共消耗的CPU时长(单位微秒),平均每次消耗的CPU时长(单位微秒) # Cluster(集群相关信息) cluster_enabled:1   #实例是否启用集群模式 # Keyspace(数据库相关的统计信息) db0:keys=194690,expires=191702,avg_ttl=3607772262 #db0的key的数量,以及带有生存期的key的数,平均存活时间</code></pre>
  • Docker中容器/镜像的备份、恢复和迁移

    Docker中容器/镜像的备份、恢复和迁移Docker中容器/镜像的备份、恢复和迁移<br /> <br /> 今天,我们将学习如何快速地对docker容器进行快捷备份、恢复和迁移。Docker是一个开源平台,用于自动化部署应用,以通过快捷的途径在称之为容器的轻量级软件层下打包、发布和运行这些应用。它使得应用平台独立,因为它扮演了Linux上一个额外的操作系统级虚拟化的自动化抽象层。它通过其组件cgroups和命名空间利用Linux内核的资源分离特性,达到避免虚拟机开销的目的。它使得用于部署和扩展web应用、数据库和后端服务的大规模构建组件无需依赖于特定的堆栈或供应者。<br /> <br />     docker的容器,就是那些创建自Docker镜像的软件层,它包含了独立的Linux文件系统和开箱即用的应用程序。如果我们有一个在机器中运行着的Docker容器,并且想要备份这些容器以便今后使用,或者想要迁移这些容器,那么,本教程将帮助你掌握在Linux操作系统中备份、恢复和迁移Docker容器的方法。<br /> <br /> 我们怎样才能在Linux中备份、恢复和迁移Docker容器呢?这里为您提供了一些便捷的步骤。<br />   <h4>1. 备份容器</h4> <p>首先,为了备份Docker中的容器,我们会想看看我们想要备份的容器列表。要达成该目的,我们需要在我们运行着Docker引擎,并已创建了容器的Linux机器中运行 docker ps 命令。<br />  </p> <pre> <code># docker ps</code></pre> <img alt="docker ps" class="img-thumbnail" src="/resources/assist/images/blog/5195bcfb-26a0-4d56-a467-e5aeb74502b1.png" style="height:100px; width:1184px" />上图列出来的就是在运行的docker容器环境(<em>Docker Containers List</em>)<br /> <br /> 在此之后,我们要选择我们想要备份的容器,然后去创建该容器的快照。我们可以使用 docker commit 命令来创建快照。 <pre> <code>#docker commit -p 23b16cef00c8 container-tomcat-backup</code></pre> <img alt="docker commit" class="img-thumbnail" src="/resources/assist/images/blog/3120a9d3-1c61-408e-88ba-3478ed7b1712.png" style="height:114px; width:661px" /><br /> 说明:<br /> 1.23b16cef00c8 :容器ID<br /> 2.container-tomcat-backup:备份的景象/快照名称<br /> 3.执行该操作所耗时间与容器的大小相关,容器里面东西越多,越耗时间<br /> 4.该命令会生成一个作为Docker镜像的容器快照,我们可以通过运行 <code>docker images</code> 命令来查看Docker镜像<br />   <pre> <code>#docker images</code></pre> <br /> <img alt="docker images" class="img-thumbnail" src="/resources/assist/images/blog/9265b4da-e97e-4149-93d2-561f240cceb4.png" style="height:133px; width:735px" /><br /> <br /> 现在快照已经创建,有两种方式可以保持镜像<br /> 1.登录docker用户中心,并将该镜像推送上去<br /> 2.导出本地<br /> <br /> 这里我们讲解第二种方式,实际运用中第二种也比较多,毕竟备份的容器过大恢复和推送到docker中心都需要大量的时间<br /> <br /> 备份命令: <pre> <code>#docker save -o /data/images-backup/container-tomcat-backup.tar container-tomcat-backup</code></pre> 说明:<br /> 1./data/images-backup/container-tomcat-backup.tar镜像导出存放路径<br /> 2.container-tomcat-backup 镜像在docker里面的名字<br /> <br /> 恢复命令: <pre> <code>#docker load -i /data/images-backup/container-tomcat-backup.tar</code></pre> <br /> 说明:<br /> /data/images-backup/container-tomcat-backup.tar备份的镜像路径
  • TortoiseGit配置SSH秘钥

    TortoiseGit配置SSH秘钥,TortoiseGitTortoiseGit配置SSH秘钥<br /> <br /> 1.打开秘钥生成器PuTTYgen<br /> <img alt="打开秘钥生成器PuTTYgen" class="img-thumbnail" src="/resources/assist/images/blog/708ca43d12c142109225289e872be93c.png" /><br /> <br /> 2.生成秘钥<br /> <img alt="点击生成见" class="img-thumbnail" src="/resources/assist/images/blog/6d7901b7d54245d5bc033374d2c5e1b8.png" /><br /> <img alt="移动鼠标生成秘钥" class="img-thumbnail" src="/resources/assist/images/blog/68b6505ff0434622a36c5b17fe7fe1d2.png" /><br /> 注意在生成过程中需要鼠标在鼠标移动区域移动。不然进度会停止。<br /> <br /> 3.将生成的公钥复制到git的网站配置中<br /> 生成的秘钥对<br /> <img alt="生成的秘钥对" class="img-thumbnail" src="/resources/assist/images/blog/d7eb6a21b40644ebb489fa22ae27362c.png" /><br /> 复制到git配置中心的秘钥管理<br /> <img alt="复制到git配置中心的秘钥管理" class="img-thumbnail" src="/resources/assist/images/blog/bc603388c6ca4f1aababbace0bfc14f2.png" /><br /> <br /> 4.保存私钥到本地<br /> <img alt="保持私钥到本地" class="img-thumbnail" src="/resources/assist/images/blog/2cadfb56b69d427a8a54ad893304aca7.png" /><br /> <img alt="保持私钥到本地" class="img-thumbnail" src="/resources/assist/images/blog/ce79cc7c7c224a89bd11d70b333973c4.png" /><br /> <img alt="保持私钥到本地" class="img-thumbnail" src="/resources/assist/images/blog/b3d3be4701344e50af9cf9e79f1c5b7f.png" /><br /> <br /> 5.配置TortoiseGit使用的客户端为putty的<br /> <img alt="配置TortoiseGit使用的客户端为putty的" class="img-thumbnail" src="/resources/assist/images/blog/7f91f6f59ac44172b4872f04a972715f.png" /><br /> <img alt="配置TortoiseGit使用的客户端为putty的2" class="img-thumbnail" src="/resources/assist/images/blog/3f671001c8604958985f47978532c141.png" /><br /> <br /> 6.下载通过密钥对加密的git私服项目<br /> <img alt="下载通过密钥对加密的git私服项目" class="img-thumbnail" src="/resources/assist/images/blog/4381cb7255c541e3b6ebeac758211483.png" /><br /> 注意下载的时候加载秘钥位置<br /> <br /> 7.配置个人的秘钥库,不用每次都在clone操作的时候Load Putty Key<br /> <img alt="配置个人的秘钥库,不用每次都在clone操作的时候Load Putty Key1" class="img-thumbnail" src="/resources/assist/images/blog/4a927fcbb2ee42cdafebda5004dc48ac.png" /><br /> <img alt="配置个人的秘钥库,不用每次都在clone操作的时候Load Putty Key2" class="img-thumbnail" src="/resources/assist/images/blog/0a09345bdcc4458ca810fc3f08b79549.png" /><br /> <img alt="配置个人的秘钥库,不用每次都在clone操作的时候Load Putty Key3" class="img-thumbnail" src="/resources/assist/images/blog/c2c6b88e61894a84810c63a5912a4c4c.png" /><br /> <img alt="配置个人的秘钥库,不用每次都在clone操作的时候Load Putty Key4" class="img-thumbnail" src="/resources/assist/images/blog/1289a60fc48541eca5733519f0ffe33c.png" /><br /> <br /> 这时候clone的时候就不用再加载私钥了<br /> <img alt="配置个人的秘钥库,不用每次都在clone操作的时候Load Putty Key5" class="img-thumbnail" src="/resources/assist/images/blog/9a270eb6fb3b450ab5061bbb28ae39d6.png" /><br /> <br /> <br />