R語言與Redis的聯合使用

分爲4個章節。redis

Redis環境準備
rredis函數庫
rredis基本使用操做
rredis使用案例

每一章節,都會分爲」文字說明部分」和」代碼部分」,保持文字說明與代碼的連貫性。shell

第一章 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插入數據,讀取數據。dom

  • 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

啓動redisthis

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

    Starting redis-server: redis-server.

查看系統進程spa

~ 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
相關文章
相關標籤/搜索