Table of Contents

上一个主题

如何使用KVDB服务

下一个主题

MongoDB

本页

Redis

Redis 是一个基于内存、键值对的开源存储系统。它可以用作数据库、缓存和消息中间件。

在新浪云上,您可以很方便的创建和管理 Redis 实例。目前所有的 Redis 实例都是一主一从架构,我们会实时监控您的 Redis 实例,如果主节点宕机,我们会自动将从节点提升为主,从而保证您的服务和数据不受影响。

创建

进入云应用控制台的任一应用管理页面,点击左侧栏的『数据库与缓存/Redis』,进入 Redis 的管理页面,点击上方的『创建 Redis』,如下图所示:

../../_images/redis-create.png

创建实例需要设置以下参数:

  • 名称:最大长度不超过 32 个字符,限英文、数字、下划线,横线。
  • 内存:Redis 最大使用的内存的大小。
  • 内存满时删除策略:也就是 Redis 配置文件里的 maxmemory-policy ,内存满时对 Key 的删除策略,默认为“不删除,返回错误(noeviction)”。其它可选项见下表所示:
策略 说明
noeviction 不删除,直接返回错误。
allkeys-lru 优先删除最近最少使用的 key,以释放内存。
volatile-lru 优先删除设定了过期时间的 key 中最近最少使用的 key,以释放内存。
allkeys-rando 随机删除一个 key,以释放内存。
volatile-random 从设定了过期时间的 key 中随机删除一个,以释放内存。
volatile-ttl 从设定了过期时间的 key 中删除最老的 key,以释放内存。

更详细的内容参见: Using Redis as an LRU cache

创建后,即可点击管理进入信息页,在信息页中,可以查看Redis的连接地址、端口、以及密码。

../../_images/redis-info.png

数据导入

如果你想将自己现有 Redis 实例里的数据导入到新浪云线上的 Redis 实例里,可以按以下步骤操作:

开启自己现有 Redis 实例的 AOF 功能(如果实例已经启用 AOF 功能则忽略此步骤)。

$ redis-cli -h Redis实例地址 -p Redis实例端口 config set appendonly yes

开启 AOF 功能后,Redis 实例会在数据目录下生成一个 .aof 文件,一般文件名为 appendonly.aof

通过 VPN 隧道 连接到新浪云的云端网络。执行以下命令将 .aof 文件中的数据导入到线上 Redis 实例里。

$ redis-cli -h 线上Redis实例地址 -p 线上Redis实例端口 -a 线上Redis实例密码 --pipe < appendonly.aof

注解

redis-cli 是 Redis 的命令行管理工具。

管理

点击实例右侧操作栏的『管理』可以进入一个连接到对应的 Redis 的 redis-cli 页面,你可以通过其管理你的 Redis。

../../_images/redis-cli.png

你也可以通过 VPN 隧道 连接到新浪云的云端网络。然后使用 Redis Desktop Manager 等管理工具来管理 Redis 。

删除

进入 Redis 的管理页面,在对应实例后面的操作栏中选择『删除』即可。

扩容

你可以在线扩大或者缩小 Redis 实例的内存容量,进入 Redis 的管理页面,在对应实例后面的操作栏中选择『修改』即可,扩容期间 Redis 会重启,可能会造成短时间的服务不可用。

主从切换

每个 Redis 实例都是一主一从热备,如果主节点所在的机器宕机,监控会自动将从节点提升为主,并再添加一个新的从节点保持主从架构不变。整个过程对应用完全透明。

警告

当一个实例中的主节点失效,而最新的数据没有同步到对应的从节点时,主从切换会造成这部分数据丢失。

性能

下面是使用 redis-benchmark 对一个 1G 的 Redis 实例(在实例所在的机器)进行 benchmark 的结果。

$ redis-benchmark -h lj******mfzg.redis.sae.sina.com.cn -p 10017 -a ****** -q -n 100000
PING_INLINE: 82712.98 requests per second
PING_BULK: 78247.26 requests per second
SET: 78988.94 requests per second
GET: 78740.16 requests per second
INCR: 79428.12 requests per second
LPUSH: 78064.01 requests per second
LPOP: 79051.38 requests per second
SADD: 78864.35 requests per second
SPOP: 78247.26 requests per second
LPUSH (needed to benchmark LRANGE): 79051.38 requests per second
LRANGE_100 (first 100 elements): 37257.82 requests per second
LRANGE_300 (first 300 elements): 15569.05 requests per second
LRANGE_500 (first 450 elements): 10976.95 requests per second
LRANGE_600 (first 600 elements): 8773.47 requests per second
MSET (10 keys): 46641.79 requests per second

NodeJS

您可以使用 Redis 官网列出的任意 NodeJS客户端 来访问 Redis 。这里我们使用官网推荐的 node_redis

安装并添加 node_redispackage.json 文件。

npm install redis --save

连接代码示例:

var redis = require('redis');
var client = redis.createClient('redis://密码@地址:端口', {no_ready_check: true});

Go

您可以使用 Redis 官网列出的任意 Go客户端 来访问 Redis 。这里我们使用官网推荐的 Redigo

import "github.com/garyburd/redigo/redis"

c, err := redis.Dial("tcp", "地址:端口", redis.DialPassword("密码"))
if err != nil {
    // handle error
}
defer c.Close()

Java

您可以使用 Redis 官网列出的任意 Java客户端 来访问 Redis 。这里我们使用官网推荐的 Jedis

pom.xml 文件中添加以下 Jedis 依赖。

<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>2.0.0</version>
    <type>jar</type>
    <scope>compile</scope>
</dependency>

连接代码示例:

try {
    URI redisUri = new URI("redis://密码@地址:端口");
    JedisPool pool = new JedisPool(new JedisPoolConfig(),
            redisUri.getHost(),
            redisUri.getPort(),
            Protocol.DEFAULT_TIMEOUT,
            redisUri.getUserInfo().split(":",2)[1]);
} catch (URISyntaxException e) {
    // URI couldn't be parsed.
}

Python

您可以使用 Redis 官网列出的任意 Python客户端 来访问 Redis 。这里我们使用官网推荐的 redis-py

添加 redis-pyrequirements.txt 。然后就可以使用其API访问 Redis 了。

import redis
r = redis.StrictRedis.from_url('redis://密码@地址:端口')