aardio 官方社区

 找回密码
 注册会员

QQ登录

只需一步,快速开始

搜索
查看: 19571|回复: 14

Redis使用的例子

[复制链接]

2

主题

34

回帖

452

积分

培训班

积分
452
发表于 2016-8-23 12:32:27 | 显示全部楼层 |阅读模式
本帖最后由 pyaauto 于 2016-11-1 12:32 编辑

[redis.aardio]

  1. class redis{
  2.         ctor(host,port){
  3.                 this._context=wsock.tcp.client();
  4.                 if(null===this._context.connect(host,port))
  5.                                 return null,"Connection server failed";
  6.                 this.is_read = true;       
  7.                 ..table.add_gc( this,"close");
  8.         };
  9.         type=me;
  10.         @_meta;
  11.         close = function(){
  12.                 this._context.close();
  13.         }   
  14.         _read_str=function(redis_str){
  15.                 return string.slice(redis_str,2,#redis_str);
  16.         }
  17.         _read_int=function(redis_str){
  18.                 return tonumber(string.slice(redis_str,2,#redis_str));
  19.         }
  20.         _read_bulk=function(redis_str){
  21.                 var pos= string.indexOf(redis_str,'\r\n');
  22.                 if(!pos) return ;
  23.                 var data_num = tonumber(string.slice(redis_str,2,pos));
  24.                 if( !data_num or data_num === -1) return ;
  25.                 return string.slice(redis_str,pos+2,pos+2+data_num);
  26.         }
  27.         _read_err=function(redis_str){
  28.                 return string.slice(redis_str,2,#redis_str);
  29.         }
  30.         _redis_read=function(socket_data){
  31.                 socket_data =string.trimleft(socket_data);
  32.                 var first_char= string.left(socket_data,1)
  33.                 select(first_char) {
  34.                         case "+" {
  35.                                 return this._read_str(socket_data);
  36.                         }
  37.                         case "-" {
  38.                                 return this._read_err(socket_data);
  39.                         }
  40.                         case ":" {
  41.                                 return this._read_int(socket_data);
  42.                         }
  43.                         case "$" {
  44.                                 return this._read_bulk(socket_data);
  45.                         }
  46.                         case "*" {
  47.                                 var pos= string.indexOf(socket_data,'\r\n');
  48.                                 if(!pos) return ;
  49.                                 var tab={}
  50.                                
  51.                                 var remove = pos + 2;
  52.                                 while(1){
  53.                                                 socket_data = string.slice(socket_data,remove,#socket_data);
  54.                                                 if(type(socket_data) !== type.string) break ;
  55.                                                 pos= string.indexOf(socket_data,'\r\n');
  56.                                                 if(!pos) break ;
  57.                                                
  58.                                                 var ret;
  59.                                                 var line_data=string.slice(socket_data,1,pos);
  60.                                                 var line_type = string.left(line_data,1)
  61.                                                
  62.                                                 ret = this._redis_read( line_data );
  63.                                                 if(line_type==="$"){
  64.                                                
  65.                                                         var line_num = tonumber(string.slice(line_data,2,#line_data));
  66.                                                        
  67.                                                         if(line_num === -1){
  68.                                                                 ret = this._redis_read(line_data );
  69.                                                         }else {
  70.                                                                 //多行
  71.                                                                 line_data = string.left(socket_data,#line_data+2+line_num)
  72.                                                                 ret = this._redis_read( line_data );
  73.                                                         }
  74.                                                 }else {
  75.                                                         ret = this._redis_read( line_data );
  76.                                                 }
  77.                                                 remove = #line_data+2;
  78.                                                 if(ret) table.push(tab,ret);
  79.                                 }
  80.                                 return tab:{};
  81.                         }
  82.                         else {
  83.                                 return null;
  84.                         }
  85.                 }
  86.         }
  87.        
  88.         commands=function(...){
  89.                 var t={...};
  90.                 var r = '\r\n';
  91.                 var num = #t
  92.                
  93.                 var cmdtxt = "*"++num++r;
  94.                 for(i=1;num;1){
  95.                         t[i] = tostring(t[i])
  96.                         cmdtxt += "$"++#t[i]++r;
  97.                         cmdtxt += t[i]++r
  98.                 }
  99.                
  100.                 this._context.send(cmdtxt,#cmdtxt)
  101.                 if( this.is_read ) return this._redis_read(this._context.recv());
  102.         }
  103.        
  104.         get_array =function(redis_array,sn=0,dn=-1) {
  105.                 return this.commands("LRANGE",redis_array,sn,dn);
  106.         }
  107.        
  108.         set_array=function (redis_array,redis_array_val) {
  109.                 this.is_read =false;
  110.                 this.commands("DEL",redis_array);
  111.                 for(i=1;#redis_array_val;1){
  112.                         this.commands("RPUSH",redis_array,redis_array_val[i]);
  113.                 }
  114.                 this.is_read = true;
  115.                 return this._context.recv();
  116.         }
  117. }

  118. namespace redis {
  119.         import wsock.tcp.client;
  120.         string = ..string;
  121.         table = ..table;
  122.         _meta = {
  123.                 _get = function( k ){
  124.                                 if( type(k) == "string" && k[1]=='_'# ) return;
  125.                                 if(!k) return;
  126.                                 if(!owner[['commands']]) return ;
  127.                                  
  128.                             var api = {
  129.                                     _cmd = k;
  130.                                     _cmdfunc=owner[['commands']];
  131.                                         @_meta;
  132.                                 }
  133.                                 owner[[k]] = api;
  134.                                 return api;
  135.                 }
  136.                 _call = function( ... ){
  137.                                 return owner._cmdfunc(owner._cmd,...)
  138.                 }
  139.         }
  140. }
复制代码
import console
import redis
console.open()

db=redis(
'127.0.0.1',6379)

//返回服务器时间
console.varDump(db.time())

//将字符串值 value 关联到 key
db.set('key',12345)
//返回 key 所关联的字符串值
console.log(db.get('key'))

//追加字符串
db.append("key","56789")
console.log(
"test",db.get("key"))

//保存数组
db.set_array("isarray",{"hello";"test";"test1"})
//读取数组
console.varDump(db.get_array("isarray"))


//删除
console.log(db.del('isarray'))
console.log(db.del(
'key'))

//模糊读取
db.set("key_1","value_1")
db.set(
"key_2","value_2")
db.set(
"key_3","value_3")
db.set(
"key_11","value_4")
db.set(
"key_12","value_5")
console.varDump(db.keys(
"key_*"))
console.varDump(db.keys(
"key_?"))

//计数
console.log("crkey",1)
db.set(
"crkey",1)
console.log(
"将 key 中储存的数字值加一");
db.incr(
"crkey");
console.log(db.get(
"crkey"))
console.log(
"将 key 中储存的数字值减一");
db.decr(
"crkey");
console.log(db.get(
"crkey"))

//以秒为单位设置过期时间
console.log(db.setex("exkey",2,"exvalue"))
console.log(db.get(
"exkey"),type( db.get("exkey")))
console.log(
"返回剩余生存时间:",db.pttl("exkey"))
sleep(2000)
console.log(db.get(
"exkey"),type( db.get("exkey")))

console.pause()

0

主题

9

回帖

220

积分

二级会员

积分
220
QQ
发表于 2016-8-23 15:45:24 | 显示全部楼层
学习,感谢楼主

14

主题

41

回帖

530

积分

培训班

积分
530
发表于 2016-9-12 09:06:25 | 显示全部楼层
感谢楼主的精彩例子

35

主题

46

回帖

509

积分

三级会员

积分
509
发表于 2016-10-30 22:55:01 | 显示全部楼层
模糊查询语句不正常db.keys("*"),结束ahtmlcgi进程才能成功成功查询一次。

2

主题

34

回帖

452

积分

培训班

积分
452
 楼主| 发表于 2016-10-31 14:28:08 | 显示全部楼层
xiaoqiang 发表于 2016-10-30 22:55
模糊查询语句不正常db.keys("*"),结束ahtmlcgi进程才能成功成功查询一次。

自己简单使用没有问题,能提供一下测试代码吗?你也可以加个断点对比下协议看看

2

主题

34

回帖

452

积分

培训班

积分
452
 楼主| 发表于 2016-10-31 14:28:14 | 显示全部楼层
xiaoqiang 发表于 2016-10-30 22:55
模糊查询语句不正常db.keys("*"),结束ahtmlcgi进程才能成功成功查询一次。

自己简单使用没有问题,能提供一下测试代码吗?你也可以加个断点对比下协议看看

35

主题

46

回帖

509

积分

三级会员

积分
509
发表于 2016-11-1 10:01:07 | 显示全部楼层
我服务器是win2008,装的Redis-x64-3.2.100,keys和scan语句返回的都是空table,别的命令暂时每发现问题。用客户端都能正常返回。

35

主题

46

回帖

509

积分

三级会员

积分
509
发表于 2016-11-1 10:04:15 | 显示全部楼层
//==服务器
yuuuu=function(){
       
import redis;

db=redis('127.0.0.1',46379);

fs=db.keys("*");

return fs;
       
}



var ahtml = carl.ahtml.client(serverUrl, rsaPublicKey);

yb= ahtml.yuuuu()

console.varDump(yb)

2

主题

34

回帖

452

积分

培训班

积分
452
 楼主| 发表于 2016-11-1 12:28:14 | 显示全部楼层
xiaoqiang 发表于 2016-11-1 10:04
//==服务器
yuuuu=function(){
       

我用的2.6版本,里面好像没有scan,重新更新了下,你再看看

35

主题

46

回帖

509

积分

三级会员

积分
509
发表于 2016-11-1 12:55:56 | 显示全部楼层
把服务器ahtmlcgi.exe进程手动结束以后,调用一下keys能正常返回结果,然后再继续调用,就返回空table

35

主题

46

回帖

509

积分

三级会员

积分
509
发表于 2016-11-1 13:06:39 | 显示全部楼层
这个问题和ahtmlcgi.exe进程有关系

35

主题

46

回帖

509

积分

三级会员

积分
509
发表于 2016-11-12 18:35:44 | 显示全部楼层
封装个3.2的用用把,2.6的太老了。

8

主题

45

回帖

310

积分

二级会员

积分
310
发表于 2016-11-12 19:16:59 | 显示全部楼层
mark!!!!!!

11

主题

19

回帖

257

积分

培训班

积分
257
发表于 2018-5-5 14:01:27 | 显示全部楼层
标准库下hiredis不能在xp下使用,2003系统也不一定能用(后面会付上测试主机)。redis的通信协议很简单,可以根据:http://doc.redisfans.com/topic/protocol.html封装一个用socket通信的类简单连接,可满足在xp、win2003环境下的使用。
传送门:http://bbs.aardio.com/forum.php? ... amp;highlight=redis,此类基本上实现了redis通信,感谢@pyaardio。
测试服务器:14.1.98.53 :55588  administrator  07f2af522b(还有几天到期,随便用)
桌面上的 memcaced.exe 是通过hiredis示例编译出来的,aardio工程20.exe 用的上面传送门里面的类。aardio工程20.exe 源码如下:
import console;
import redis;
console.open();
var cli = redis("127.0.0.1",6379);
if(cli){
    cli.set(
"a","11232")
    cli.set(
"b","aaaa")
    console.dump(cli.keys(
"*"))
    console.dump(cli.keys(
"*"))
    console.dump(cli.keys(
"*"))
    console.dump(cli.keys(
"*"))
}
else {
    console.dump(
"连接失败")
}
console.pause();

170

主题

2169

回帖

1万

积分

管理员

积分
13161
发表于 2018-5-5 15:48:21 | 显示全部楼层
znkee 发表于 2018-5-5 14:01
标准库下hiredis不能在xp下使用,2003系统也不一定能用(后面会付上测试主机)。redis的通信协议很简单,可 ...

这不需要测试主机,
在范例里已经有说明,hiredis主要是用于服务端开发,不支持XP系统(2003跟XP一样)。

即然你的win2003服务器几天就到期了,换个2008很难吗?!
服务器厂商基本都不提供2003的服务器了。
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

手机版|未经许可严禁引用或转载本站文章|aardio.com|aardio 官方社区 ( 皖ICP备09012014号 )

GMT+8, 2024-10-4 20:29 , Processed in 0.066010 second(s), 23 queries .

Powered by Discuz! X3.5

Copyright © 2001-2024 Tencent Cloud.

快速回复 返回顶部 返回列表