使用 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组建分布式架构,由标题就能看出此内容不是一篇分享文章能说完的,所以我打算分几篇分享文章来讲解,一步一步实现分 ...
随机推荐
- thinkphp---自动验证的问题
这段时间做一个项目:使用 thinkphp 做了一个自动验证,但是发现如果新增的时候,是能够进行自动验证的,但是在修改的修改的时候,会发现自动验证会失效. 验证的时候,模型是这样写的: protect ...
- C++ 引用的辨别
对于习惯使用C进行开发的朋友们,在看到c++中出现的&符号,可能会犯迷糊,因为在C语言中这个符号表示了取地址符,但是在C++中它却有着不同的用途,掌握C++的&符号,是提高代码执行效率 ...
- windows dos 常用命令行
有关某个命令的详细信息,请键入 HELP 命令名 dir (directory) :列出当前目录下的文件以及文件夹 md (make directory): 创建目录 rd (remove direc ...
- Educational Codeforces Round 29
A. Quasi-palindrome 题目链接:http://codeforces.com/contest/863/problem/A 题目意思:问一个数可不可以在不上一些前缀0以后变成一个回文数. ...
- android data recovery and nc
目录下会出现mmcblk0.raw文件,文件大小等于手机内部存储空间的大小,该文件正是手机内部存储空间的镜像文件. 第七步,打开一款传统的数据恢复工具,由于raw文件是linux文件系统格式,因此需要 ...
- 002-Spring Framework-Core-01-IoC容器
一.概述 文章地址:https://docs.spring.io/spring/docs/5.0.6.RELEASE/spring-framework-reference/ 核心主要包括:IoC co ...
- ArcEngine和GDAL读写栅格数据机制对比(一)
最近应用AE开发插值和栅格转等值线的程序,涉及到栅格读写的有关内容.联想到ArcGIS利用了GDAL的某些东西,从AE的OMD中也发现RasterDataset和RasterBand这些命名和GDAL ...
- [py][mx]django实现课程机构排名
如果是第一次做这个玩意,说实话,确实不知道怎么弄, 做一次后就有感觉了 此前我们已经完成了: 分类筛选 分页 这次我们做的是 课程机构排名 知识点: - 按照点击数从大到小排名, 取出前三名 hot_ ...
- mysql慢日志
mysql慢日志是用来记录执行时间比较长的sql工具(超过long_query_time的sql),这样对于跟踪有问题的sql很有帮助. 查看是否启用慢日志和相关信息 上面截图其中: log_slow ...
- B树、B+树、二叉树、红黑树
B树下面来具体介绍一下B-树(Balance Tree),一个m阶的B树具有如下几个特征:1.根结点至少有两个子女.2.每个中间节点都包含k-1个元素和k个孩子,其中 m/2 <= k < ...