使用 Redis
Redis(https://redis.io/),既不像 SQLite 以表的形式存储数据,也不像 MongoDB 允许
以嵌套结构存储和查询,它是一种内存数据库结构,即将数据缓存在内存中。它将键—值
(key-value)缓存于内存中,以此获得极高的键值检索性能。然而,它并不支持 SQL 数据
库或 MongoDB 中所使用的查询语句。
Redis 通常被用作高速缓冲存储器。我们可以用它存储和操作一系列基本的数据结构。
安装 Redis,请访问 https://redis.io/download。 遗憾的是,官方版本不支持 Windows 操作系
统,但 Microsoft Open Tech 小组仍开发并维护着一种 Win64 接口的 Redis,详情请访
问 https://github.com/MSOpenTech/redis。
SQL 数据库存储表格、MongoDB 存储文档,而 Redis 存储键—值对,如下所示:
name: Something
type: 1
grade: A
该值不是简单数值,它可以具有更复杂的数据结构(例如,哈希映射、集合、有序集合)。
Redis 提供了一个处理这些数据结构的简单界面,并且同时具有高性能和低延迟的优点。
1.用 R 访问 Redis
用 R 访问 Redis 实例,需要使用 rredis 扩展包,它提供了一些操作 Redis 的简单函
数。运行下列代码安装此扩展包:
install.packages("rredis")
一旦扩展包准备就绪,我们就可连接至 Redis 实例:
library(rredis)
redisConnect( )
在不设置参数的情况下,默认连接至本地 Redis 实例,也可以连接至远程实例。
2.设置 Redis 服务器和获取数据
Redis 最基本的用法就是调用 redisSet(key, value)。在 R 中,这个值默认序列
化,因此我们可以在 Redis 中存储所有 R 对象:
redisSet("num1", 100)
## [1] "OK"
现在,该命令生效了,我们可以取出该键中的值:
redisGet("num1")
## [1] 100
也可以存储一个整数向量:
redisSet("vec1", 1:5)
## [1] "OK"
redisGet("vec1")
## [1] 1 2 3 4 5
甚至可以存储一个数据框:
redisSet("mtcars_head", head(mtcars, 3))
## [1] "OK"
redisGet("mtcars_head")
## mpg cyl disp hp drat wt qsec vs am gear carb
## Mazda RX4 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4
## Mazda RX4 Wag 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4
## Datsun 710 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1
实际上,如果其他计算机有权限访问你的 Redis 实例,他们在 R 中使用 redisGet( )
会得到相同的数据。
然而,如果这个键根本不存在,我们只能得到 NULL:
redisGet("something")
## NULL
可以用 redisExists( ) 检验某个键是否存在,而不是得到 NULL:
redisExists("something")
## [1] FALSE
redisExists("num1")
## [1] TRUE
如果不再用到某个键,可以用 redisDelete( ) 删除它:
redisDelete("num1")
## [1] "1"
## attr(,"redis string value")
## [1] TRUE
redisExists("num1")
## [1] FALSE
除了普通的键—值对,Redis 也支持一些更高级的数据结构。例如,我们可以
用 redisHset( ) 对水果创建一个哈希映射,其中不同水果的数量不同:
redisHSet("fruits", "apple", 5)
## [1] "0"
## attr(,"redis string value")
## [1] TRUE
redisHSet("fruits", "pear", 2)
## [1] "0"
## attr(,"redis string value")
## [1] TRUE
redisHSet("fruits", "banana", 9)
## [1] "0"
## attr(,"redis string value")
## [1] TRUE
调用 redisHGet( ) 获取哈希映射中某个字段的值:
redisHGet("fruits", "banana")
## [1] 9
也可以得到这个哈希映射结构的列表表示:
redisHGetAll("fruits")
## $apple
## [1] 5
##
## $pear
## [1] 2
##
## $banana
## [1] 9
此外,还可以得到哈希映射的键:
redisHKeys("fruits")
## [[1]]
## [1] "apple"
## attr(,"redis string value")
## [1] TRUE
##
## [[2]]
## [1] "pear"
## attr(,"redis string value")
## [1] TRUE
##
## [[3]]
## [1] "banana"
## attr(,"redis string value")
## [1] TRUE
也可以只取出哈希映射中的所有值(不包括键):
redisHVals("fruits")
## [[1]]
## [1] 5
##
## [[2]]
## [1] 2
##
## [[3]]
## [1] 9
获取哈希映射中的字段数量:
redisHLen("fruits")
## [1] "3"
## attr(,"redis string value")
## [1] TRUE
一次性取出多个字段的值:
redisHMGet("fruits", c("apple", "banana"))
## $apple
## [1] 5
##
## $banana
## [1] 9
通过提供一个列表来设置多个字段的值:
redisHMSet("fruits", list(apple = 4, pear = 1))
## [1] "OK"
现在,字段中的值被更改了:
redisHGetAll("fruits")
## $apple
## [1] 4
##
## $pear
## [1] 1
##
## $banana
## [1] 9
除了哈希映射,Redis 也支持队列。我们可以从队列的左端或右端推送(push)值。例
如,从右端依次输入整数 1、2、3:
for (qi in 1:3) {
redisRPush("queue", qi)
}
调用 redisLLen( ) 获取当前队列的长度:
redisLLen("queue")
## [1] "3"
## attr(,"redis string value")
## [1] TRUE
现在,这个队列有 3 个元素。值得注意的是,这里的值是一个字符向量,而不是一个
整数。因此,如果在其他地方需要使用数值形式,就必须进行转换。
然后,我们可以保持队列的值一直从左端弹出(pop):
redisLPop("queue")
## [1] 1
redisLPop("queue")
## [1] 2
redisLPop("queue")
## [1] 3
redisLPop("queue")
## NULL
注意,队列中只有 3 个元素可供取出,所以第 4 次试图提取的动作返回了 NULL,这
可以用来检查队列当前是否为空。
最后,应关闭 Redis 连接,释放占用的资源。
redisClose()
Redis 具有更高级的特性,但超出了本章的范围。它不仅支持数据结构的存储,还可用
于消息代理,也就是说,我们可以利用它在不同程序间传送消息。更多高级用法,请访问
官方文档 http://redis.io/documentation。
使用 Redis的更多相关文章
- 使用redis构建可靠分布式锁
关于分布式锁的概念,具体实现方式,直接参阅下面两个帖子,这里就不多介绍了. 分布式锁的多种实现方式 分布式锁总结 对于分布式锁的几种实现方式的优劣,这里再列举下 1. 数据库实现方式 优点:易理解 缺 ...
- Ignite性能测试以及对redis的对比
测试方法 为了对Ignite做一个基本了解,做了一个性能测试,测试方法也比较简单主要是针对client模式,因为这种方法和使用redis的方式特别像.测试方法很简单主要是下面几点: 不作参数优化,默认 ...
- mac osx 安装redis扩展
1 php -v查看php版本 2 brew search php|grep redis 搜索对应的redis ps:如果没有brew 就根据http://brew.sh安装 3 brew ins ...
- Redis/HBase/Tair比较
KV系统对比表 对比维度 Redis Redis Cluster Medis Hbase Tair 访问模式 支持Value大小 理论上不超过1GB(建议不超过1MB) 理论上可配置(默认配置1 ...
- Redis数据库
Redis是k-v型数据库的典范,设计思想及数据结构实现都值得学习. 1.数据类型 value支持五种数据类型:1.字符串(strings)2.字符串列表(lists)3.字符串集合(sets)4.有 ...
- redis 学习笔记(2)
redis-cluster 简介 redis-cluster是一个分布式.容错的redis实现,redis-cluster通过将各个单独的redis实例通过特定的协议连接到一起实现了分布式.集群化的目 ...
- redis 学习笔记(1)
redis持久化 snapshot数据快照(rdb) 这是一种定时将redis内存中的数据写入磁盘文件的一种方案,这样保留这一时刻redis中的数据镜像,用于意外回滚.redis的snapshot的格 ...
- python+uwsgi导致redis无法长链接引起性能下降问题记录
今天在部署python代码到预生产环境时,web站老是出现redis链接未初始化,无法连接到服务的提示,比对了一下开发环境与测试环境代码,完全一致,然后就是查看各种日志,排查了半天也没有查明是什么原因 ...
- nginx+iis+redis+Task.MainForm构建分布式架构 之 (redis存储分布式共享的session及共享session运作流程)
本次要分享的是利用windows+nginx+iis+redis+Task.MainForm组建分布式架构,上一篇分享文章制作是在windows上使用的nginx,一般正式发布的时候是在linux来配 ...
- windows+nginx+iis+redis+Task.MainForm构建分布式架构 之 (nginx+iis构建服务集群)
本次要分享的是利用windows+nginx+iis+redis+Task.MainForm组建分布式架构,由标题就能看出此内容不是一篇分享文章能说完的,所以我打算分几篇分享文章来讲解,一步一步实现分 ...
随机推荐
- angular -- get请求该如何使用?
在做 angualr 的开发过程中,经常会用到的就是 ajax 请求.下面是 get 请求示例: 如果存在多个 get 请求可以考虑进行封装下: // get 携参数访问 ajaxGet(getUrl ...
- 微信小程序 --- 用户登录
整体逻辑:点击用户中心,如果如果整个页面没有
- javascript飞机大战-----004创建子弹对象
/* 创建子弹:因为子弹不是只创建一个所以要用构造函数 注意一点:子弹发射的位置应该是英雄机的正中央的位置,所以需要传点东西进来 */ function Bullet(l,t){ this.l = l ...
- 沈阳网络赛K-Supreme Number【规律】
26.89% 1000ms 131072K A prime number (or a prime) is a natural number greater than 11 that cannot be ...
- 终于修好了MacBook
之前由于Trackpad故障,陆家嘴苹果店开了维修单,让我在2周内去更换,详见第二次去苹果店维修MacBook. 后来由于购买了AppleCare进行延保,又担心放在那维修时间长,就懒得去更换了. 昨 ...
- ubuntu下安装meshlab
PPA 安装,打开终端,输入以下命令: sudo add-apt-repository ppa:zarquon42/meshlab sudo apt-get update sudo apt-get i ...
- Linux系统stat指令用法
stat指令:文件/文件系统的详细信息显示. stat命令主要用于显示文件或文件系统的详细信息,该命令的语法格式如下: stat命令-->用来显示文件的详细信息,包括inode, atime, ...
- 第1章 1.6计算机网络概述--OSI参考模型
ISO七层模式:国际标准组织对互联网通信规则进行的定义. 7.应用层:所有能产生网络流量的程序,如:QQ. 6.表示层:传输前对数据进行进行处理,是一种数据处理的规则,如:加密.压缩.传输二进制(图片 ...
- git-【一】概述安装
一:Git是什么? Git是目前世界上最先进的分布式版本控制系统. 二:SVN与Git的最主要的区别? SVN是集中式版本控制系统,版本库是集中放在中央服务器的,而干活的时候,用的都是自己的电脑,所以 ...
- Amber安装并行
现在简单介绍一下amber12中安装openmpi并行的过程. 1. 下载openmpi版本在1.5-1.9之间的(openmpi-1.6.5.tar.bz2) 这是因为$AMBERHOME/Ambe ...