对于以下需求:

离线存储读取数据
允许用户对数据进行增删改操作
数据存储在本地,不依赖后端
数据支持索引查询
我们可以考虑使用html5新特性的本地存储,主要有以下几种:

Web Sql(IE,FF都不支持,http://www.w3.org/TR/webdatabase/)
IndexedDB
Local Storage(轻松存储简单的数据结构,如果存储复杂的较麻烦)
Session Storage(同Localstorage)
Cookies(有限制)
Application Cache(随后介绍)
我们可以考虑使用indexedDb来实现功能:

首先定义数据库对象

var testDB = { 
 name : “eason”, 
 version: 1, 
 db : null};


然后是数据库初始化:

function initDB(dbObj) { 
 dbObj.version = dbObj.version || 1; 
 var request = indexedDB.open(dbObj.name, dbObj.version); 
 request.onerror = function (e) { 
 console.log(e.currentTarget.error.message); 
 }; 
 request.onsuccess = function (e) { 
 dbObj.db = e.target.result; 
 }; 
 request.onupgradeneeded = function (e) { 
 var thisDB = e.target.result; 
 if (!thisDB.objectStoreNames.contains(“material”)) { 
 var objStore = thisDB.createObjectStore(“material”, 
 {keyPath: “id”, autoIncrement: true}); 
 objStore.createIndex(“wxid”, “wxid”, {unique: true}); 
 } 
 if (!thisDB.objectStoreNames.contains(“account”)) { 
 var objStore = thisDB.createObjectStore(“account”, 
 {keyPath: “id”, autoIncrement: true}); 
 objStore.createIndex(“wxid”, “wxid”, {unique: true}); 
 objStore.createIndex(“nickName”, “nickName”, {unique: false}); 
 } 
 };


关闭数据库:

function closeDB(dbObj) { 
 dbObj.db.close(); 
 }


删除数据库:

function deleteDB(dbObj) { 
 indexedDB.deleteDatabase(dbObj.name); 
 }


数据库表的CRUD操作:

Create:

function addData(dbObj, tableName, data, cb) { 
 var transaction = dbObj.db.transaction(tableName, ‘readwrite’); 
 transaction.oncomplete = function () { 
 console.log(“transaction complete”); 
 }; 
 transaction.onerror = function (event) { 
 console.dir(event) 
 }; 
 var objectStore = transaction.objectStore(tableName); 
 var request = objectStore.add(data); 
 request.onsuccess = function (e) { 
 if (cb) { 
 cb({ 
 error: 0, 
 data : data 
 }) 
 } 
 }; 
 request.onerror = function (e) { 
 if (cb) { 
 cb({ 
 error: 1 
 }) 
 } 
 } 
 }


删除数据:

function deleteData(dbObj, tableName, id, cb) { 
 var transaction = dbObj.db.transaction(tableName, ‘readwrite’); 
 transaction.oncomplete = function () { 
 console.log(“transaction complete”); 
 }; 
 transaction.onerror = function (event) { 
 console.dir(event) 
 }; 
 var objectStore = transaction.objectStore(tableName); 
 var request = objectStore.delete(parseInt(id)); 
 request.onsuccess = function (e) { 
 if (cb) { 
 cb({ 
 error: 0, 
 data : parseInt(id) 
 }) 
 } 
 }; 
 request.onerror = function (e) { 
 if (cb) { 
 cb({ 
 error: 1 
 }) 
 } 
 } 
 }


查询数据:

(1)查询全部:

function getDataAll(dbObj, tableName, cb) { 
 var transaction = dbObj.db.transaction(tableName, ‘readonly’); 
 transaction.oncomplete = function () { 
 console.log(“transaction complete”); 
 }; 
 transaction.onerror = function (event) { 
 console.dir(event) 
 }; 
 var objectStore = transaction.objectStore(tableName); 
 var rowData = []; 
 objectStore.openCursor(IDBKeyRange.lowerBound(0)).onsuccess = function (event) { var cursor = event.target.result; 
 if (!cursor && cb) { 
 cb({ 
 error: 0, 
 data : rowData 
 }); return; 
 } 
 rowData.push(cursor.value); 
 cursor.continue(); 
 }; 
 }


(2)根据id查询数据

function getDataById(dbObj, tableName, id, cb) { 
 var transaction = dbObj.db.transaction(tableName, ‘readwrite’); 
 transaction.oncomplete = function () { 
 console.log(“transaction complete”); 
 }; 
 transaction.onerror = function (event) { 
 console.dir(event) 
 }; 
 var objectStore = transaction.objectStore(tableName); 
 var request = objectStore.get(id); 
 request.onsuccess = function (e) { 
 if (cb) { 
 cb({ 
 error: 0, 
 data : e.target.result 
 }) 
 } 
 }; 
 request.onerror = function (e) { 
 if (cb) { 
 cb({ 
 error: 1 
 }) 
 } 
 } 
 }


(3)根据关键词索引数据:

function getDataBySearch(dbObj, tableName, keywords, cb) { 
 var transaction = dbObj.db.transaction(tableName, ‘readwrite’); 
 transaction.oncomplete = function () { 
 console.log(“transaction complete”); 
 }; 
 transaction.onerror = function (event) { 
 console.dir(event) 
 }; 
 var objectStore = transaction.objectStore(tableName); 
 var boundKeyRange = IDBKeyRange.only(keywords); var rowData; 
 objectStore.index(“nickName”).openCursor(boundKeyRange).onsuccess = function (event) { var cursor = event.target.result; 
 if (!cursor) { 
 if (cb) { 
 cb({ 
 error: 0, 
 data : rowData 
 }) 
 } return; 
 } 
 rowData = cursor.value; 
 cursor.continue(); 
 }; 
 }


(4)根据页面索引数据:

function getDataByPager(dbObj, tableName, start, end, cb) { 
 var transaction = dbObj.db.transaction(tableName, ‘readwrite’); 
 transaction.oncomplete = function () { 
 console.log(“transaction complete”); 
 }; 
 transaction.onerror = function (event) { 
 console.dir(event) 
 }; 
 var objectStore = transaction.objectStore(tableName); 
 var boundKeyRange = IDBKeyRange.bound(start, end, false, true); 
 var rowData = []; 
 objectStore.openCursor(boundKeyRange).onsuccess = function (event) { 
 var cursor = event.target.result; 
 if (!cursor && cb) { 
 cb({ 
 error: 0, 
 data : rowData 
 }); return; 
 } 
 rowData.push(cursor.value); 
 cursor.continue(); 
 }; 
 }


更新数据:

function updateData(dbObj, tableName, id, updateData, cb) { 
 var transaction = dbObj.db.transaction(tableName, ‘readwrite’); 
 transaction.oncomplete = function () { 
 console.log(“transaction complete”); 
 }; 
 transaction.onerror = function (event) { 
 console.dir(event) 
 }; 
 var objectStore = transaction.objectStore(tableName); 
 var request = objectStore.get(id); 
 request.onsuccess = function (e) { 
 var thisDB = e.target.result; 
 for (key in updateData) { 
 thisDB[key] = updateData[key]; 
 } 
 objectStore.put(thisDB); 
 if (cb) { 
 cb({ 
 error: 0, 
 data : thisDB 
 }) 
 } 
 }; 
 request.onerror = function (e) { 
 if (cb) { 
 cb({ 
 error: 1 
 }) 
 } 
 } 
 }


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

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

2、windows下安装redis
下载地址https://github.com/dmajkic/redis/downloads。下载到的Redis支持32bit和64bit(或者可以下载exe文件,路径是 https://github.com/rgl/redis/downloads )。根据自己实际情况选择,我选择64bit。直接进入到64位的目录,我的目录是:E:\dev\redis-2.4.5-win32-win64\64bit

打开一个cmd窗口切换到64为文件所在的目录运行: redis-server.exe redis.conf 。出现如下界面:

wKiom1SiEbHQw7SrAAFnKMDoqK8470.jpg

这就说明Redis服务端已经安装成功。

打开一个cmd窗口切换到64为文件所在的目录运行 redis-cli.exe -h 127.0.0.1 -p 6379,其中 127.0.0.1是本地ip,6379是redis服务端的默认端口。运行成功如下图所示。

wKiom1SiEkfxAA6qAACop0g2W3E221.jpg

下面做个小测试:

wKioL1SiE3biQfIHAADoXzjr2mM593.jpg

如果能正常显示,说明已经ok了,可以正常使用了

Linux ubuntu上安装redis

本人使用的是Ubuntu 14.04 lts,安装Redis可以通过apt-get命令安装,完整的命令如下:

sudo apt-get install redis-server
安装以后,数据库可以自动启动,先检查下redis的进程:

ps -aux|grep redis
redis 4162 0.1 0.0 10676 1420 ? Ss 23:24 0:00 /usr/bin/redis-server /etc/redis/redis.conf
conan 4172 0.0 0.0 11064 924 pts/0 S+ 23:26 0:00 grep –color=auto redis
再查看下状态看是否启动:

netstat -nlt|grep 6379
tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN
安装server后会自动安装一个命令行工具redis-cli,在任意目录下运行redis-cli即可启动服务,请自行测试。

Redis配置:

(1)登录密码

默认情况下,访问Redis服务器是不需要密码的,为了增加安全性我们需要设置Redis服务器的访问密码。

用vi打开Redis服务器的配置文件redis.conf

sudo vi /etc/redis/redis.conf

取消注释requirepass

requirepass redistest //redistest 为密码

重新登录 redis-cli -a redistest ,如果不使用密码登录,虽然能登录成功但是提示操作没有权限
(2)支持远程

默认情况下,Redis服务器不允许远程访问,只允许本机访问。

sudo vi /etc/redis/redis.conf

注释bind

bind 127.0.0.1

基本的配置就到这里,欢迎留言!