11月 24

首先抄袭一段Redis的定于

redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set –有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。

Redis 是一个高性能的key-value数据库。 redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部 分场合可以对关系数据库起到很好的补充作用。它提供了Java,C/C++,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby,Erlang等客户端,使用很方便。[1] 

Redis支持主从同步。数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。这使得Redis可执行单层树复制。从盘可以有意无意的对数据进行写操作。由于完全实现了发布/订阅机制,使得从数据库在任何地方同步树时,可订阅一个频道并接收主服务器完整的消息发布记录。同步对读取操作的可扩展性和数据冗余很有帮助。


Redis官网:http://www.redis.io/

安装:

下载,安装

wget http://download.redis.io/releases/redis-2.8.17.tar.gz
tar xzf redis-2.8.17.tar.gz
cd redis-2.8.17
make 
make install

配置Redis.conf文件

cp ./redis.conf /etc/redis.conf   
mkdir -p /var/lib/redis  
mkdir -p /var/log/redis  
chown root /var/lib/redis

修改文件/etc/init.d/redis

###########################  
PATH=/usr/local/bin:/sbin:/usr/bin:/bin  
   
REDISPORT=6379  
EXEC=/usr/local/bin/redis-server  
REDIS_CLI=/usr/local/bin/redis-cli  
   
PIDFILE=/var/run/redis.pid  
CONF="/etc/redis.conf"  
   
case "$1" in  
    start)  
        if [ -f $PIDFILE ]  
        then  
                echo "$PIDFILE exists, process is already running or crashed"  
        else  
                echo "Starting Redis server..."  
                $EXEC $CONF  
        fi  
        if [ "$?"="0" ]  
        then  
              echo "Redis is running..."  
        fi  
        ;;  
    stop)  
        if [ ! -f $PIDFILE ]  
        then  
                echo "$PIDFILE does not exist, process is not running"  
        else  
                PID=$(cat $PIDFILE)  
                echo "Stopping ..."  
                $REDIS_CLI -p $REDISPORT SHUTDOWN  
                while [ -x ${PIDFILE} ]  
               do  
                    echo "Waiting for Redis to shutdown ..."  
                    sleep 1  
                done  
                echo "Redis stopped"  
        fi  
        ;;  
   restart|force-reload)  
        ${0} stop  
        ${0} start  
        ;;  
  *)  
    echo "Usage: /etc/init.d/redis {start|stop|restart|force-reload}" >&2  
        exit 1  
esac  
##############################
chmod +x /etc/init.d/redis

启动

/etc/init.d/redis start   #启动 
/etc/init.d/redis stop    #停止 
ps -aux | grep redis    #查看redis进程是否启动

测试

[root@localhost ~]# redis-cli
127.0.0.1:6379> set xxx fff
OK
127.0.0.1:6379> set ggh ghg
OK
127.0.0.1:6379>

另外记录一款Win下的可视化Client

 redisdesktop 

官网:http://redisdesktop.com/

可以很方便的管理Redis

written by ocean

11月 23

SQLDELTA是一款便捷实用的数据库管理工具。使用它可以找到现在数据库项目与过去数据库的异同点。并可以使你的产品数据库与你的开发数据库同步,减少你因为同步数据库而进行复杂的工作。还有一个好处是你可以使用它的对比和同步功能来为你目前的项目创建一个供测试使用的数据库。可以批量的转移你的数据。


官网地址:http://www.sqldelta.com/

 

我下载了SQL Delta Duo for SQL Server

首先 New Project

在Project Details页面填写Source和Target的配置信息.

填写完毕执行 RUN 按钮


Status可以比较DB的不同,并且很方便的实现同步

written by ocean

11月 19

公司有一些项目因为要操作本地资源,比方说IO操作,读卡器等.又不想使用ActiveX之类的.

有个vendor提出使用html5+sqlite的互操作方式,被领导咔了

于是就琢磨琢磨写了个简单demo

先上第一个方案. 

WinForm+WebBrowser控件

跟Local资源打交道用winform,

通信方式, 

Winform call webform:

WebBrowser控件有语法可以直接通过javascript的方式调用

Webform call winform:

Winform启动一个local的http服务器,webform使用ajax call的方式沟通,因为涉及到跨域,需要jsonp的方式

页面代码

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
    <script src="Scripts/jquery-1.8.2.js"></script>
    <script>
        $(document).ready(function () {
            $("#checkin").click(function () { 
                $.ajax({
                    type: "get",
                    url: "http://localhost:1234/?name=ocean&password=123456",
                    dataType: "jsonp",
                    data:{
                        "fileName": $("#txtFileName").val()
                    },
                    jsonp: "callback",
                    jsonpCallback: "jsonpCallback",
                    success: function (json) {
                        alert(json.message);
                    },
                    error: function () {
                        alert('fail');
                    }
                }); 
            });
        }); 
        function getMsg(msg) {
            alert(msg); 
        }
    </script>

</head>
<body>
     
    <input type="text" id="txtFileName" />
    <input type="button" id="checkin" value="Create Txt File" />

    <a href="/ddff.aspx"> 404 page </a>

</body>
</html>

WinForm这边使用了HttpListener做服务器

另外为了省略掉webform的iis,还使用了 CassiniDev做Web的服务器

using CassiniDev;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using WindowsFormsControlLibrary1;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
         

        public Form1()
        {
            InitializeComponent();

            this.advWebBrowser1.NavigateError += advWebBrowser1_NavigateError;

            //this.webBrowser1.StatusTextChanged  += webBrowser1_StatusTextChanged;
            //this.webBrowser1.Navigated += webBrowser1_NavigateError;
        }

        private void button1_Click(object sender, EventArgs e)
        {

            List<string> list=new List<string>();
            list.Add("ddddd");

            object data = this.advWebBrowser1.Document.InvokeScript("getMsg",list.ToArray());


        }

        private void Form1_Load(object sender, EventArgs e)
        {
            listener = new HttpListener();
            listener.Prefixes.Add("http://127.0.0.1:1234/");
            listener.Start();
            listener.BeginGetContext(EndGetRequest, listener); ;


            CassiniDev.Server server = new CassiniDev.Server(99,@"D:\Test\WebApplication.IIS\WebApplication1");
            server.Start();

        }


 

        HttpListener listener;

        void EndGetRequest(IAsyncResult result)
        {

            HttpListenerContext context = null;
            System.Net.HttpListener listener = (System.Net.HttpListener)result.AsyncState;
            try
            {
                context = listener.EndGetContext(result);
                HandleRequest(context);
            }
            catch (Exception ex)
            {
                //Console.Write("Exception in listener: {0}{1}", Environment.NewLine, ex);
            }
            finally
            {
                if (context != null)
                    context.Response.Close();
                if (listener.IsListening)
                    listener.BeginGetContext(EndGetRequest, listener);
            }
        }
        void HandleRequest(HttpListenerContext context)
        {
            Dictionary<string, string> dic = new Dictionary<string, string>();
            string responseStr = "";
            for (int i = 0; i < context.Request.QueryString.Count; i++)
            {
                if (!dic.ContainsKey(context.Request.QueryString.Keys[i].ToString()))
                {
                    dic.Add(context.Request.QueryString.Keys[i].ToString(), context.Request.QueryString[i].ToString());
                }

                responseStr += context.Request.QueryString.Keys[i] + "=" + context.Request.QueryString[i] + "\r\n";
            }


            //to do hardware
            {
                File.WriteAllText(@"C:\" + dic["fileName"] + ".txt", Params.Now.ToString());
            } 

            responseStr = "jsonpCallback({'message':'Create File " + dic["fileName"] + ".txt Success'});";

            byte[] response = System.Text.Encoding.UTF8.GetBytes(responseStr);
            context.Response.ContentType = "text/plain";
            context.Response.StatusCode = 200;
            context.Response.ContentLength64 = response.LongLength;
            context.Response.OutputStream.Write(response, 0, response.Length);
        }

        private void webBrowser1_StatusTextChanged(object sender, EventArgs e)
        {

            MessageBox.Show(
             
           this.advWebBrowser1.StatusText);

           //  this.webBrowser1.
        }

        public void advWebBrowser1_NavigateError(object sender, WebBrowserNavigateErrorEventArgs e)
        {
            if (e.StatusCode == HttpStatusCode.NotFound)
            {
               
                // to do 404
            }

        }
    }
}


相比于HTML5的读取Sqlite比较靠谱了.

但是又发现一个更好的办法

<!DOCTYPE html> 
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
    <script src="Scripts/jquery-1.8.2.min.js"></script>
    <script> 
        function WebCallWin() {
            var txtName = $("#txtName").val();
            var message = window.external.WebCallWinFunction(txtName);
            alert(message);
        }
        function WebCallWinClear() { 
           window.external.WebCallWinFunctionClear(); 
        } 
        function WinCallWeb(userName) {
            $("#txtFromWin").text("Welcome to web:" +userName); 
        }
        function WinCallWebClear() {
            $("#txtFromWin").text("");
        } 
    </script>
</head>
<body> 
    this is a aspx page.<br />
<br /><br />
    UserName <input type="text" id="txtName" /> <input type="button" value="Web Call Win"  onclick="WebCallWin()" />
    <input type="button" value="Web Call Win"  onclick="WebCallWinClear()" />
    <br /><br /> 
   <span id="txtFromWin"></span> 
</body>
</html>
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WinWebInvokeDemo.WinFormsApp
{

    [System.Runtime.InteropServices.ComVisible(true)]
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            webBrowser1.ObjectForScripting = this;
        } 
        private void Form1_Load(object sender, EventArgs e)
        {

        } 
        public string WebCallWinFunction(string userName)
        { 
            this.label1.Text = "Welcome to Winform : " + userName; 
            return string.Format("Hello:{0}. I am from winform",userName);
        }

        public void WebCallWinFunctionClear( )
        {
            this.label1.Text = "";
        } 
        private void button1_Click(object sender, EventArgs e)
        {
            webBrowser1.Document.InvokeScript("WinCallWebClear");
        }
        private void btnCallWeb_Click(object sender, EventArgs e)
        {
            string txtName = txtUserName.Text;

            object[] objects = new object[1] { txtName };
            webBrowser1.Document.InvokeScript("WinCallWeb", objects);
        }
    }
}

注意 

[System.Runtime.InteropServices.ComVisible(true)]

webBrowser1.ObjectForScripting = this;

这两句

written by ocean