1、nodejs npm install -g 全局安装和非全局安装的区别
2、npm install -S -D -g 有什么区别
3、npm install -g 和npm install –save-dev的关系
工作中遇到一个问题,redis中存储了大量的key,而且没有设置时效,其中很大一部分后来都没用了,导致redis体积庞大,查询缓慢。服务器版本为windows,网上搜索到很多批量删除的方法都是Linux下的,几番寻找,终于找到了在windows下批量删除超大量key的方法。
首先贴一下Linux下的方法:
|
|
//如果redis-cli没有设置成系统变量,需要指定redis-cli的完整路径,加入redis-cli的安装路径如下:
那么在gitbash上模拟的linux命令则如下:
|
|
原理就是通过xargs工具将前半部分的查询结果借助管道传递给后面的删除命令,进而实现循环删除,达到批量删除的结果。
But,测试的时候趣发现这条命令不好使,测试结果如下图所示,具体的原因不明:
作为替代方案,我找到了windows、Linux下均试用的方法:
使用lua脚本:
|
|
但这种处理方式,量大的情况下,lua函数unpack会出现问题,会报错误
(error) ERR Error running script (call to f_e177a091510d969af3b388ee986dbe6658df6b57): user_script:1: too many results to unpack
解决方法:
一次性unpack太多会出问题,那就干脆一次5000吧,这样就不会有问题了,实测速度非常快哦。
|
|
所以最终实现我的需求的代码就是:
|
|
上述语句的执行原理其实是递归调用,通过递归最终实现了批量删除。
在redis集群中可以借助脚本实现集群上的批量删除,这个还没测试过。参考文章如下:
redis集群批量删除指定的key
本文参考文章:
redis批量删除key (windows适用)
最近项目中有新的需求,需要对包含数字、字母、中文的字符串按首字母排序。看似简单,但是实现起来却很难。因为这里面包含了中文,不能单纯的取首字母的ASSIC值进行比较。考虑到最终是根据英文字母进行比较的,索性将字符串统统转化成拼音字符串进行处理。具体的代码如下。
PinyinUtils.java
|
|
测试载体Students.java
|
|
测试类:
|
|
执行结果如下:
知识点:
字符串比较大小,可以使用现有的工具类:int result = str1.compareTo(str2);该方法返回两者的ASSIC 码的差值;
在SpringBoot中实现AOP很简单。
1、添加依赖:
//注意依赖的版本
2、定义切面:
WebLogAspect.java
整个AOP的代码结构如下:
注意点:
在后置通知中returning = “ret”中定义的参数名必须和通知方法受那个的参数匹配,即returning = “ret”中定义的是ret,通知方法中也必须是”ret”,否则将抛出异常。
最近看到公司的需求里面有单点登录,就去了解了一下。下面将从SSO单点登录的原理、实现步骤以及实现demo几个方面来讲述自己的理解。
1、SSO根本原理:
登录状态的共享;
1)、登录状态的共享有两种实现方式:
一:cookie共享【但是cookie原则上不能跨域,通过合理的配置在二级域名相同的情况下可以跨域共享】。
二:通过Session共享登录状态。【Spring Session共享方案,分布式系统中常用】
三:通过IP+Agent+User的方式实现状态共享,实际上是模仿了cookie合session机制。【我自己研究的,适合绝对跨域的分布式系统】因为通过IP+Agent+User的形式理论上可以模仿cookie合session识别一次会话。
2、实现的概要步骤【网络上的步骤乱七八糟各种不合理,自己整理了下】
1)、子系统一登陆,未登陆则进入SSO认证中心认证,成功则更新登陆状态【创建全局会话】,返回共享媒介;
2)、子系统二携带共享媒介,获取全局会话,读取登陆信息和登陆状态,实质是通过共享媒介保持了会话状态。
3)、退出时只需要注销全局会话状态即可。
【以上的概要步骤对SSO根本原理的一、二、三都适用】
3、SSO登陆的demo[通过cookie共享实现的]
SSOAuth:
SSOWebDemo1:
SSOWebDemo2:
四:参考文章:
单点登录原理与简单实现
单点登录
公司的架构师开发了一套接口扫描工具类,我想着,如果自己以后开公司了可能也用得着,所以研究了下,整理出了下面的开发思路和相关技术代码。
API扫描工具类的主要开发思路如下:
1、定义接口上的注解;
2、引用注解
3、扫描注解
首先定义注解:
定义接口上的注解
关于注解:请参照下面的文章:
Java注解详解
Java注解之Retention、Documented、Target介绍
实用的java注解工具类
如果想要动态的修改注解的值【如动态切换数据源】,一般看来注解的值是不能动态修改的,但是借助特殊工具还是可以的,参照下面的文章:
JAVAssist—动态修改注解
引用注解
|
|
扫描注解
扫描注解的工具类是参考了别人的代码写出来的。
|
|
经过测试,证实这段代码对深层代码的递归扫描性能很高。测试的递归路径如下图所示:
另外在研究过程中尝试了自动解析API参数为JSON ,虽然最终以失败告终,失败的原因是写出来的代码无法适应参数中泛型以及泛型中属性名的动态匹配。下面是在尝试中总结出来的工具类:
扫描API中参数的类型工具类:
|
|
字符串转化为JAVA代码的工具类:
|
|
参考文章:java将字符串转换成可执行代码
在使用zuul进行鉴权的时候,我们希望从请求Request中获取输入流,解析里面的内容,奈何InputStream只能被读取一次。为啥呢?源码里是这样说的:
public int read(byte[] b,int off, int len)
Reads up to len bytes of data into an array of bytes from this input stream. Ifpos equals count, then -1 is returned to indicate end of file. Otherwise, the number k of bytes read is equal to the smaller of len and count-pos.If k is positive, then bytes buf[pos] through buf[pos+k-1] are copied into b[off] through b[off+k-1] in the manner performed by System.arraycopy. The value k is added into pos and k is returned.
大致的意思是:在InputStream读取的时候,会有一个pos指针,它指示每次读取之后下一次要读取的起始位置。在每次读取后会更新pos的值,当你下次再来读取的时候是从pos的位置开始的,而不是从头开始,所以第二次获取String中的值的时候是不全的,API中提供了一个解决办法:reset()。但我发现在inputStream和servlet中根本不起作用。提示 mark/reset not supported 。意思是只有重写过markSupported()方法的IO流才可以用。所以一般我们使用inputStream,最好在一次内处理完所有逻辑。
那么就没法在中途获取请求流中的数据么?当然有办法了,我可是PPZ,只需要重写Request缓存一下流中的数据就好了,实现代码如下:
|
|
上述方案解决了使用request.getInpuStream()方法读取流中的数据只能读取一次的问题,其实当我们在使用第三方接口时,如果请求头信息和我们的服务所需不一致,例如第三方接口中头部信息为:content-type=text/plain;charset=UTF-8
而我们需要的是:”application/json;charset=utf-8”时,我们也是可以通过重写对应的方法对请求的头部信息进行修改的,代码如下:
|
|
当我们在后端设置了头部信息后,如果不出意外,前端发送的请求将变为简单请求,这样,服务器的处理机制将简单很多。
前几天写代码的时候,遇到一个需求,保存的时候如果重名则不执行保存,并抛出异常。但是当我抛出的不是运行时异常的时候,这个异常就需要一层层的捕获。就像下面这样:
|
|
或者这样
|
|
但是从一个程序员的角度,考虑,重名属于运行后进行操作才产生的异常,正常情况下应该抛出运行时异常,并且公司我最膜拜的架构师【据说是离神最近的男人】是已经封装好了异常,自定义运行时异常,因此就使用了运行时异常实现:
代码如下:
|
|
使用自定义运行时异常后,发现省事好多,异常并不需要一级一级的向上抛出或者在当前类捕获。
借助这个案例分析了下运行时异常的特点:
- A: 运行时期异常的概述:
- RuntimeException和他的所有子类异常,都属于运行时期异常。
NullPointerException,ArrayIndexOutOfBoundsException等都属于运行时期异常.- B:运行时期异常的特点
- a:方法中抛出运行时期异常,方法定义中无需throws声明,调用者也无需处理此异常。
- b:运行时期异常一旦发生,需要程序人员修改源代码。
设计原因:
运行异常,不能发生,但是如果发生了,程序人员停止程序修改源代码
运行异常: 一旦发生,不要处理,请你修改源代码,运行异常一旦发生,后面的代码没有执行的意义
这就是运行时异常的总结,就问还有谁。
tag:
缺失模块。
1、请确保node版本大于6.2
2、在博客根目录(注意不是yilia根目录)执行以下命令:
npm i hexo-generator-json-content --save
3、在根目录_config.yml里添加配置:
jsonContent: meta: false pages: false posts: title: true date: true path: true text: false raw: false content: false slug: false updated: false comments: false link: false permalink: false excerpt: false categories: false tags: true