redis 安装

1:下载redis
下载地址 http://code.google.com/p/redis/downloads/list
 
下载后解压 tar zxvf redis-1.2.6.tar.gz 到任意目录
 
解压后,进入redis目录
    cd /usr/local/redis-1.2.6  
    make  
    make install
 
设置内存分配策略(可选,根据服务器的实际情况进行设置)
/proc/sys/vm/overcommit_memory
可选值:0、1、2。
0, 表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许;否则,内存申请失败,并把错误返回给应用进程。
1, 表示内核允许分配所有的物理内存,而不管当前的内存状态如何。
2, 表示内核允许分配超过所有物理内存和交换空间总和的内存
值得注意的一点是,redis在dump数据的时候,会fork出一个子进程,理论上child进程所占用的内存和parent是一样的,比如parent 占用的内存为8G,这个时候也要同样分配8G的内存给child,如果内存无法负担,往往会造成redis服务器的down机或者IO负载过高,效率下降。所以这里比较优化的内存分配策略应该设置为 1(表示内核允许分配所有的物理内存,而不管当前的内存状态如何)
 
 
启动redis
 redis-server /etc/redis.conf  
 
 
测试redis
    [root@----]# redis-cli  
    set zuaa 1
    get zuaa
    “1”
 
查看是否成功启动 
$ ps -ef | grep redis   
或 
./redis-cli ping 
PONG
 
关闭redis服务
    redis-cli shutdown  

redis服务关闭后,缓存数据会自动dump到硬盘上,硬盘地址为redis.conf中的配置项dbfilename dump.rdb所设定
强制备份数据到磁盘,使用如下命令

    redis-cli save 或者 redis-cli -p 6380 save(指定端口)

 
 
 
其他:客户端也可以使用telnet形式连接。

[root@dbcache conf]# telnet 127.0.0.1 6379 
Trying 127.0.0.1… 
Connected to dbcache (127.0.0.1). 
Escape character is ‘^]’. 
set foo 3 
bar 
+OK 
get foo 
$3 
bar 
^] 
telnet> quit 
Connection closed.

通过 Wiz 发布

redis 配置进阶 主从

redis.conf的主 要配置参数的意义:

daemonize 是否以后台进程运行,默认为no
pidfile
如以后台进程运行,则需指定一个pid,默认为
/var/run/redis.pid
bind
绑定主机IP,默认值为127.0.0.1(注释)

port
监听端口,默认为6379
timeout
超时时间,默认为300(秒)

loglevel
日志记录等级,有4个可选值,debugverbose(默认值),noticewarning
logfile
日志记录方式,默认值为
stdout
databases
可用数据库数,默认值为16,默认数据库为
0
save
指出在多长时间内,有多少次更新操作,就将数据同步到数据文件。这个可以多个条件配合,比如默认配置文件中的设置,就设置了三个条件。

save 900 1 900
秒(15分钟)内至少有1key被改变
save 300 10 300
秒(5分钟)内至少有300key被改变
save 60 10000 60
秒内至少有10000key被改变
rdbcompression
存储至本地数据库时是否压缩数据,默认为yes
dbfilename
本地数据库文件名,默认值为
dump.rdb
dir
本地数据库存放路径,默认值为
./
slaveof
当本机为从服务时,设置主服务的IP及端口(注释)

masterauth
当本机为从服务时,设置主服务的连接密码(注释)
requirepass
连接密码(注释)
maxclients
最大客户端连接数,默认不限制(注释)
maxmemory
设置最大内存,达到最大内存设置后,Redis会先尝试清除已到期或即将到期的Key,当此方法处理后,任到达最大内存设置,将无法再进行写入操作。(注释)
appendonly
是否在每次更新操作后进行日志记录,如果不开启,可能会在断电时导致一段时间内的数据丢失。因为redis本身同步数据文件是按上面save条件来同步的,所以有的数据会在一段时间内只存在于内存中。默认值为no
appendfilename
更新日志文件名,默认值为appendonly.aof(注释)

appendfsync
更新日志条件,共有3个可选值。no表示等操作系统进行数据缓存同步到磁盘,always表示每次更新操作后手动调用fsync()将数据写到磁盘,everysec表示每秒同步一次(默认值)。
vm-enabled
是否使用虚拟内存,默认值为no
vm-swap-file
虚拟内存文件路径,默认值为/tmp/redis.swap,不可多个Redis实例共享

vm- max-memory
只可以使用内存的最大值 如果超过了此值就使用虚拟内存了交换是使用次数少为主放在虚拟内存中去。默认值为0
 
配置出从
在配置文件redis.conf中加入
# slaveof <masterip> <masterport>
slaveof localhost 6380

通过 Wiz 发布

PictureCutter

/**

 * Created by IntelliJ IDEA.

  * Date: 11-10-26

 * Time: 下午2:46

 * To change this template use File | Settings | File Templates.

 */

 

import javax.imageio.ImageIO;

import java.awt.*;

import java.awt.color.ColorSpace;

import java.awt.image.*;

import java.io.File;

import java.io.IOException;

 

public class PictureCutter {

 

    /**

     * 缩放图像

     *

     * @param srcImageFile 源图像文件地址

     * @param result       缩放后的图像地址

     * @param scale        缩放比例   (新的高/旧的高)

     */

    public static void scale(String srcImageFile, String result, long scale) {

        try {

            BufferedImage src = ImageIO.read(new File(srcImageFile)); // 读入文件

            int width = src.getWidth(); // 得到源图宽

            int height = src.getHeight(); // 得到源图长

 

            // 放大

            width = (int) (width * scale);

            height = (int) (height * scale);

 

            Image image = src.getScaledInstance(width, height,

                    Image.SCALE_DEFAULT);

            BufferedImage tag = new BufferedImage(width, height,

                    BufferedImage.TYPE_INT_RGB);

            Graphics g = tag.getGraphics();

            g.drawImage(image, 0, 0, null); // 绘制缩小后的图

            g.dispose();

            ImageIO.write(tag, “JPEG”, new File(result));// 输出到文件流

        } catch (IOException e) {

            e.printStackTrace();

        }

    }

 

    /**

     * 图像切割

     *

     * @param srcImageFile 源图像地址

     * @param descDir      切片目标文件夹

     * @param destWidth    目标切片宽度

     * @param destHeight   目标切片高度

     */

    public static void cut(String srcImageFile, final String descDir, final int destWidth,

                           final int destHeight) {

        try {

            // 读取源图像

            BufferedImage bi = ImageIO.read(new File(srcImageFile));

            final int srcWidth = bi.getHeight(); // 源图宽度

            final int srcHeight = bi.getWidth(); // 源图高度

            //如果源图片的宽度和长度都小于目标图片,不用处理。

            if (srcWidth <= destWidth && srcHeight <= destHeight) return;

 

            // 计算切片的横向和纵向数量

            int temp = srcWidth / destWidth;

            int cols = srcWidth % destWidth == 0 ? temp : temp + 1; // 切片横向数量

            temp = srcHeight / destHeight;

            int rows = srcHeight % destHeight == 0 ? temp : temp + 1;  //切片纵向数量

 

            // 循环建立切片

            // 改进的想法:是否可用多线程加快切割速度

            final Image image = bi.getScaledInstance(srcWidth, srcHeight, Image.SCALE_DEFAULT);

            for (int i = 0; i < rows; i++) {

                for (int j = 0; j < cols; j++) {

                    long bg = System.currentTimeMillis();

 

 

                    // 四个参数分别为图像起点坐标和宽高

                    // 即: CropImageFilter(int x,int y,int width,int height)

                    ImageFilter cropFilter = new CropImageFilter(j * destWidth, i * destHeight, Math.min(destWidth, srcWidth – j * destWidth), Math.min(srcHeight – i * destHeight, destHeight));

 

                    ImageProducer imgProducer = image.getSource();

 

                    Image img = Toolkit.getDefaultToolkit().createImage(new FilteredImageSource(imgProducer, cropFilter));

 

                    BufferedImage tag = new BufferedImage(Math.min(destWidth, srcWidth – j * destWidth), Math.min(srcHeight – i * destHeight, destHeight), BufferedImage.TYPE_INT_RGB);

                    Graphics g = tag.getGraphics();

                    g.drawImage(img, 0, 0, null); // 绘制小图

 

                    g.dispose();

                    // 输出为文件

                    String small_pic_name_path = descDir + “map_” + i + “_” + j + “.jpg”;

 

                    ImageIO.write(tag, “JPEG”, new File(small_pic_name_path));

                    System.out.println(“Thread” + Thread.currentThread().getId() + “\t切割第\t” + i + “_” + j + “\t张图片,耗时:\t” + (System.currentTimeMillis() – bg) + ” 毫秒”);

 

                }

            }

 

 

        } catch (Exception e) {

            e.printStackTrace();

        }

    }

 

    /**

     * 图像类型转换

     * GIF->JPG GIF->PNG PNG->JPG PNG->GIF(X)

     */

    public static void convert(String source, String result) {

        try {

            File f = new File(source);

            f.canRead();

            f.canWrite();

            BufferedImage src = ImageIO.read(f);

            ImageIO.write(src, “JPG”, new File(result));

        } catch (Exception e) {

            // TODO Auto-generated catch block

            e.printStackTrace();

        }

    }

 

    /**

     * 彩色转为黑白

     *

     * @param source

     * @param result

     */

    public static void gray(String source, String result) {

        try {

            BufferedImage src = ImageIO.read(new File(source));

            ColorSpace cs = ColorSpace.getInstance(ColorSpace.CS_GRAY);

            ColorConvertOp op = new ColorConvertOp(cs, null);

            src = op.filter(src, null);

            ImageIO.write(src, “JPEG”, new File(result));

        } catch (IOException e) {

            e.printStackTrace();

        }

    }

 

    /**

     * @param args 3X2 4X3 4X4 5X4

     */

    public static void main(String[] args) {

        //    if(1==1){

        //        return;

        //    }

        //cut(“ss.jpg”, “./ss/”, 256, 256);

        PictureCutter.scale(“c://1.jpg”, “c://2.jpg”, 2);

        //    Properties p= System.getProperties();

        //    System.out.println(p);

    }

 

    public static void cut1(String srcImageFile, final String descDir, final int destWidth,

                            final int destHeight) {

        try {

            // 读取源图像

            BufferedImage bi = ImageIO.read(new File(srcImageFile));

            final int srcWidth = bi.getHeight(); // 源图宽度

            final int srcHeight = bi.getWidth(); // 源图高度

            //如果源图片的宽度和长度都小于目标图片,不用处理。

            if (srcWidth <= destWidth && srcHeight <= destHeight) return;

 

            // 计算切片的横向和纵向数量

            int temp = srcWidth / destWidth;

            int cols = srcWidth % destWidth == 0 ? temp : temp + 1; // 切片横向数量

            temp = srcHeight / destHeight;

            int rows = srcHeight % destHeight == 0 ? temp : temp + 1;  //切片纵向数量

 

            // 循环建立切片

            // 改进的想法:是否可用多线程加快切割速度

            final Image image = bi.getScaledInstance(srcWidth, srcHeight, Image.SCALE_DEFAULT);

            for (int i = 0; i < rows; i++) {

                for (int j = 0; j < cols; j++) {

                    long bg = System.currentTimeMillis();

 

 

                    // 四个参数分别为图像起点坐标和宽高

                    // 即: CropImageFilter(int x,int y,int width,int height)

                    ImageFilter cropFilter = new CropImageFilter(j * destWidth, i * destHeight, Math.min(destWidth, srcWidth – j * destWidth), Math.min(srcHeight – i * destHeight, destHeight));

 

                    ImageProducer imgProducer = image.getSource();

 

                    Image img = Toolkit.getDefaultToolkit().createImage(new FilteredImageSource(imgProducer, cropFilter));

 

                    BufferedImage tag = new BufferedImage(Math.min(destWidth, srcWidth – j * destWidth), Math.min(srcHeight – i * destHeight, destHeight), BufferedImage.TYPE_INT_RGB);

                    Graphics g = tag.getGraphics();

 

                    g.drawImage(img, 0, 0, null); // 绘制小图

 

                    g.dispose();

                    // 输出为文件

                    String small_pic_name_path = descDir + “map_” + i + “_” + j + “.jpg”;

 

                    ImageIO.write(tag, “JPEG”, new File(small_pic_name_path));

                    System.out.println(“Thread” + Thread.currentThread().getId() + “\t切割第\t” + i + “_” + j + “\t张图片,耗时:\t” + (System.currentTimeMillis() – bg) + ” 毫秒”);

 

                }

            }

 

 

        } catch (Exception e) {

            e.printStackTrace();

        }

    }

 

 

 

}

Jquery表单验证插件–Validform:一行代码搞定整站的

http://home.blueidea.com/apps.php?do=bxna&ac=view&feedid=12443

 

你没看错,就一行代码搞定整站的表单验证!

1
$(".demoform").Validform();

为什么能如此方便?插件的核心思想就是把所有的验证条件及验证提示信息绑定到每个表单元素,让验证代码在执行时只是核对表单下各元素的值是否跟绑定的验证条件相符,这样你可以随便添加或者去掉任一表单元素而不必修改验证代码,从而使仅用一行代码去搞定整站的表单验证的梦想成为现实!

在线Demo | 马上下载体验

效果图:

功能介绍:
1、支持一个页面多表单的检测。例如你给页面上的各form绑定同样的class名称“demoform”,只需在页面上写上一句 $(“.demoform”).Validform(),各表单便会独立检测;
2、两种信息提示效果,一个是元素右侧出现提示信息,一个是弹出信息框。另外还附加了$.Showmsg()、$.Hidemsg()全局弹出/关闭信息框方法以便整站有一个统一的信息提示效果;
3、指定表单下任一元素在单击时触发表单提交事件;
4、支持ajax提交表单数据,也支持ajax实时反馈验证结果(如常见的用户注册表单下的用户名检测);
5、支持开启网速慢时的二次提交防御(有时连续的点击提交表单按钮会产生多次的表单提交结果);
6、可检测多个文本框内容是否一致(例如常见的两次密码输入确认);
7、囊括11种常见的格式验证形式。

使用方法:

1
2
3
4
5
6
7
8
9
$(".demoform").Validform({//指定具体参数,实现更多功能;
	btnSubmit:".btn_sub",
	tiptype:2,
	postonce:true,
	ajaxurl:"ajax_post.php",
        callback:function(data){
            //这里执行回调操作;
        }
});

参数说明: 【所有参数均为可选项】
○ 必须是表单对象执行Validform方法,示例中“.demoform”就是绑定在form元素上的class名称;
○ btnSubmit:指定表单下的哪一个按钮触发表单提交事件,如果表单下有submit按钮可以省略。示例中“.btn_sub”是该表单下要绑定点击提交表单事件的按钮,程序会在btnSubmit所在表单下查找该对象;
○ tiptype:指定提示效果,可选值 1 | 2, 默认为1。 1=>弹出提示框,2=>表单元素右侧提示;
○ postonce:指定是否开启网速慢时的二次提交防御,true开启,不指定则默认关闭;
○ ajaxurl:指定处理ajax表单数据的后台文件,注意处理完数据输出相应反馈信息,这个页面输出的内容就是表单提交后前台页面所看到的反馈信息。
○ callback:在使用ajax提交表单数据时,数据提交后的回调函数。返回数据data是json格式,{“info”:”demo info”,”status”:”y”},info: 输出提示信息,status: 返回提交数据的状态,是否提交成功,如可以用”y”表示提交成功,”n”表示提交失败,在ajax_post.php文件返回数据里自定字符,主要用在callback函数里根据该值执行相应的回调操作。你也可以在ajax_post.php文件返回更多信息在这里获取,进行相应操作;

怎样给表单元素绑定验证类型?
示例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<!--ajax实时验证用户名-->
<input type="text" value="" name="name" datatype="s5-16" ajaxurl="valid.php" nullmsg="请输入用户名!" errormsg="昵称至少5个字符,最多16个字符!" />
 
<!--密码-->
<input type="password" value="" name="userpassword" datatype="*6-15" errormsg="密码范围在6~15位之间,不能使用空格!" />
<!--确认密码-->
<input type="password" value="" name="userpassword2" datatype="*" recheck="userpassword" errormsg="您两次输入的账号密码不一致!" />
 
<!--默认提示文字-->
<textarea tip="请在这里输入您的意见。" errormsg="很感谢您花费宝贵时间给我们提供反馈,请填写有效内容!"  datatype="s" altercss="gray" class="gray" name="msg" value="">请在这里输入您的意见。</textarea>
 
<!--单选按钮-->
<input type="radio" value="1" name="gender" id="male" datatype="radio" errormsg="请选择性别!" /><label for="male">男</label>
<input type="radio" value="2" name="gender" id="female" /><label for="female">女</label>
 
<!--复选框-->
<input name="shoppingsite2" id="shoppingsite21" type="checkbox"  value="1" datatype="checkbox" errormsg="请选择您常去的购物网站!" /><label for="shoppingsite21">淘宝网</label>
<input name="shoppingsite2" id="shoppingsite22" type="checkbox"  value="2" /><label for="shoppingsite22">当当网</label>
 
<!--下拉框-->
<select name="province" id="province" datatype="select" errormsg="请选择省份!" ><option value="">--请选择省份--</option><option value="1">江西省</option></select>

说明:
凡要验证格式的元素均需添加datatype属性,datatype可选值目前有11类,用来指定不同的验证格式【如果还不能满足您的验证需求,可以自行在regcheck方法中添加】。

datatype:* | *6-16 | n | s | s6-18 | p | m | e | radio | checkbox | select
*:检测是否有输入,可以输入任何字符,不留空即可通过验证;
*6-16:检测是否为6到16位任意字符;
n:数字类型;
s:字符串类型;
s6-18:6到18位字符串;
p:验证是否为邮政编码;
m:手机号码格式;
e:email格式;
radio:如果要验证的元素为单选框,datatype设置为radio;
checkbox:如果要验证的元素为复选框,datatype设置为checkbox;
select:如果要验证的元素为下拉框,datatype设置为select。
注意radio,checkbox,select的value值为空时不能通过检测,要非空值才能通过。radio和checkbox元素只需给该组的第一个元素绑定datatype属性即可,请参看上面的示例代码。

其他的附加属性:
nullmsg:是指定没有填入内容时出现的提示信息,不指定默认是“请填入信息!”,另外当datatype为radio、checkbox或select时,因为这三种类型只要为空值就表示出错,提示errormsg所指定信息,所以这三类不需要绑定该属性;
errormsg:是指定验证格式不符时出现的提示信息,不指定默认是“请输入正确信息!”;
recheck:是用来指定两个表单元素值一致性检测的另外一个对象,赋给它另外一个对象的name属性值即可;
tip:是指定表单元素的提示信息;指定后该元素会有focus时提示信息消去,没有输入内容blur时出现提示信息的效果,请参看demo页的“备注”效果;
altercss:是指定有tip属性的元素默认提示文字显示时的样式,当该元素focus时程序会把这个样式去掉,blur时如果值为空或者跟提示文字一样则再加上该样式;
ajaxurl:指定ajax实时验证的后台文件路径,给需要后台数据库验证信息的对象绑定该属性。注意该文件输出的内容就是前台显示的验证出错的反馈信息,如果验证通过请输出小写字母”y”

介绍完了,欢迎下载使用,反馈您的意见或建议。