文档章节

R语言与Redis的联合使用

openthings
 openthings
发布于 2015/07/02 11:15
字数 2064
阅读 523
收藏 2

分为4个章节。

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。

代码部分:

查看操作系统

~ 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

~ /etc/init.d/redis-server start

    Starting redis-server: redis-server.

查看系统进程

~ 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

查看启日志

~ cat  /var/log/redis/redis-server.log

    [20128] 14 Apr 16:39:43 * Server started, Redis version 2.2.12
    [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.
    [20128] 14 Apr 16:39:43 * The server is now ready to accept connections on port 6379

telnet连接redis-server

~ telnet localhost 6379

    Trying 127.0.0.1...
    Connected to localhost.
    Escape character is '^]'.

插入数据

    rpush data 1
    :1

    rpush data 2
    :2

查询数据

    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函数库,我只挑选一些常用的介绍。

文字说明部分:

建立连接,关闭连接

redisConnect() , redisClose()

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

redisFlushDB() , redisFlushAll()

列出所有KEY值,KEY的数量

redisKeys(), redisDBSize()

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

redisSelect(0)

插入string对象,批量插入

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

读取string对象,批量读取

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

删除对象

redisDelete('x')

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

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

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

redisLPop('a'), redisRPop('a')

从左边显示数组对象列表

redisLRange('a',0,-1)

插入set类型对象

redisSAdd('A',runif(2))

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

redisSCard('A'), redisSMembers('A')

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

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的基本操作:

#安装rredis
install.packages(rredis)

#加载rredis类库
library(rredis)

#远程连接redis server
redisConnect(host="192.168.1.101",port=6379)

#列出所有的keys
redisKeys()
    [1] "x"    "data"

#显示有多少个key
redisDBSize()
    [1] 2

#切换数据库1
redisSelect(1)
    [1] "OK"
redisKeys()
    NULL

#切换数据库0
redisSelect(0)
    [1] "OK"
redisKeys()
    [1] "x"    "data"

#清空当前数据库数据
redisFlushDB()
    [1] "OK"

#清空所有数据库数据
redisFlushAll()
    [1] "OK"

#关闭链接
redisClose()

string类型操作:

#插入对象
redisSet('x',runif(5))
    1] "OK"

#读取对象
redisGet('x')
    [1] 0.67616159 0.06358643 0.07478021 0.32129140 0.16264615

#设置数据过期时间
redisExpire('x',1)
Sys.sleep(1)
redisGet('x')
    NULL

#批量插入
redisMSet(list(x=pi,y=runif(5),z=sqrt(2)))
    [1] TRUE

#批量读取
redisMGet(c('x','y','z'))
    $x
    [1] 3.141593
    $y
    [1] 0.9249501 0.3444994 0.6477250 0.1681421 0.2646853
    $z
    [1] 1.414214

#删除数据    
redisDelete('x')
    [1] 1
redisGet('x')
    NULL

list类型操作

#从数组左边插入数据
redisLPush('a',1)
redisLPush('a',2)
redisLPush('a',3)

#显示从数组左边0-2的数据
redisLRange('a',0,2)
    [[1]]
    [1] 3
    [[2]]
    [1] 2
    [[3]]
    [1] 1

#从数据左边弹出一个数据
redisLPop('a')
    [1] 3

#显示从数组左边0-(-1)的数据   
redisLRange('a',0,-1)
    [[1]]
    [1] 2

    [[2]]
    [1] 1

#从数组右边插入数据
redisRPush('a','A')
redisRPush('a','B')

#显示从数组左边0-(-1)的数据
redisLRange('a',0,-1)
    [[1]]
    [1] 2
    [[2]]
    [1] 1
    [[3]]
    [1] "A"
    [[4]]
    [1] "B"

#从数据右边弹出一个数据
redisRPop('a')

set类型操作

redisSAdd('A',runif(2))
redisSAdd('A',55)

#显示对象有几个元素
redisSCard('A')
    [1] 2

#列表显示set对象元素
redisSMembers('A')
    [[1]]
    [1] 55

    [[2]]
    [1] 0.6494041 0.3181108

redisSAdd('B',55)
redisSAdd('B',rnorm(3))

#显示对象有几个元素
redisSCard('B')
    [1] 2

#列表显示set对象元素    
redisSMembers('B')
    [[1]]
    [1] 55

    [[2]]
    [1] 0.1074787 1.3111006 0.8223434

#差集
redisSDiff(c('A','B'))
    [[1]]
    [1] 0.6494041 0.3181108

#交集
redisSInter(c('A','B'))
    [[1]]
    [1] 55

#并集
redisSUnion(c('A','B'))
    [[1]]
    [1] 55

    [[2]]
    [1] 0.1074787 1.3111006 0.8223434

    [[3]]
    [1] 0.6494041 0.3181108

rredis与redis-cli交互

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

#打开redis客户端
~ redis-cli
redis 127.0.0.1:6379> set shell "Greetings, R client!"
    OK

redisGet('shell')
    [1] "Greetings, R client!"

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

#插入数据
redisSet('R', 'Greetings, shell client!')
    [1] "OK"

#读取数据(有乱码)
redis 127.0.0.1:6379> get R
    "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)

redisSet('R', charToRaw('Greetings, shell client!'))
    [1] TRUE

#正常读取数据
redis 127.0.0.1:6379> get R
    "Greetings, shell client!"

第四章 rredis测试案例

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

文字说明部分:

  • 首先,定义数据模型:

    • KEY:
      users:用户id

    • VALUE:
      id:用户id
      pw:口令
      email:邮箱

  • R语言读入数据文件。

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

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

代码部分

#读入数据
data<-scan(file="data5.txt",what=character(),sep=" ")
data<-data[which(data!='#')]

> data

     [1] "wolys"                   "wolysopen111"            "wolys@21cn.com"         
     [4] "coralshanshan"           "601601601"               "zss1984@126.com"        
     [7] "pengfeihuchao"           "woaidami"                "294522652@qq.com"       
    [10] "simulategirl"            "@#$9608125"              "simulateboy@163.com"    
    [13] "daisypp"                 "12345678"                "zhoushigang_123@163.com"
    [16] "sirenxing424"            "tfiloveyou"              "sirenxing424@126.com"   
    [19] "raininglxy"              "1901061139"              "lixinyu23@qq.com"       
    [22] "leochenlei"              "leichenlei"              "chenlei1201@gmail.com"  
    [25] "z370433835"              "lkp145566"               "370433835@qq.com"       
    [28] "cxx0409"                 "12345678"                "cxx0409@126.com"        
    [31] "xldq_l"                  "061222ll"                "viv093@sina.com"  

#连接redis连接
redisConnect(host="192.168.1.101",port=6379)
redisFlushAll()
redisKeys()

#循环插入数据
id<-NULL
for(i in 1:length(data)){
  if(i %% 3 == 1) {
    id<-data[i]
    redisSAdd(paste("users:",id,sep=""),paste("id:",id,sep=""))
  } else if(i %% 3 == 2) {
    redisSAdd(paste("users:",id,sep=""),paste("pw:",data[i],sep=""))
  } else {
    redisSAdd(paste("users:",id,sep=""),paste("email:",data[i],sep=""))
  }
}

#列出所有的KEY
redisKeys()

     [1] "users:cxx0409"       "users:sirenxing424"  "users:simulategirl"  "users:xldq_l"       
     [5] "users:coralshanshan" "users:raininglxy"    "users:pengfeihuchao" "users:leochenlei"   
     [9] "users:daisypp"       "users:wolys"         "users:z370433835"   

#通过KEY查询VALUE
redisSMembers("users:wolys")

    [[1]]
    [1] "pw:wolysopen111"

    [[2]]
    [1] "email:wolys@21cn.com"

    [[3]]
    [1] "id:wolys"

#关闭redis连接
redisClose()

完成测试案例。

数据文件:data5.txt

wolys # wolysopen111 # wolys@21cn.com
coralshanshan # 601601601 # zss1984@126.com
pengfeihuchao # woaidami # 294522652@qq.com
simulategirl # @#$9608125 # simulateboy@163.com
daisypp # 12345678 # zhoushigang_123@163.com
sirenxing424 # tfiloveyou # sirenxing424@126.com
raininglxy # 1901061139 # lixinyu23@qq.com
leochenlei # leichenlei # chenlei1201@gmail.com
z370433835 # lkp145566 # 370433835@qq.com
cxx0409 # 12345678 # cxx0409@126.com
xldq_l # 061222ll # viv093@sina.com


本文转载自:http://blog.fens.me/nosql-r-redis/

openthings
粉丝 325
博文 1140
码字总数 689435
作品 1
东城
架构师
私信 提问
OSC 第 91 期高手问答 — R 语言的核心技术

OSCHINA 本期高手问答 ( 9月16日- 9月22日 ) 我们请来了《R的极客理想 高级开发篇》的作者@bsspirit (张丹)为大家解答关于 R 语言的核心技术的问题。 张丹,@bsspirit ,R语言资深用户,系...

叶秀兰
2015/09/16
5.5K
46
【云周刊】第222期:从遇见到信任 | Apache Dubbo 的毕业之旅

欢迎订阅云周刊 本期头条 从遇见到信任 | Apache Dubbo 的毕业之旅 2019年5月16日,Apache 软件基金会董事会决议通过了 Apache Dubbo 的毕业申请,这意味着 Apache Dubbo 正式成为 Apache 的...

场景研读
06/14
0
0
给我两小时!带你发动R语言数据挖掘的高铁,一往直前!

主题: 数据挖掘快速上手之R语言实践 随之DT时代的到来,传统的统计分析方法已经不能解决海量高维数据,如何运用数据挖掘手段对复杂数据进行数据处理、数据可视化、数据建模及模型解读是每一...

李晓文
2017/04/18
0
0
R语言基础之第五部分 总结数据信息

R语言基础之第五部分 总结数据信息 1、以R自带数据集airquality为例 2、以R自带数据集Titanic为例 后续请参考: R语言基础之第一部分 : 5种数据对象类型 R语言基础之第二部分 : 操纵数据取子...

多美丽很美丽
08/25
0
0
R语言深度学习包有哪些????

R语言深度学习的包有哪些???求大神告知R语言深度学习的包有哪些?R语言深度学习的包有哪些???求大神告知R语言深度学习的包有哪些?R语言深度学习的包有哪些???求大神告知R语言深度学...

pb加油
2016/08/31
282
0

没有更多内容

加载失败,请刷新页面

加载更多

java通过ServerSocket与Socket实现通信

首先说一下ServerSocket与Socket. 1.ServerSocket ServerSocket是用来监听客户端Socket连接的类,如果没有连接会一直处于等待状态. ServetSocket有三个构造方法: (1) ServerSocket(int port);...

Blueeeeeee
今天
6
0
用 Sphinx 搭建博客时,如何自定义插件?

之前有不少同学看过我的个人博客(http://python-online.cn),也根据我写的教程完成了自己个人站点的搭建。 点此:使用 Python 30分钟 教你快速搭建一个博客 为防有的同学不清楚 Sphinx ,这...

王炳明
昨天
5
0
黑客之道-40本书籍助你快速入门黑客技术免费下载

场景 黑客是一个中文词语,皆源自英文hacker,随着灰鸽子的出现,灰鸽子成为了很多假借黑客名义控制他人电脑的黑客技术,于是出现了“骇客”与"黑客"分家。2012年电影频道节目中心出品的电影...

badaoliumang
昨天
15
0
很遗憾,没有一篇文章能讲清楚线程的生命周期!

(手机横屏看源码更方便) 注:java源码分析部分如无特殊说明均基于 java8 版本。 简介 大家都知道线程是有生命周期,但是彤哥可以认真负责地告诉你网上几乎没有一篇文章讲得是完全正确的。 ...

彤哥读源码
昨天
15
0
jquery--DOM操作基础

本文转载于:专业的前端网站➭jquery--DOM操作基础 元素的访问 元素属性操作 获取:attr(name);$("#my").attr("src"); 设置:attr(name,value);$("#myImg").attr("src","images/1.jpg"); ......

前端老手
昨天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部