上一篇开始了新一轮语法——Pattern的讲解,一开始为大家普及了几个基础知识,其中有说到操作符。当时只是把它们都列举出来了,所以今天这篇就是专门详解这些操作符的,但是由于篇幅限制,本篇先会讲几个,剩余的后面几篇会逐个讲解。

1. Followed-by
       如果各位有看过官方文档,应该会发现Followed-by的讲解是在比较靠后的位置,而放在第一的是Every关键字。我把它提前主要是因为其他的关键字结合Followed-by能更好的说明那个关键字的特点。如果不习惯我这样的顺序硬要跟着文档学习的朋友,可以跳过这一节先看后面的内容。

Followed-by,顾名思义就是“紧跟,跟随”的意思,通常用于事件之间的关联。举个现实生活中的例子:比如下班了,我用钥匙把家门打开,这是一个事件,紧接着我打开了浴室的灯,这也是一个事件,由于我之前在中央控制系统里设定了一个规则:打开家门后如果开了浴室的灯,热水就会放好,我一会儿就能洗澡了。所以我之前的一系列操作就触发了放热水这个动作。可能这个例子不是比较实际,但是应该能很清楚的说明这个关键字的含义吧。

Followed-by的操作符用减号和大于号组成,即->,和C语言里的指针一模一样。操作符两边是事件名称,表示右边的事件跟随左边的事件发生之后发生,即进入引擎。如果只是简单的事件follow,在操作符的两边写上事先定义的事件名或者类全名。例如:

  1. AppleEvent -> BananaEvent
  2. // or
  3. com.xxx.Benz -> com.yyy.Audi

但是如果前后事件之间有关联,那事件名或者类全名就需要设置一个别名。例如:

  1. a=AppleEvent -> b=BananaEvent(b.price = a.price)     // equals: a=AppleEvent -> b=BananaEvent(price = a.price)

设置别名的原因很简单,就是为了方便描述事件之间的关联信息。但是有意思的是,对于前两个简单follow不设置别名esper不会报语法错误,但是实际运行时你无法通过api获取满足条件的事件,而带上别名的事件是可以正常获取的。

先上一个简单的例子:

  1. package example;
  2. import com.espertech.esper.client.EPAdministrator;
  3. import com.espertech.esper.client.EPRuntime;
  4. import com.espertech.esper.client.EPServiceProvider;
  5. import com.espertech.esper.client.EPServiceProviderManager;
  6. import com.espertech.esper.client.EPStatement;
  7. import com.espertech.esper.client.EventBean;
  8. import com.espertech.esper.client.UpdateListener;
  9. /**
  10. * Created by Luonanqin on 9/5/14.
  11. */
  12. class FollowedEvent {
  13. private int size;
  14. public int getSize() {
  15. return size;
  16. }
  17. public void setSize(int size) {
  18. this.size = size;
  19. }
  20. public String toString() {
  21. return "FollowedEvent{" + "size=" + size + '}';
  22. }
  23. }
  24. class PatternFollowedListener implements UpdateListener {
  25. public void update(EventBean[] newEvents, EventBean[] oldEvents) {
  26. if (newEvents != null) {
  27. for (int i = 0; i < newEvents.length; i++) {
  28. System.out.println();
  29. EventBean event = newEvents[i];
  30. System.out.println("Result:");
  31. System.out.println(event.get("a") + " " + event.get("b"));
  32. }
  33. }
  34. }
  35. }
  36. public class PatternFollowedTest {
  37. public static void main(String[] args) {
  38. EPServiceProvider epService = EPServiceProviderManager.getDefaultProvider();
  39. EPAdministrator admin = epService.getEPAdministrator();
  40. EPRuntime runtime = epService.getEPRuntime();
  41. String followed = FollowedEvent.class.getName();
  42. String epl = "select * from pattern[every a=" + followed + " -> b=" + followed + "(size < a.size)]";
  43. System.out.println("EPL: " + epl+"\n");
  44. EPStatement stat = admin.createEPL(epl);
  45. stat.addListener(new PatternFollowedListener());
  46. FollowedEvent f1 = new FollowedEvent();
  47. f1.setSize(1);
  48. System.out.println("Send Event1: " + f1);
  49. runtime.sendEvent(f1);
  50. System.out.println();
  51. FollowedEvent f2 = new FollowedEvent();
  52. f2.setSize(3);
  53. System.out.println("Send Event2: " + f2);
  54. runtime.sendEvent(f2);
  55. System.out.println();
  56. FollowedEvent f3 = new FollowedEvent();
  57. f3.setSize(2);
  58. System.out.println("Send Event3: " + f3);
  59. runtime.sendEvent(f3);
  60. }
  61. }

执行结果:

  1. EPL: select * from pattern[every a=example.FollowedEvent -> b=example.FollowedEvent(size < a.size)]
  2. Send Event1: FollowedEvent{size=1}
  3. Send Event2: FollowedEvent{size=3}
  4. Send Event3: FollowedEvent{size=2}
  5. Result:
  6. FollowedEvent{size=3} FollowedEvent{size=2}

例子中的pattern是由every和followed-by两个结构组合而成,所实现的效果是针对每一个事件,都监听其follow后同类型的事件的size值小于follow前的事件。只要满足pattern定义,通过get对应的别名就可以获得触发时的具体事件。 并且满足触发条件的事件不会再次被监听。大家重点关注followed-by,every之后会有详细说明。

以上面的例子来说,我们会监听所有进入引擎的FollowedEvent事件,并等待匹配规则的follow事件。但是如果满足条件的事件一直不发生,那么之前的等待事件就会一直存于引擎内,这势必会引起内存溢出,或者我们有某种需求,即只保留某一部分的事件用来等待匹配的follow事件。Esper为此提供了进阶的Followed-by语法:

  1. lhs_expression -[limit_expression]> rhs_expression

lhs_expression和rhs_expression就是之前所说的发生顺序有关联的两个事件,而中间的“->”被一个限制表达式分开了,这里的限制表达式需要返回一个int数值,也可以直接写一个数字。整体的含义是:当左边事件等待满足条件的右边事件时,最多只保留n个左边事件在引擎内等待触发,其余事件不留在引擎内。而这个n就是限制表达式的返回值。无论左边事件数量是否达到n,只要满足条件的右边事件到达并触发后,引擎便重新等待新的左边事件并重新计数,直到超过n。。。这个过程会不断循环。完整示例如下:

  1. package example;
  2. import com.espertech.esper.client.EPAdministrator;
  3. import com.espertech.esper.client.EPRuntime;
  4. import com.espertech.esper.client.EPServiceProvider;
  5. import com.espertech.esper.client.EPServiceProviderManager;
  6. import com.espertech.esper.client.EPStatement;
  7. import com.espertech.esper.client.EventBean;
  8. import com.espertech.esper.client.UpdateListener;
  9. /**
  10. * Created by Luonanqin on 9/10/14.
  11. */
  12. class LimitEvent {
  13. private int age;
  14. public int getAge() {
  15. return age;
  16. }
  17. public void setAge(int age) {
  18. this.age = age;
  19. }
  20. public String toString() {
  21. return "LimitEvent{" + "age=" + age + '}';
  22. }
  23. }
  24. class LimitFollowedListener implements UpdateListener {
  25. public void update(EventBean[] newEvents, EventBean[] oldEvents) {
  26. if (newEvents != null) {
  27. System.out.println("\nResult: ");
  28. for (int i = 0; i < newEvents.length; i++) {
  29. EventBean event = newEvents[i];
  30. System.out.println("a=" + event.get("a") + " b=" + event.get("b"));
  31. }
  32. System.out.println();
  33. }
  34. }
  35. }
  36. public class LimitFollowedTest {
  37. public static void main(String[] args) {
  38. EPServiceProvider epService = EPServiceProviderManager.getDefaultProvider();
  39. EPAdministrator admin = epService.getEPAdministrator();
  40. EPRuntime runtime = epService.getEPRuntime();
  41. String limit = LimitEvent.class.getName();
  42. String follow = FollowedEvent.class.getName();
  43. /* 在每次触发完成前最多只保留2个a事件,触发条件为b的size值大于a的age */
  44. String epl = "every a=" + limit + " -[2]> b=" + follow + "(size > a.age)";
  45. System.out.println("EPL: " + epl + "\n");
  46. EPStatement stat = admin.createPattern(epl);
  47. stat.addListener(new LimitFollowedListener());
  48. System.out.println("First Send!\n");
  49. LimitEvent l1 = new LimitEvent();
  50. l1.setAge(1);
  51. System.out.println("Send Event: " + l1);
  52. runtime.sendEvent(l1);
  53. LimitEvent l2 = new LimitEvent();
  54. l2.setAge(2);
  55. System.out.println("Send Event: " + l2);
  56. runtime.sendEvent(l2);
  57. LimitEvent l3 = new LimitEvent();
  58. l3.setAge(0);
  59. System.out.println("Send Event: " + l3);
  60. runtime.sendEvent(l3);
  61. FollowedEvent f1 = new FollowedEvent();
  62. f1.setSize(3);
  63. System.out.println("Send Event: " + f1);
  64. runtime.sendEvent(f1);
  65. FollowedEvent f2 = new FollowedEvent();
  66. f2.setSize(4);
  67. System.out.println("Send Event: " + f2);
  68. runtime.sendEvent(f2);
  69. System.out.println();
  70. System.out.println("Second Send!\n");
  71. System.out.println("Send Event: "+l1);
  72. runtime.sendEvent(l1);
  73. System.out.println("Send Event: " + l2);
  74. runtime.sendEvent(l2);
  75. System.out.println("Send Event: " + l3);
  76. runtime.sendEvent(l3);
  77. System.out.println("Send Event: " + f1);
  78. runtime.sendEvent(f1);
  79. }
  80. }

执行结果:

  1. EPL: every a=example.LimitEvent -[2]> b=example.FollowedEvent(size > a.age)
  2. First Send!
  3. Send Event: LimitEvent{age=1}
  4. Send Event: LimitEvent{age=2}
  5. Send Event: LimitEvent{age=0}
  6. Send Event: FollowedEvent{size=3}
  7. Result:
  8. a=LimitEvent{age=1} b=FollowedEvent{size=3}
  9. a=LimitEvent{age=2} b=FollowedEvent{size=3}
  10. Send Event: FollowedEvent{size=4}
  11. Second Send!
  12. Send Event: LimitEvent{age=1}
  13. Send Event: FollowedEvent{size=3}
  14. Result:
  15. a=LimitEvent{age=1} b=FollowedEvent{size=3}

例子中的epl已经给了注释说明含义,从运行结果中也可以看出,第一次发送时,FollowedEvent只触发了前两个age为1和2的LimitEvent,说明-[2]>起到了限制等待的LimitEvent事件数量为2的效果。第二次发送时,可以看到第一次触发之后-[2]>重新开始计数,FollowedEvent到达后就直接触发了。

关于限制左边事件的内容,有些是通过配置完成。比如说针对所有的pattern语句都限制,不必每次都写在句子中。这个在之后的配置章节会有讲解。

2.Every
这个操作符想必大家已经不陌生了。例子也看了这么多,顾名思义也能想到它代表的就是“每一个”的意思。实际上他表示的是,为操作符后的事件或者子pattern表达式建立一个监听实例,只要满足触发条件这个实例就到此结束。比如:

  1. 1).
  2. select * from pattern[every LimitEvent]
  3. // equals to
  4. select * from LimitEvent
  5. 2).
  6. every FollowedEvent(size > 2)
  7. 3).
  8. every a=LimitEvent -> b=FollowedEvent(size > a.age)

第一个例子是针对每一个LimitEvent事件都监听,所以等同于另一个非pattern写法。第二个例子监听每一个FollowedEvent,且事件的size要大于2,也就是一个filter。第三个例子我在之前有讲过,->的左右组合在一起可以算是一个子表达式(即followed-by),但是every真的是针对这个子表达式么?其实不然,every的优先级要大于->,所以every为每一个LimitEvent建立监听实例,并根据一定条件等待FollowedEvent。

我之所以先讲Followed-by,就是因为every和->的不同优先级会把各位弄晕,所以先让大家把->搞清楚再来看各种组合情况。

我把文档里的一个优先级例子放在这里专门讲解下,完整例子我就不写了。

  1. 假设事件传入引擎的顺序是这样的:
  2. A1 B1 C1 B2 A2 D1 A3 B3 E1 A4 F1 B4
  3. 注意:every优先级高于->,但是圆括号优先级高于所有操作符
  4. Pattern 1:
  5. every ( A -> B )
  6. 匹配结果:
  7. {A1, B1}
  8. {A2, B3}
  9. {A4, B4}
  10. 说明:因为有括号,所以every针对的是每一个A->B。A2后面的B3到达前,出现了A3,但是B3到达后并未匹配A3,说明every只有在一个完整的匹配发生后再对A进行新的监听,因此A3不会被监听。比如说:A1 A2 A3 A4 B1这样的发生顺序只会导致A1->B1
  11. Pattern 2:
  12. every A -> B
  13. 匹配结果:
  14. {A1, B1}
  15. {A2, B3} {A3, B3}
  16. {A4, B4}
  17. 说明:由于没有括号,所以every的优先级大于->,所以every针对的是A,而不是A->B。也就是说,引擎每进入一个A,every都为其新建一个pattern实例等待B事件的发生。所以可以从结果中可以看出,B3进入引擎后同时触发了A2和A3
  18. Pattern 3:
  19. A -> every B
  20. 匹配结果:
  21. {A1, B1}
  22. {A1, B2}
  23. {A1, B3}
  24. {A1, B4}
  25. 说明:every的优先级大于->,且every只作用于B,所以->只会针对第一个A事件起作用,并且每一个B都可以匹配这个A。
  26. Pattern 4:
  27. every A -> every B
  28. 匹配结果:
  29. {A1, B1}
  30. {A1, B2}
  31. {A1, B3} {A2, B3} {A3, B3}
  32. {A1, B4} {A2, B4} {A3, B4} {A4, B4}
  33. 说明:A和B都用every修饰,every的优先级大于->,所以针对每一个A和B都可以匹配->。再说得通俗一点,只要A在B前进入引擎,那么A后面的B都可以和这个A匹配成功。

上面的四个例子可以很清楚的表达出every的意思,更为复杂的例子就是将A和B替换成别的子pattern表达式,各位可以试着自己写写看一下效果。比如:every A->B->C

3. Every-Distinct
Every-Distinct和Every基本一样,唯一的区别是Every-Distinct会根据事件的某些属性过滤掉重复的,避免触发监听器。其余用法和Every相同。具体语法如下:

  1. every-distinct(distinct_value_expr [, distinct_value_expr[...] [, expiry_time_period])

distinct_value_expr表示参与过滤的事件属性,比如:

  1. every-distinct(a.num) a=A

并且可以多个属性联合在一起,就像联合主键那样。比如:

  1. every-distinct(a.num, b.age) a=A -> b=B

用于过滤的事件属性值在量很大的情况下会占用很多内存,所以我们需要给它设定一个过期值,也就是语法中的expiry_time_period。这个关键字表示的时间到达时,pattern重新匹配新的事件,而不受之前事件的用于过滤的属性值的影响。比如说:

  1. EPL: every-distinct(a.num, 3 sec) a=A
  2. Send: A1: {num=1}
  3. Send: A2: {num=1}
  4. After 3 seconds
  5. Send: A3: {num=1}

第一次发送num为1的A1事件会触发监听器,紧接着发送num为1的A2事件,不会触发,因为num=1已经出现过了,所以A2被过滤。3秒过后,pattern被重置,这时发送A3,监听器收到该事件。这个过程一直持续,即每3秒重置一次pattern,直到EPL实例被销毁。

语法讲解就这么多,以下几个点需要各位注意:
1).语法后面跟的子表达式如果返回false,pattern也会被重置。这一点下面的例子会说明。
2).无论多少个事件的属性参与过滤,其事件名必须设置别名,以“别名.属性名”的方式写在圆括号内。
3).事件别名一定要在子表达式中定义,否则语法错误。比如:a=A -> every-distinct(a.aprop) b=B

总结上面的所有内容,我写了个完整的例子供大家参考。

  1. package example;
  2. import com.espertech.esper.client.EPAdministrator;
  3. import com.espertech.esper.client.EPRuntime;
  4. import com.espertech.esper.client.EPServiceProvider;
  5. import com.espertech.esper.client.EPServiceProviderManager;
  6. import com.espertech.esper.client.EPStatement;
  7. import com.espertech.esper.client.EventBean;
  8. import com.espertech.esper.client.UpdateListener;
  9. /**
  10. * Created by Luonanqin on 9/15/14.
  11. */
  12. class EveryDistinctEvent {
  13. private int num;
  14. public int getNum() {
  15. return num;
  16. }
  17. public void setNum(int num) {
  18. this.num = num;
  19. }
  20. public String toString() {
  21. return "EveryDistinctEvent{" + "num=" + num + '}';
  22. }
  23. }
  24. class EveryDistinctListener implements UpdateListener {
  25. public void update(EventBean[] newEvents, EventBean[] oldEvents) {
  26. if (newEvents != null) {
  27. System.out.println("\nResult: ");
  28. for (int i = 0; i < newEvents.length; i++) {
  29. EventBean event = newEvents[i];
  30. System.out.println(event.get("a"));
  31. }
  32. }
  33. }
  34. }
  35. public class EveryDistinctTest {
  36. public static void main(String[] args) throws InterruptedException {
  37. EPServiceProvider epService = EPServiceProviderManager.getDefaultProvider();
  38. EPAdministrator admin = epService.getEPAdministrator();
  39. EPRuntime runtime = epService.getEPRuntime();
  40. String everyDistinct = EveryDistinctEvent.class.getName();
  41. String limit = LimitEvent.class.getName();
  42. String epl1 = "every-distinct(a.num) a=" + everyDistinct;
  43. System.out.println("EPL1: " + epl1);
  44. EPStatement stat1 = admin.createPattern(epl1);
  45. stat1.addListener(new EveryDistinctListener());
  46. EveryDistinctEvent ed1 = new EveryDistinctEvent();
  47. ed1.setNum(1);
  48. EveryDistinctEvent ed2 = new EveryDistinctEvent();
  49. ed2.setNum(2);
  50. EveryDistinctEvent ed3 = new EveryDistinctEvent();
  51. ed3.setNum(1);
  52. System.out.println("\nSend Event: " + ed1);
  53. runtime.sendEvent(ed1);
  54. System.out.println("\nSend Event: " + ed2);
  55. runtime.sendEvent(ed2);
  56. System.out.println("\nSend Event: " + ed3);
  57. runtime.sendEvent(ed3);
  58. stat1.destroy();
  59. String epl2 = "every-distinct(a.num) (a=" + everyDistinct + " and not " + limit + ")";
  60. System.out.println("\nEPL2: " + epl2);
  61. EPStatement stat2 = admin.createPattern(epl2);
  62. stat2.addListener(new EveryDistinctListener());
  63. LimitEvent l1 = new LimitEvent();
  64. System.out.println("\nSend Event: " + ed1);
  65. runtime.sendEvent(ed1);
  66. System.out.println("\nSend Event: " + ed2);
  67. runtime.sendEvent(ed2);
  68. System.out.println("\nSend Event: " + l1);
  69. runtime.sendEvent(l1);
  70. System.out.println("\nSend Event: " + ed3);
  71. runtime.sendEvent(ed3);
  72. stat2.destroy();
  73. String epl3 = "every-distinct(a.num, 3 sec) a=" + everyDistinct;
  74. System.out.println("\nEPL3: " + epl3);
  75. EPStatement stat3 = admin.createPattern(epl3);
  76. stat3.addListener(new EveryDistinctListener());
  77. System.out.println("\nSend Event: " + ed1);
  78. runtime.sendEvent(ed1);
  79. System.out.println("\nSend Event: " + ed2);
  80. runtime.sendEvent(ed2);
  81. System.out.println("\nSleep 3 seconds!");
  82. Thread.sleep(3000);
  83. System.out.println("\nSend Event: " + ed3);
  84. runtime.sendEvent(ed3);
  85. }
  86. }

执行结果:

  1. EPL1: every-distinct(a.num) a=example.EveryDistinctEvent
  2. Send Event: EveryDistinctEvent{num=1}
  3. Result:
  4. EveryDistinctEvent{num=1}
  5. Send Event: EveryDistinctEvent{num=2}
  6. Result:
  7. EveryDistinctEvent{num=2}
  8. Send Event: EveryDistinctEvent{num=1}
  9. EPL2: every-distinct(a.num) (a=example.EveryDistinctEvent and not example.LimitEvent)
  10. Send Event: EveryDistinctEvent{num=1}
  11. Result:
  12. EveryDistinctEvent{num=1}
  13. Send Event: EveryDistinctEvent{num=2}
  14. Result:
  15. EveryDistinctEvent{num=2}
  16. Send Event: LimitEvent{age=0}
  17. Send Event: EveryDistinctEvent{num=1}
  18. Result:
  19. EveryDistinctEvent{num=1}
  20. EPL3: every-distinct(a.num, 3 sec) a=example.EveryDistinctEvent
  21. Send Event: EveryDistinctEvent{num=1}
  22. Result:
  23. EveryDistinctEvent{num=1}
  24. Send Event: EveryDistinctEvent{num=2}
  25. Result:
  26. EveryDistinctEvent{num=2}
  27. Sleep 3 seconds!
  28. Send Event: EveryDistinctEvent{num=1}
  29. Result:
  30. EveryDistinctEvent{num=1}

在EPL2中,every-distinct后面的子表达式是EveryDistinctEvent and not LimitEvent,所以在发送EveryDistinctEvent之后发送LimitEvent,就导致子表达式false,所以在此发送num=1的EveryDistinctEvent时监听器被触发。

原文 http://blog.csdn.net/luonanqin/article/details/39321249

Esper学习之十五:Pattern(二)的更多相关文章

  1. 201671010140. 2016-2017-2 《Java程序设计》java学习第十五周

    java学习第十五周 Java的GUI界面设计,框架以及主要部件填充,归置,布局管理,在第十一章和第十二章进行了系统的学习,在这两章的知识奠基下,可以简单的构造一个GUI用户界面,在两周的学习后,可以 ...

  2. python3.4学习笔记(十五) 字符串操作(string替换、删除、截取、复制、连接、比较、查找、包含、大小写转换、分割等)

    python3.4学习笔记(十五) 字符串操作(string替换.删除.截取.复制.连接.比较.查找.包含.大小写转换.分割等) python print 不换行(在后面加上,end=''),prin ...

  3. 学习笔记:CentOS7学习之十五: RAID磁盘阵列的原理与搭建

    目录 学习笔记:CentOS7学习之十五: RAID磁盘阵列的原理与搭建 14.1 RAID概念 14.1.1 RAID几种常见的类型 14.1.2 RAID-0工作原理 14.1.3 RAID-1工 ...

  4. 风炫安全WEB安全学习第二十五节课 利用XSS键盘记录

    风炫安全WEB安全学习第二十五节课 利用XSS键盘记录 XSS键盘记录 同源策略是浏览器的一个安全功能,不同源的客户端脚本在没有明确授权的情况下,不能读写对方资源.所以xyz.com下的js脚本采用a ...

  5. Esper学习之十二:EPL语法(八)

    今天的内容十分重要,在Esper的应用中是十分常用的功能之一.它是一种事件集合,我们可以对这个集合进行增删查改,所以在复杂的业务场景中我们肯定不会缺少它.它就是Named Window. 由于本篇篇幅 ...

  6. (C/C++学习笔记) 十五. 构造数据类型

    十五. 构造数据类型 ● 构造数据类型概念 Structured data types 构造数据类型 结构体(structure), 联合体/共用体 (union), 枚举类型(enumeration ...

  7. Esper学习之十四:Pattern(一)

    1. Pattern Atoms and Pattern operatorsPattern是通过原子事件和操作符组合在一起构成模板.原子事件有3类,操作符有4类,具体如下: 原子事件:1). 普通事件 ...

  8. 3ds max学习笔记(十五)-- 二维图形的操作

    (二维图形的创建) 1,在命令面板的[新建],单击第二个按钮: 从中选择对象名称,在视图种单击拖动进行创建,特殊:线:摁[shift]限制水平,垂直方向: 2,二维对象参数: 在渲染中启用:显示二维线 ...

  9. C++学习(十五)(C语言部分)之 数组二

    数组大纲 多维数组 二维数组 重点 (三位以上基本不会用到) 都是用来存数据 一个班有20个人 可以用一维数组存20个人的年龄 int age[20]; 一个年级10个班 每个班20人 int age ...

随机推荐

  1. 创建自己的PKI公/私密钥对和公钥证书

    1. 创建certificate request configuration file cert_req.conf******************************************* ...

  2. MySQL 数据库定时自动备份

    创建备份目录 cd /home mkdir backup cd backup 创建备份 Shell 脚本: vim DatabaseName.sh #!/bin/bash /usr/local/mys ...

  3. Xshell的常用命令

    常用的命令: suse linux 常用命令 (1) 命令ls——列出文件 ls  显示当前目录文件 ls -la 给出当前目录下所有文件的一个长列表,包括以句点开头的“隐藏”文件 ls a* 列出当 ...

  4. 关于最近WIN7系统错误711的解决办法

    昨天晚上有发现部分用户反馈错误711,因为不在现场不清楚是怎么一回事,今天早上又有其他客户反馈他下面有4个用户发生711错误. 刚好在电脑边上,就拨号试下,结果我的也是711 这个711的症状是: 单 ...

  5. vi编辑器的使用方式

    vi编辑器是所有Unix及Linux系统下标准的编辑器,它的强大不逊色于任何最新的文本编辑器,这里只是简单地介绍一下它的用法和一小部分指令.由于对Unix及Linux系统的任何版本,vi编辑器是完全相 ...

  6. java 坑

    时间戳 unix的时间戳和java中的是不同的.unix为10位,java的13位.需要进行转换. long timestamps = 1509783992L; long javaTimstamps ...

  7. sparkSQL实际应用

    提交代码包 /usr/local/spark/bin$ spark-submit --class "getkv" /data/chun/sparktes.jar 1.查询KV im ...

  8. Gridview各种功能+AspNetPager+Ajax实现无刷新存储过程分页 (留着用)

    存储过程: GetProductsCount1: GetProductsByPage: ) * @PageSize) +' id from test)' exec sp_executesql @sql ...

  9. EasyUI的功能树之扁平化

    上篇博客主要介绍了异步加载树的方法,通过前台传给后台一个节点的id值,然后当单击节点加号时,查询并显示其子节点的数据.其实如果不是很大的数据,我们本可以次把树中所有节点都加载上来的.也就是说,我的Ac ...

  10. Oracle统计每条数据的大小

    怎么查询一条记录到底占了多少空间呢,随便用一个表举例(如上图),就着解决眼前问题的原则(oracle),网上简单查了查,发现生效了,就没深入了解了,包括其它数据库怎么解决,都没做研究.Oracle下, ...