使用 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组建分布式架构,由标题就能看出此内容不是一篇分享文章能说完的,所以我打算分几篇分享文章来讲解,一步一步实现分 ...
随机推荐
- Ensemble Learning
Ensemble Learning是机器学习里最常见的建模方法,RandomForest 和 GBDT 采用了Ensemble Learning模式,只是具体方法不同. 下面简单翻译下一 https: ...
- Spring.Net的使用
1.Spring.Net的简单介绍 spring.net 框架是微软效仿java中的spring框架而推出的一种在.net中使用的框架,它使用配置的方式实现逻辑的解耦,它的主要功能集成在Spring. ...
- expdp全库备份rac数据库因错误终止
1.expdp导出日志报错如下: ORA-39014: One or more workers have prematurely exited. ORA-39029: worker 2 with pr ...
- JavaCollection Java 集合框架
Spring Injecting Collection https://www.tutorialspoint.com/spring/spring_injecting_collection.htm No ...
- 【mlflow】mlflow打包、启动、换用mysql backend、mysql配置
mlflow是一个自动化机器学习平台,支持python2也支持python3 mlflow9.0添加了数据库作为tracking data的存储: https://github.com/mlflow/ ...
- 一只青蛙从第一级台阶跳到第n级,每次可以跳任意级,共有多少种跳法,并写出递推式
是斐波那契数列问题 假设f(n)是n个台阶跳的次数:(假设已经调到第n个台阶,最后一次是由哪个台阶跳上来的) f(n) = f(n-1)+f(n-2)+...+f(n-(n-1)) + f(n-n) ...
- 解决Android中ListView列表只显示一项数据的问题
思路:获取每项item的高度,并相加,再加上分割线的高度,作为整个ListView的高度,方法如下: public static void setListViewHeightBasedOnChildr ...
- mysql 数据操作 单表查询 通过四则运算查询
#通过四则运算查询 FROM employee; AS Annual_salary FROM employee; Annual_salary FROM employee; 查看年薪salary*12 ...
- hive两大表关联优化试验
呼叫结果(call_result)与销售历史(sale_history)的join优化: CALL_RESULT: 32亿条/444G SALE_HISTORY:17亿条/439G 原逻辑 Map: ...
- nmon 命令
nmon 命令 用途 以交互方式显示本地系统统计信息并以记录方式记录系统统计信息. 语法 交互方式: nmon [ -h ] nmon [ -s < seconds >] [ -c < ...