1. 介绍scan命令的作用和keys *的作用类似,主要用于查找 redis 中的键,但是在正式的生产环境中一般不会直接使用keys *这个命令,因为他会返回所有的键,如果键的数量很多会导致查询时间很长,进而导致服务器阻塞,所以需要 scan 来进行更细致的查找
scan总共有这几种命令:scan、sscan、hscan、zscan,分别用于迭代数据库中的:数据库中所有键、集合键、哈希键、有序集合键,命令具体结构如下:
1234scan cursor [MATCH pattern] [COUNT count] [TYPE type]sscan key cursor [MATCH pattern] [COUNT count]hscan key cursor [MATCH pattern] [COUNT count]zscan key cursor [MATCH pattern] [COUNT count]
2. scanscan cursor [MATCH pattern] [COUNT count] [TYPE type],cursor 表示游标,指查询开始的位置,count 默认 ...
logback 使用,自定义输出格式说到 log4j,基本人人都知道,但是 logback,估计用的人不多,其实这两个都是 sl4j 的实现,而且是一个作者写的。
logback 比 log4j 更加好用,而且效率更高。
如何配置 logback。
12345<dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.1.3</version></dependency>
配置文件:logback.xml
123456789101112131415161718192021222324252627282930313233343536373839<?xml version="1.0" encoding="UTF-8" ?><configuration scan="true&q ...
每天一个 Linux 命令scp
加密的方式在本地主机和远程主机之间复制文件
用于在 Linux 下进行远程拷贝文件的命令, 和它类似的命令有 cp, 不过 cp 只是在本机进行拷贝不能跨服务器, 而且 scp 传输是加密的. 可能会稍微影响一下速度.当你服务器硬盘变为只读 read only system 时, 用 scp 可以帮你把文件移出来. 另外, scp 还非常不占资源, 不会提高多少系统负荷, 在这一点上, rsync就远远不及它了. 虽然 rsync 比 scp 会快一点, 但当小文件众多的情况下, rsync 会导致硬盘 I/O 非常高, 而 scp 基本不影响系统正常使用.
12345678910111213-1: 使用 ssh 协议版本 1;-2: 使用 ssh 协议版本 2;-4: 使用 ipv4;-6: 使用 ipv6;-B: 以批处理模式运行;-C: 使用压缩;-F: 指定 ssh 配置文件;-l: 指定宽带限制;-o: 指定使用的 ssh 选项;-P: 指定远程主机的端口号;-p: 保留文件的最后修改时间, 最后访问时间和权限模式;-q: 不显 ...
新时代码农
未读
每天一个 Linux 命令less 命令
less 命令 的作用与 more 十分相似, 都可以用来浏览文字档案的内容, 不同的是 less 命令允许用户向前或向后浏览文件, 而 more 命令只能向前浏览. 用less 命令显示文件时, 用 PageUp 键向上翻页, 用 PageDown 键向下翻页. 要退出 less 程序, 应按 Q 键.
12345678-e: 文件内容显示完毕后, 自动退出;-f: 强制显示文件;-g: 不加亮显示搜索到的所有关键词, 仅显示当前显示的关键字, 以提高显示速度;-l: 搜索时忽略大小写的差异;-N: 每一行行首显示行号;-s: 将连续多个空行压缩成一行显示;-S: 在单行显示较长的内容, 而不换行显示;-x< 数字 >: 将 TAB 字符显示为指定个数的空格字符.
抽象工厂模式练习Sunny 软件公司欲推出一款新的手机游戏软件, 该软件能够支持 Symbian、Android 和 Windows Mobile 等多个智能手机操作系统平台, 针对不同的手机操作系统,该游戏软件提供了不同的游戏操作控制 (OperationCon ...
新时代码农
未读
每天一个 Linux 命令more 命令
more 命令是一个基于 vi 编辑器文本过滤器, 它以全屏幕的方式按页显示文本文件的内容, 支持 vi 中的关键字定位操作.
123456按 空格 键: 显示文本的下一屏内容.按 回车 键: 只显示文本的下一行内容./: 接着输入一个模式, 可以在文本中寻找下一个相匹配的模式.按 h 键: 显示帮助屏, 该屏上有相关的帮助信息.按 b 键: 显示上一屏内容.按 q 键: 退出 rnore 命令
1234567-< 数字 >: 指定每屏显示的行数;-d: 显示“[press space to continue,'q' to quit.]”和“[Press 'h' for instructions]”;-c: 不进行滚屏操作. 每次刷新这个屏幕;-s: 将多个空行压缩成一行显示;-u: 禁止下划线;+< 数字 >: 从指定数字的行开始显示.
1234# 显示文件 file 的内容, 但在显示之前先清屏, 并且在屏幕的最下方显示完核的百分比.more -dc file# 显示文 ...
每天一个 Linux 命令cat
cat 命令连接文件并打印到标准输出设备上, cat 经常用来显示文件的内容, 类似于下的 type 命令.
123456-n 或 -number: 有 1 开始对所有输出的行数编号;-b 或 --number-nonblank: 和 -n 相似, 只不过对于空白行不编号;-s 或 --squeeze-blank: 当遇到有连续两行以上的空白行, 就代换为一行的空白行;-A: 显示不可打印字符, 行尾显示“$”;-e: 等价于"-vE"选项;-t: 等价于"-vT"选项;
123cat file1 # 显示 文件 file1 中的内容cat file1 file2 # 同时显示 file1 和 file2 的内容cat file1 file2 > file # 将文件 file1 和 file2 合并和放入 file 中
回顾 简单工厂模式优点:
将创建和使用分离, 遵循单一原则
引入配置文件, 遵循开闭原则
使用别名代替复杂的类名, 简化代码
缺点:
如果要添加新的产品类时, 必须修改工厂 ...
单一职责原则 (Single Responsibility Principle, SRP)定义:
一个类只负责一个功能领域中相应职责 (对一个类而言, 应该只有一个引起它变化的原因)
作用:实现高内聚, 低耦合
案例:客户信息图形统计模块
违背单一职责原则如果修改数据库连接方式或者修改图标显示方式都需要修改这个类;不能重用数据库连接的代码
重构
代码实现:
12345678910111213141516171819202122232425class CustomerDataChart { private CustomerDao customerDao; public void createChart(){ System.out.println("创建图表"); } public void displayChart(){ System.out.println("显示图表"); }}class CustomerDao { ...
新时代码农
未读每天一个 Linux 命令ls 命令
12345678910111213141516171819202122-a: 显示所有档案及目录(ls 内定将档案名或目录名称为“.”的视为影藏, 不会列出);-A: 显示除影藏文件“.”和“..”以外的所有文件列表;-C: 多列显示输出结果. 这是默认选项;-l: 与“-C”选项功能相反, 所有输出信息用单列格式输出, 不输出为多列;-F: 在每个输出项后追加文件的类型标识符, 具体含义: “*”表示具有可执行权限的普通文件, “/”表示目录, “@”表示符号链接, “|”表示命令管道 FIFO, “=”表示 sockets 套接字. 当文件为普通文件时, 不输出任何标识符;-b: 将文件中的不可输出的字符以反斜线“”加字符编码的方式输出;-c: 与“-lt”选项连用时, 按照文件状态时间排序输出目录内容, 排序的依据是文件的索引节点中的 ctime 字段. 与“-l”选项连用时, 则排序的一句是文件的状态改变时间;-d: 仅显示目录名, 而不显示目录下的内容列表. 显示符号链接文件本身, 而不显示其所指向的目录列表;-f: 此参数的效果和同时指 ...
验证查询查询语句可以变得非常复杂,特别是与不同的分析器和字段映射相结合后,就会有些难度。validate API 可以验证一条查询语句是否合法。
12345678GET /gb/tweet/_validate/query{ "query": { "tweet" : { "match" : "really powerful" } }}
以上请求的返回值告诉我们这条语句是非法的:
12345678{ "valid": false, "_shards": { "total": 1, "successful": 1, "failed": 0 }}
理解错误信息想知道语句非法的具体错误信息,需要加上 explain 参数:
12345678GET / ...
查询语句和过滤语句合并查询语句和过滤语句可以放在各自的上下文中。 在 ElasticSearch API 中我们会看到许多带有 query 或 filter 的语句。 这些语句既可以包含单条 query 语句,也可以包含一条 filter 子句。 换句话说,这些语句需要首先创建一个 query 或 filter 的上下文关系。
复合查询语句可以加入其他查询子句,复合过滤语句也可以加入其他过滤子句。 通常情况下,一条查询语句需要过滤语句的辅助,全文本搜索除外。
所以说,查询语句可以包含过滤子句,反之亦然。 以便于我们切换 query 或 filter 的上下文。这就要求我们在读懂需求的同时构造正确有效的语句。
带过滤的查询语句过滤一条查询语句
比如说我们有这样一条查询语句:
12345{ "match": { "email": "business opportunity" }}
然后我们想要让这条语句加入 term 过滤,在收信箱中匹配邮件:
12345{ &quo ...
查询过滤关键字
term 过滤term 主要用于精确匹配哪些值,比如数字,日期,布尔值或 not_analyzed 的字符串 (未经分析的文本数据类型):
1234{ "term": { "age": 26 }}{ "term": { "date": "2014-09-01" }}{ "term": { "public": true }}{ "term": { "tag": "full_text" }}
terms 过滤terms 跟 term 有点类似,但 terms 允许指定多个匹配条件。 如果某个字段指定了多个值,那么文档需要一起去做匹配:
12345{ &q ...
关系型数据库和 ES 对比
12Relational DB -> Databases -> Tables -> Rows -> ColumnsElasticsearch -> Indexing -> Types -> Documents -> Fields
Elasticsearch 集群可以包含多个索引 (indices)(数据库),每一个索引可以包含多个类型 (types)(表),每一个类型包含多个文档 (documents)(行),然后每个文档包含多个字段 (Fields)(列)
「索引」含义的区分
你可能已经注意到索引 (index) 这个词在 Elasticsearch 中有着不同的含义,所以有必要在此做一下区分:索引(名词) 如上文所述,一个索引 (index) 就像是传统关系数据库中的数据库,它是相关文档存储的地方,index 的复数是 indices 或 indexes。索引(动词) 「索引一个文档」表示把一个文档存储到索引(名词)里,以便它可以被检索或者查询。这很像 SQL 中的 INSERT 关键字,差别是 ...
新时代码农
未读外部排序:通过 Comparator 实现个性化排序使用 Comparator 的基本步骤
定义一个实现了 Comparator<T> 接口的类,其中需要实现 compare 方法。
使用 Collections.sort(List list, Comparator c) 对列表进行排序。
示例代码:Person 类123456789101112131415161718192021public class Person { private int age; private String name; public Person(int age, String name) { this.age = age; this.name = name; } public int getAge() { return age; } @Override public String toString() { return " ...
新时代码农
未读动态获取加载的 Jar 包有时我们需要在运行时确定一个特定类所对应的 JAR 包或目录的位置。为此我们提供了ClassLocationUtils.where(cls)这个静态工具方法来帮助识别指定类的来源文件。
123456789101112131415161718192021222324252627282930313233343536import java.io.File;import java.net.MalformedURLException;import java.net.URL;import java.security.CodeSource;import java.security.ProtectionDomain;public class ClassLocationUtils { public static String where(final Class<?> cls) { if (cls == null)throw new IllegalArgumentException("null input: cls&q ...