完美

[学习|工作|博客|交流平台|完美起航]

作者头像zyw3272017.05.19 18:09 

​redis消息通知(任务队列和发布订阅模式)

1. 任务队列1.1 任务队列的特点任务队列:顾名思义,就是“传递消息的队列”。与任务队列进行交互的实体有两类,一类是生产者(producer),另一类则是消费者(consumer)。生产者将需要处理的任务放入任务队列中,而消费者则不断地从任务独立中读入任务信息并执行。任务队列的好处:松耦合。生产者和消费者只需按照约定的任务描述格式,进行编写代码。易于扩展。多消费者模式下,消费者可以分布在多个不同的服务器中,由此降低单台服务器的负载。1.2 Redis实现任务队列使用Redis实现任务队列首先想到的就是Redis的列表类型,因为在Redis内部,==列表类型是由双向链表实现==的。实现任务队列,只需让生产者将任务使用LPUSH加入到某个键中,然后另一个消费者不断地使用RPOP命令从该键中取出任务即可。//生产者只需将taskLPUSH到队列中127.0.0.1:6379>LPUSHqueuetask (integer)1127.0.0.1:6379>LRANGEqueue0-11)"task"//消费者只需从队列中LPOP任务,如果为空则轮询。127.0.0.1:6379>LPOPqueue"task"12345678BLPOP指令可以在队列为空时处于阻塞状态。就不用处于轮询的状态。127.0.0.1:6379>BLPOPqueue0//0表示无限制等待//消费者当队列为空则处于阻塞状态。//生产者将taskLPUSH到队列中,处于阻塞状态的消费者离开返回127.0.0.1:6379>LPUSHqueuetask (integer)1//消费者立刻“消费”,取出task。127.0.0.1:6379>BLPOPqueue01)"queue"2)"task"(13.38s)12345678910111.3 优先级队列当一个队列中有许多任务仍然没有来得及被消费者及时消费时,如果出现紧急的消息,则不得不等待队列中的任务被一一取出,因此,需要实现一个优先级队列,当优先级队列不为空时,消费者优先取出优先级队列中的任务去执行。BLPOP命令可以同时接收多个键BLPOP key [key ...] timeout,当所有键(列表类型)都为空时,则阻塞,当其中一个有元素则会从该键返回。==如果多个键都有元素则按照从左到右的顺序取第一个键中的一个元素,因此可以借此特性实现优先级队列。==127.0.0.1:6379>LPUSHqueue1first(integer)1127.0.0.1:6379>LPUSHqueue2second(integer)1//当两个键都有元素时,按照从左到右的顺序取第一个键中的一个元素127.0.0.1:6379>BRPOPqueue1queue201)"queue1"2)"first"127.0.0.1:6379>BRPOPqueue1queue201)"queue2"2)"second"1234567891011122. “发布/订阅”模式“发布/订阅”(publish/subscribe)模式同样可以实现进程间通信,==订阅者可以订阅一个或多个频道(channel),而发布者可以向指定的频道发送

redis 6426 0

作者头像zyw3272017.05.19 17:35 

async与await

async与await的用法functiontest(){ returnnewPromise((resolve,reject)=>{ mysql.query(sql,(error,result,fields)=>{ if(error){ reject(error); }else{ resolve([result,fields]); } }) }); } asyncfunctionexceTest(){ returnawaittest(); } vardata=awaitexceTest();async的使用条件:必须是promise对象

NODEJS 3182 5

作者头像zyw3272017.06.02 13:16 

get_magic_quotes_gpc方法的作用

get_magic_quotes_gpc — 获取当前 magic_quotes_gpc 的配置选项设置说明boolget_magic_quotes_gpc(void)返回当前 magic_quotes_gpc 配置选项的设置记住,尝试在运行时设置 magic_quotes_gpc 将不会生效。更多关于 magic_quotes 的信息参见安全一章。返回值如果 magic_quotes_gpc 为关闭时返回 0,否则返回 1。在 PHP 5.4.O 起将始终返回 FALSE 。更新日志版本说明php5.4.0 始终返回 FALSE ,因为这个魔术引号功能已经从 PHP 中移除了。 范例Example #1 get_magic_quotes_gpc() 例子<?php //如果启用了魔术引号 echo$_POST['lastname'];//O\'reilly echoaddslashes($_POST['lastname']);//O\\\'reilly //适用各个PHP版本的用法 if(get_magic_quotes_gpc()){ $lastname=stripslashes($_POST['lastname']); } else{ $lastname=$_POST['lastname']; } //如果使用MySQL $lastname=mysql_real_escape_string($lastname); echo$lastname;//O\'reilly $sql="INSERTINTOlastnames(lastname)VALUES('$lastname')"; ?>注释Note:如果指令 magic_quotes_sybase 为 ON,它会完全覆盖 magic_quotes_gpc。 所以即使 get_magic_quotes_gpc() 返回 TRUE ,双引号、反斜杠或 NUL 都不会被转义。 只有单引号会被转义。 这种情况下它们看上去像:''

PHP 2051 1

作者头像admin2017.05.11 15:58 

java文件流操作

java文件流操作,源码如下:packagecode; importjava.io.File; importjava.io.IOException; publicclassIOStream{ publicstaticvoidmain(String[]args) { Filef=newFile("F:\\test.txt"); //取得文件路径 System.out.println("文件路径为:"+f.getAbsolutePath()); //得到文件的大小 System.out.println("文件的大小为:"+f.length()); System.out.println("文件可读不:"+f.canRead()); Filef1=newFile("F:\\test1.txt"); if(!f1.exists()){ //可以创建 try{ f1.createNewFile(); }catch(IOExceptione){ //TODO自动生成的catch块 e.printStackTrace(); } }else System.out.println("文件已存在!不需要创建!"); Filef2=newFile("F:\\javaFileoper\\test"); if(f2.isDirectory()){ System.out.println("文件夹已存在!"); }else{ //创建文件 f2.mkdir(); } //列出一个文件下的所有文件 Filef3=newFile("F:\\"); if(f3.isDirectory()){ Filelists[]=f3.listFiles(); for(inti=0;i<lists.length;i++){ System.out.println("文件名:"+lists[i].getName()); } } } }

java 9579 5

作者头像admin2017.05.11 15:54 

java连接sql server数据库

java连接sql server数据库packagecode; importjava.sql.Connection; importjava.sql.DriverManager; importjava.sql.PreparedStatement; importjava.sql.ResultSet; importjava.sql.Statement; publicclassDbAdapter{ Connectioncon; Statementsm; ResultSetrs; PreparedStatementps=null; publicstaticvoidmain(String[]args) { DbAdapters=newDbAdapter(); Stringsql="updateuserssetusername='1'whereusername='1'"; s.LinkSql(sql); } publicbooleanLinkSql(Stringsql) { try{ Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); con=DriverManager.getConnection("jdbc:sqlserver://localhost:1433;DatabaseName=Student","sa","327523057"); sm=con.createStatement(); //添加删除修改数据 //sm.executeUpdate("insertintousersvalues('1','1')"); //sm.executeUpdate("deletefromuserswhereusername='1'"); //sm.executeUpdate("updateuserssetusername='1'whereusername='1'"); rs=sm.executeQuery(sql); if(rs.next()){ returntrue; }else returnfalse; }catch(Exceptione){ e.printStackTrace(); }finally{ try{ if(sm!=null) sm.close(); if(con!=null) con.close(); }catch(Exceptione){ e.printStackTrace(); } } returnfalse; } }需要引入包:sqljdbc.zip引入包可以参考:http://blog.okgoes.com/index/index/detail?id=9&type=blog&

java 3576 3

作者头像admin2017.05.11 15:53 

java求水仙花数

水仙花数是指一个 n 位正整数 ( n≥3 ),它的每个位上的数字的 n 次幂之和等于它本身。(例如:1^3 + 5^3+ 3^3 = 153)。什么是水仙花数水仙花数只是自幂数的一种,严格来说3位数的3次幂数才称为水仙花数。附:其他位数的自幂数名字一位自幂数:独身数两位自幂数:没有三位自幂数:水仙花数四位自幂数:四叶玫瑰数五位自幂数:五角星数六位自幂数:六合数七位自幂数:北斗七星数八位自幂数:八仙数九位自幂数:九九重阳数十位自幂数:十全十美数packagecode; /** * *@authorSmart * */ publicclassNarcissistic{ publicstaticvoidmain(String[]args) { inti,j,k,m; for(m=100;m<1000;m++){ i=m%10; j=((m-i)%100)/10; k=(m-j*10-i)/100; if((k*k*k+j*j*j+i*i*i)==m) System.out.println(m+"是一个水仙花数"); } } }结果如下:153是一个水仙花数 370是一个水仙花数 371是一个水仙花数 407是一个水仙花数

水仙花数 3620 4

作者头像admin2017.05.11 15:53 

java程序求素数

java求素数packagecode; /** * *@authorSmart * */ publicclassPrame{ /** *@paramargsthecommandlinearguments */ publicstaticvoidmain(String[]args) { inta,b; a=0; b=0; for(inti=101;i<=200;i++){ for(intj=2;j<i;j++){ if(i%j==0) a++; } if(a<1){ b++; System.out.println(i); a=0; }else a=0; } //TODOcodeapplicationlogichere System.out.println("101至200之间有"+b+"个素数"); } }优化后的程序packagecode; /** * *@authorSmart * */ publicclassPrameB{ /** *@paramargsthecommandlinearguments */ publicstaticvoidmain(String[]args){ intcount=0; for (inti=101;i<200;i+=2){ booleanb=false; for(intj=2;j<=Math.sqrt(i);j++){ if(i%j==0){ b=false;break; }else b=true; } if(b==true){ count++;System.out.println(i); } } System.out.println("素数个数是:"+count); } }

java 3520 4

作者头像admin2017.05.11 15:53 

java之计算器的实现

java实现计算器程序,代码如下:packagecode; importjava.awt.BorderLayout; importjava.awt.Color; importjava.awt.Container; importjava.awt.Font; importjava.awt.GridLayout; importjava.awt.event.ActionEvent; importjava.awt.event.ActionListener; importjava.util.regex.Pattern; importjavax.swing.JButton; importjavax.swing.JFrame; importjavax.swing.JMenu; importjavax.swing.JMenuBar; importjavax.swing.JMenuItem; importjavax.swing.JPanel; importjavax.swing.JTextField; /** * *@authorSmart * */ publicclassCalculatorextendsJFrameimplementsActionListener{ privateJMenuBarjmb; privateJMenujm; privateJMenuItemjmi1; privateJTextFieldresult; privateJButtonkey[]; privateJPaneljp_but,jp_cal; privateMainpadjp_main; privateContainercon; privatedoubleopernum; privateStringkeytitle[]={"7","8","9","+","4","5","6","-","1","2","3","*","0",".","=","/","!","^","C","-/+","1/x","sqrt","四舍五入","back"}, opers=""; publicCalculator() { this.setSize(400,450); this.setTitle("计算器"); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.jmb=newJMenuBar(); this.jm=newJMenu("文件"); this.jmi1=newJMenuItem("退出"); this.jm.add(this.jmi1); th

java 3580 2

作者头像admin2017.05.11 15:52 

java之九九乘法表的输出

九九乘法表输出,代码如下:packagecode; /** * *@authorSmart * */ publicclassMultiply{ publicstaticvoidmain(String[]args) { inti,j; for(i=1;i<10;i++){ for(j=1;j<=i;j++){ System.out.print(j+"*"+i+"="+i*j+"\t"); } System.out.println(""); } } }输出结果如下:1*1=1 1*2=2 2*2=4 1*3=3 2*3=6 3*3=9 1*4=4 2*4=8 3*4=12 4*4=16 1*5=5 2*5=10 3*5=15 4*5=20 5*5=25 1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36 1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49 1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64 1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81

java 36408 9

作者头像admin2017.06.01 11:50 

java之password组件的使用

java之password组件的使用frames.javapackagepasswd; importjava.awt.*; importjava.awt.event.*; importjavax.swing.*; importcom.borland.jbcl.layout.*; /** *<p>Title:</p> *<p>Description:</p> *<p>Copyright:Copyright(c)2017</p> *<p>Company:</p> *@authorsmart *@version1.0 */ publicclassFramesextendsJFrame{ JPanelcontentPane; XYLayoutxYLayout1=newXYLayout(); Panelpanel1=newPanel(); Panelpanel2=newPanel(); Panelpanel3=newPanel(); Panelpanel4=newPanel(); TextFieldtextField1=newTextField(); CheckboxGroupcheckboxGroup1=newCheckboxGroup(); Checkboxcheckbox1=newCheckbox(); Checkboxcheckbox2=newCheckbox(); Labellabel1=newLabel(); TextFieldtextField2=newTextField(); Labellabel2=newLabel(); TextFieldtextField3=newTextField(); Buttonbutton1=newButton(); //Constructtheframe publicFrames() { enableEvents(AWTEvent.WINDOW_EVENT_MASK); try{ jbInit(); }catch(Exceptione){ e.printStackTrace(); } } //Componentinitialization privatevoidjbInit()throwsException { //setIconImage(Toolkit.getDefaultToolkit().createImage(Frame1.class.getResource("[YourIcon]"))); contentPane=(JPanel)this.getContentPane(); contentPane.setLayout(xYLayout1); this.setSize(newDimension(400,300)); this.setTitle("FrameTitle"); textField1.setText(""); checkbox1.setCheckboxGroup(checkboxGroup1); checkbox1.setLabe

java 3025 4

a6bfb44cbd5549740eb36647f36ef83a