R语言利剑之NoSQL系列:Redis

数据库 Redis
R利剑NoSQL系列文章,主要介绍通过R语言连接使用NoSQL数据库。涉及的NoSQL产品,包括Redis, MongoDB, HBase, Hive, Cassandra, Neo4j。希望通过我的介绍让广大的R语言爱好者,有更多的开发选择,做出更多地激动人心的应用。

Redis环境准备 rredis函数库 rredis基本使用操作 rredis使用案例

每一章节,都会分为”文字说明部分”和”代码部分”,保持文字说明与代码的连贯性。

***章 Redis环境准备

文字说明部分:

首先环境准备,这里我选择了Linux Ubuntu操作系统12.04的64位服务器版本,大家可以根据自己的使用习惯选择顺手的Linux。

 

Redis安装过程跳过。sudo apt-get install redis-server

查看Redis服务器环境

使用/etc/init.d/redis-server命令,启动redis-server, 默认端口:port=6379

在服务器端,用telnet连接redis-server

用telnet插入数据,读取数据

R语言环境2.15.0,WinXP通过远程连接,访问Redis server。

代码部分:

查看操作系统 

  1. ~ uname -a      Linux AY121111030241cda8003 3.2.0-29-generic #46-Ubuntu SMP Fri Jul 27 17:03:23 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux  ~ cat /etc/issue      Ubuntu 12.04.1 LTS \n \l  

启动redis 

  1. ~ /etc/init.d/redis-server start      Starting redis-server: redis-server.  

查看系统进程 

  1. ~ ps -aux|grep redis      redis    20128  0.0  0.0  10676  1428 ?        Ss   16:39   0:00 /usr/bin/redis-server /etc/redis/redis.conf  

查看启日志

  1. ~ cat  /var/log/redis/redis-server.log       
  2. [20128] 14 Apr 16:39:43 * Server started, Redis version 2.2.12     
  3. [20128] 14 Apr 16:39:43 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.    
  4. [20128] 14 Apr 16:39:43 * The server is now ready to accept connections on port 6379  

telnet连接redis-server

  1. ~ telnet localhost 6379      Trying 127.0.0.1...     Connected to localhost.     Escape character is '^]'.  

插入数据

  1. rpush data 1     :1      rpush data 2     :2  

查询数据 

  1. lrange data 0 -1     *2     $1     1     $1     2  

R语言开发环境2.15.0,WinXP

~ R R version 2.15.0 (2012-03-30) Copyright (C) 2012 The R Foundation for Statistical Computing ISBN 3-900051-07-0 Platform: i386-pc-mingw32/i386 (32-bit) 

第二章 rredis函数库

rredis提供了100函数,对应用redis的操作。虽然函数也不少,但是用法都是比较简单的,对R语言支持足够灵活,代码也比较简洁。

下面列出了所有rredis函数库,我只挑选一些常用的介绍。

文字说明部分:

建立连接,关闭连接

  1. redisConnect() , redisClose()  

清空当前/所有数据库数据 

  1. redisFlushDB() , redisFlushAll()  

列出所有KEY值,KEY的数量 

  1. redisKeys(), redisDBSize()  

选择切换数据库:0是默认数据库 

  1. redisSelect(0)      

插入string对象,批量插入 

  1. redisSet('x',runif(5)), redisMSet(list(x=pi,y=runif(5),z=sqrt(2)))  

读取string对象,批量读取 

  1. redisGet('x'), redisMGet(c('x','y','z'))  

删除对象 

  1. redisDelete('x')  

左边插入数组对象,右边插入数组对象

  1. redisLPush('a',1), redisRPush('a','A')  

左边弹出一个数组对象, 右边弹出一个数组对象, 

  1. redisLPop('a'), redisRPop('a')  

从左边显示数组对象列表 

  1. redisLRange('a',0,-1)  

插入set类型对象 

  1. redisSAdd('A',runif(2))  

显示set对象有几个元素,列表显示set对象元素 

  1. redisSCard('A'), redisSMembers('A')  

显示两个set对象的差集,交集,并集 

  1. redisSDiff(c('A','B')),redisSInter(c('A','B')),redisSUnion(c('A','B'))  

代码部分:

共有100个函数

redisAuth redisBgRewriteAOF redisBgSave redisBLPop redisBRPop redisBRPopLPush redisClose redisCmd redisConnect redisDBSize 
redisDecr redisDecrBy redisDelete redisDiscard redisEval redisExec redisExists redisExpire redisExpireAt redisFlushAll redisFlushDB 
redisGet redisGetContext redisGetResponse redisGetSet redisHDel redisHExists redisHFields redisHGet redisHGetAll redisHIncrBy redisHKeys 
redisHLen redisHMGet redisHMSet redisHSet redisHVals redisIncr redisIncrBy redisInfo redisKeys redisLIndex redisLLen redisLPop redisLPush 
redisLRange redisLRem redisLSet redisLTrim redisMGet redisMonitorChannels redisMove redisMSet redisMulti redisPublish redisRandomKey 
redisRename redisRPop redisRPopLPush redisRPush redisSAdd redisSave redisSCard redisSDiff redisSDiffStore redisSelect redisSet
 redisSetBlocking redisSetContext redisShutdown redisSInter redisSInterStore redisSIsMember redisSlaveOf redisSMembers redisSMove
 redisSort redisSPop redisSRandMember redisSRem redisSubscribe redisSUnion redisSUnionStore redisTTL redisType redisUnsubscribe 
redisUnwatch redisWatch redisZAdd redisZCard redisZIncrBy redisZInterStore redisZRange redisZRangeByScore redisZRank redisZRem 
redisZRemRangeByRank redisZRemRangeByScore redisZScore redisZUnionStore 

第三章 rredis基本使用操作

文字说明部分:

首先,要安装rredis类库,加载类库。

redisConnect(host=“192.168.1.101”,port=6379)

然后,通过redisConnect()函数,建立与Redis Server的连接。如果是本地连接redisConnect()不要参数,下面例子使用远程连接,增加host参数配置IP地址。redisConnect(host=“192.168.1.101”,port=6379)

redis的基本操作:建议链接,切换数据库,列表显示所有KEY值,清空当前数据库数据,清空所有数据库数据,关闭链接,

string类型操作:插入,读取,删除,插入并设置过期时间,批量操作

list类型操作:插入,读取,弹出

set类型操作:插入,读取,交集,差集,并集

rredis与redis-cli的交互操作

代码部分:

redis的基本操作:

  1. #安装rredis 
  2. install.packages(rredis) 
  3.  
  4. #加载rredis类库 
  5. library(rredis) 
  6.  
  7. #远程连接redis server 
  8. redisConnect(host="192.168.1.101",port=6379
  9.  
  10. #列出所有的keys 
  11. redisKeys() 
  12.     [1] "x"    "data" 
  13.  
  14. #显示有多少个key 
  15. redisDBSize() 
  16.     [1] 2 
  17.  
  18. #切换数据库1 
  19. redisSelect(1) 
  20.     [1] "OK" 
  21. redisKeys() 
  22.     NULL 
  23.  
  24. #切换数据库0 
  25. redisSelect(0) 
  26.     [1] "OK" 
  27. redisKeys() 
  28.     [1] "x"    "data" 
  29.  
  30. #清空当前数据库数据 
  31. redisFlushDB() 
  32.     [1] "OK" 
  33.  
  34. #清空所有数据库数据 
  35. redisFlushAll() 
  36.     [1] "OK" 
  37.  
  38. #关闭链接 
  39. redisClose() 

string类型操作:

  1. #插入对象 
  2. redisSet('x',runif(5)) 
  3.     1] "OK" 
  4.  
  5. #读取对象 
  6. redisGet('x') 
  7.     [1] 0.67616159 0.06358643 0.07478021 0.32129140 0.16264615 
  8.  
  9. #设置数据过期时间 
  10. redisExpire('x',1) 
  11. Sys.sleep(1) 
  12. redisGet('x') 
  13.     NULL 
  14.  
  15. #批量插入 
  16. redisMSet(list(x=pi,y=runif(5),z=sqrt(2))) 
  17.     [1] TRUE 
  18.  
  19. #批量读取 
  20. redisMGet(c('x','y','z')) 
  21.     $x 
  22.     [1] 3.141593 
  23.     $y 
  24.     [1] 0.9249501 0.3444994 0.6477250 0.1681421 0.2646853 
  25.     $z 
  26.     [1] 1.414214 
  27.  
  28. #删除数据     
  29. redisDelete('x') 
  30.     [1] 1 
  31. redisGet('x') 
  32.     NULL 

#p#

list类型操作

  1. #从数组左边插入数据 
  2. redisLPush('a',1) 
  3. redisLPush('a',2) 
  4. redisLPush('a',3) 
  5.  
  6. #显示从数组左边0-2的数据 
  7. redisLRange('a',0,2) 
  8.     [[1]] 
  9.     [1] 3 
  10.     [[2]] 
  11.     [1] 2 
  12.     [[3]] 
  13.     [1] 1 
  14.  
  15. #从数据左边弹出一个数据 
  16. redisLPop('a') 
  17.     [1] 3 
  18.  
  19. #显示从数组左边0-(-1)的数据    
  20. redisLRange('a',0,-1) 
  21.     [[1]] 
  22.     [1] 2 
  23.  
  24.     [[2]] 
  25.     [1] 1 
  26.  
  27. #从数组右边插入数据 
  28. redisRPush('a','A') 
  29. redisRPush('a','B') 
  30.  
  31. #显示从数组左边0-(-1)的数据 
  32. redisLRange('a',0,-1) 
  33.     [[1]] 
  34.     [1] 2 
  35.     [[2]] 
  36.     [1] 1 
  37.     [[3]] 
  38.     [1] "A" 
  39.     [[4]] 
  40.     [1] "B" 
  41.  
  42. #从数据右边弹出一个数据 
  43. redisRPop('a') 

set类型操作

  1. redisSAdd('A',runif(2)) 
  2. redisSAdd('A',55) 
  3.  
  4. #显示对象有几个元素 
  5. redisSCard('A') 
  6.     [1] 2 
  7.  
  8. #列表显示set对象元素 
  9. redisSMembers('A') 
  10.     [[1]] 
  11.     [1] 55 
  12.  
  13.     [[2]] 
  14.     [1] 0.6494041 0.3181108 
  15.  
  16. redisSAdd('B',55) 
  17. redisSAdd('B',rnorm(3)) 
  18.  
  19. #显示对象有几个元素 
  20. redisSCard('B') 
  21.     [1] 2 
  22.  
  23. #列表显示set对象元素     
  24. redisSMembers('B') 
  25.     [[1]] 
  26.     [1] 55 
  27.  
  28.     [[2]] 
  29.     [1] 0.1074787 1.3111006 0.8223434 
  30.  
  31. #差集 
  32. redisSDiff(c('A','B')) 
  33.     [[1]] 
  34.     [1] 0.6494041 0.3181108 
  35.  
  36. #交集 
  37. redisSInter(c('A','B')) 
  38.     [[1]] 
  39.     [1] 55 
  40.  
  41. #并集 
  42. redisSUnion(c('A','B')) 
  43.     [[1]] 
  44.     [1] 55 
  45.  
  46.     [[2]] 
  47.     [1] 0.1074787 1.3111006 0.8223434 
  48.  
  49.     [[3]] 
  50.     [1] 0.6494041 0.3181108 

rredis与redis-cli交互

redis客户端插入数据,rredis读取数据

  1. #打开redis客户端 
  2. ~ redis-cli 
  3. redis 127.0.0.1:6379> set shell "Greetings, R client!" 
  4.     OK 
  5.  
  6. redisGet('shell') 
  7.     [1] "Greetings, R client!" 

rredis插入数据,redis客户端读取数据

  1. #插入数据 
  2. redisSet('R', 'Greetings, shell client!') 
  3.     [1] "OK" 
  4.  
  5. #读取数据(有乱码) 
  6. redis 127.0.0.1:6379> get R 
  7.     "X\\x00\x00\x00\x02\x00\x02\x0f\x00\x00\x02\x03\x00\x00\x00\x00\x10\x00\x00\x00\x01\x00\x04\x00\\x00\x00\x00\x18Greetings, shell client!" 

转型以数组方式存储(charToRaw)

  1. redisSet('R', charToRaw('Greetings, shell client!')) 
  2.     [1] TRUE 
  3.  
  4. #正常读取数据 
  5. redis 127.0.0.1:6379> get R 
  6.     "Greetings, shell client!" 

第四章 rredis测试案例

测试案例的需求:

读入一个数据文件,从左到右分别是用户id,口令,邮箱,在redis里建立合适的数据模型,并将这些数据导入到redis。

文字说明部分:

首先,定义数据模型:

KEY:

users:用户id

VALUE:

id:用户id

pw:口令

email:邮箱

R语言读入数据文件。

然后,建立redis连接,以循环方式插入数据。

以users:wolys为KEY,输出对应用的VALVE值。

代码部分

  1. #读入数据 
  2. data<-scan(file="data5.txt",what=character(),sep=" "
  3. data<-data[which(data!='#')] 
  4.  
  5. > data 
  6.  
  7.      [1] "wolys"                   "wolysopen111"            "wolys@21cn.com"          
  8.      [4] "coralshanshan"           "601601601"               "zss1984@126.com"         
  9.      [7] "pengfeihuchao"           "woaidami"                "294522652@qq.com"        
  10.     [10] "simulategirl"            "@#$9608125"              "simulateboy@163.com"     
  11.     [13] "daisypp"                 "12345678"                "zhoushigang_123@163.com" 
  12.     [16] "sirenxing424"            "tfiloveyou"              "sirenxing424@126.com"    
  13.     [19] "raininglxy"              "1901061139"              "lixinyu23@qq.com"        
  14.     [22] "leochenlei"              "leichenlei"              "chenlei1201@gmail.com"   
  15.     [25] "z370433835"              "lkp145566"               "370433835@qq.com"        
  16.     [28] "cxx0409"                 "12345678"                "cxx0409@126.com"         
  17.     [31] "xldq_l"                  "061222ll"                "viv093@sina.com"   
  18.  
  19. #连接redis连接 
  20. redisConnect(host="192.168.1.101",port=6379
  21. redisFlushAll() 
  22. redisKeys() 
  23.  
  24. #循环插入数据 
  25. id<-NULL 
  26. for(i in 1:length(data)){ 
  27.   if(i %% 3 == 1) { 
  28.     id<-data[i] 
  29.     redisSAdd(paste("users:",id,sep=""),paste("id:",id,sep="")) 
  30.   } else if(i %% 3 == 2) { 
  31.     redisSAdd(paste("users:",id,sep=""),paste("pw:",data[i],sep="")) 
  32.   } else { 
  33.     redisSAdd(paste("users:",id,sep=""),paste("email:",data[i],sep="")) 
  34.   } 
  35.  
  36. #列出所有的KEY 
  37. redisKeys() 
  38.  
  39.      [1] "users:cxx0409"       "users:sirenxing424"  "users:simulategirl"  "users:xldq_l"        
  40.      [5] "users:coralshanshan" "users:raininglxy"    "users:pengfeihuchao" "users:leochenlei"    
  41.      [9] "users:daisypp"       "users:wolys"         "users:z370433835"    
  42.  
  43. #通过KEY查询VALUE 
  44. redisSMembers("users:wolys") 
  45.  
  46.     [[1]] 
  47.     [1] "pw:wolysopen111" 
  48.  
  49.     [[2]] 
  50.     [1] "email:wolys@21cn.com" 
  51.  
  52.     [[3]] 
  53.     [1] "id:wolys" 
  54.  
  55. #关闭redis连接 
  56. redisClose() 

完成测试案例。

数据文件:data5.txt

  1. wolys # wolysopen111 # wolys@21cn.com 
  2. coralshanshan # 601601601 # zss1984@126.com 
  3. pengfeihuchao # woaidami # 294522652@qq.com 
  4. simulategirl # @#$9608125 # simulateboy@163.com 
  5. daisypp # 12345678 # zhoushigang_123@163.com 
  6. sirenxing424 # tfiloveyou # sirenxing424@126.com 
  7. raininglxy # 1901061139 # lixinyu23@qq.com 
  8. leochenlei # leichenlei # chenlei1201@gmail.com 
  9. z370433835 # lkp145566 # 370433835@qq.com 
  10. cxx0409 # 12345678 # cxx0409@126.com 
  11. xldq_l # 061222ll # viv093@sina.com 

原文链接:http://cos.name/2013/04/nosql-r-redis/ 

【责任编辑:彭凡 TEL:(010)68476606】

责任编辑:彭凡 来源: 统计之都
相关推荐

2014-07-31 09:13:54

R语言MongoDB

2019-03-20 15:59:11

NoSQLRedis数据库

2013-04-10 10:31:21

R语言

2011-07-06 16:36:40

Redis

2017-10-17 11:58:54

R语言UpSetR可视化

2013-05-31 10:15:29

R语言

2021-05-18 07:15:37

Python

2013-05-16 09:37:14

R语言

2010-08-31 09:11:58

2013-05-24 10:01:40

R语言

2011-08-01 08:56:06

CouchDBSQLiteNoSQL

2011-05-16 10:29:44

HandlerSockNoSQL

2011-07-13 09:58:15

HBase

2012-08-29 16:41:44

信息安全RSA华为

2017-11-17 18:40:54

华为

2010-03-11 14:37:47

Visual StudScrum

2023-11-29 16:20:21

2021-12-22 07:31:18

RedisNoSQL数据库

2018-03-12 22:13:46

GO语言编程软件

2013-05-10 14:37:37

点赞
收藏

51CTO技术栈公众号