Redis

注意:BAE的Redis只能被部署在BAE中的应用访问,无法通过公网或BAE的本地开发环境访问。

Redis服务是百度云为开发者提供的key-value型非关系型数据库服务,后端采用的是业界极为流行的数据库Redis(当前使用的Redis官方版本是2.6.11),并在前端提供与Redis完全一致的使用方式,特点如下:

  • 支持百万级别的后端数据库集群,并且多机房自动冗余备份,开发者不需要关注后端机器及数据库的稳定性、网络问题、机房灾难、单库压力等各种风险。
  • 完全兼容Redis协议,开发者可以像使用本地Redis一样使用Redis服务。
  • 提供数据隔离,不同应用的数据库存于不同数据库中,不会相互影响。
  • 提供安全性检查,对于恶意攻击性访问及时发现并拒绝。
  • 提供免费套餐以及多种付费套餐的形式,满足不同开发者的需求。
  • 支持各语言原生的SDK访问数据库。

添加Redis数据库服务

  1. 在“应用引擎BAE-部署列表”页面选取目标部署并单击进入后,单击左侧导航栏的“扩展服务”。
  2. 单击“添加扩展服务”,选择Redis。

  3. 选择合适的套餐并勾选“同意”后,单击“立即购买”进入确认订单页面确认购买。

  4. 购买成功后返回“扩展服务列表”页面,Redis部分显示新添加的Redis数据库资源。

  5. 单击数据库名称进入“Redis数据库详情”页面,展示基本信息及运行状态的同时,可对数据库进行删除操作:

    单击右上角的“删除服务”按钮后对数据库进行删除,确定后系统会回收相应的服务资源。

代码示例

Node.js连接Redis

注意:Redis扩展服务不能使用连接池,例如sol-redis-pool, node-redis-connection-pool。

  1. 将依赖添加到package.json。

    {
        "dependencies": {
            "redis": "0.12.1"
        }
    }
    
  2. 添加代码连接Redis服务。

    var redis = require('redis');
    /*数据库连接信息host,port,user,pwd,dbname(可查询数据库详情页)*/
    var username = '<User_AK>';  //用户AK
    var password = '<User_SK>';  //用户SK
    var db_host = 'redis.duapp.com';   
    var db_port = 80;
    var db_name = '<DB_Name>';   //数据库名称
    console.log(db_host);
    console.log(db_port);
    var options = {"no_ready_check":true};
    
    function testRedis(req, res) {
      var client = redis.createClient(db_port, db_host, options);
      client.on("error", function (err) {
        console.log("Error " + err);
      });
    
      // 建立连接后,在进行集合操作前,需要先进行auth验证
    
      client.auth(username + '-' + password + '-' + db_name);
    
      client.set('baidu', 'welcome to BAE');
    
      client.get('baidu', function(err, result) {
        if (err) {
          console.log(err);
          res.end('get error');
          return;
        }
        res.end('result: ' + result);      
      }); 
    
    }
    
    module.exports = testRedis;
    

PHP连接Redis

注意:Redis扩展服务不能使用连接池,例如redis.py的php-connect-pool。

<?php
/*从平台获取数据库名*/
$dbname = "<DB_Name>"; //数据库名称

/*从环境变量里取host,port,user,pwd*/
$host = 'redis.duapp.com';
$port = '80';
$user = '<User_AK>'; //用户AK
$pwd = '<User_SK>';  //用户SK

try {
    /*建立连接后,在进行集合操作前,需要先进行auth验证*/
    $redis = new Redis();
    $ret = $redis->connect($host, $port);
    if ($ret === false) {
    die($redis->getLastError());
    }

    $ret = $redis->auth($user . "-" . $pwd . "-" . $dbname);
    if ($ret === false) {
    die($redis->getLastError());
    }

    /*接下来就可以对该库进行操作了,具体操作方法请参考phpredis官方文档*/
    $redis->flushdb();
    $ret = $redis->set("key", "value");
    if ($ret === false) {
    die($redis->getLastError());
    } else {
    echo "OK";
    }

} catch (RedisException $e) {
    die("Uncaught exception " . $e->getMessage());
}
?>

Python连接Redis

注意:Redis扩展服务不能使用连接池,例如redis.py的ConnectionPool。

#-*- coding:utf-8 -*-

def test_redis():
    ### 开发者在requirements.txt中指定依赖Redis使用
    import redis
    ### 从管理控制台获取host, port, db_name, api_key, secret_key值 
    db_name = "<DB_Name>" # 数据库名称
    api_key = "<User_AK>" # 用户AK
    secret_key = "<User_SK>" # 用户SK
    myauth = "%s-%s-%s"%(api_key, secret_key, db_name)

    ### 连接Redis服务
    r = redis.Redis(host = "redis.duapp.com", port = 80, password = myauth)

    ### 进行各种Redis操作,如set、get
    r.set("foo", "bar")
    return "get foo=> %s success!"%r.get("foo")

def app(environ, start_response):
    status = '200 OK'
    headers = [('Content-type', 'text/html')]
    start_response(status, headers)
    try:
        return test_redis()
    except:
        return 'handle exception'

from bae.core.wsgi import WSGIApplication
application = WSGIApplication(app)

Java连接Redis

注意:Redis扩展服务不能使用连接池,例如JedisPool。

import redis.clients.jedis.Jedis;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


public class RedisBasic extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
        throws ServletException, IOException {
        try {
            /*****填写数据库相关信息(请查找数据库详情页)*****/
            String databaseName = "<DB_Name>"; //数据库名称
            String host = "redis.duapp.com";
            String portStr = "80";
            int port = Integer.parseInt(portStr);
            String username = "<User_AK>"; //用户AK
            String password = "<User_SK>"; //密码SK

            /******接着连接并选择数据库名为databaseName的服务器******/
            Jedis jedis = new Jedis(host, port);
            jedis.connect();
            jedis.auth(username + "-" + password + "-" + databaseName);

            /*至此连接已完全建立,就可对当前数据库进行相应的操作了*/
            /*接下来就可以使用redis数据库语句进行数据库操作,详细操作方法请参考java-redis官方文档*/
            PrintWriter out = resp.getWriter();
            //删除所有redis数据库中的key-value
            jedis.flushDB();
            //简单的key-value设置
            jedis.set("name", "bae");
            System.out.println("name | " + jedis.get("name"));
        } catch (Exception e) {
            e.printStackTrace(resp.getWriter());
        }
    }
 }

使用说明

数据库访问说明

  • 请求: 为了防止恶意攻击,云数据库采用分钟配额来限制数据库的访问,超配额的数据库将会被封禁5分钟。请求数限制为300000个/分钟。每次读、写请求(包括命令行长度)允许最大长度为2KB,响应最大长度为512KB;如果请求或者响应的长度超过了上述限制,系统会返回错误码。
  • 连接数:每个数据库并发连接数最大为30。
  • 容量:每个数据库有各自的容量限制,超过配额后,数据库将会被封禁,请提供做好预算并及时扩容。目前Redis容量按keys数量来计算,每个数据库可用的keys总数量为100000(通过dbsize命令可以查看到,也可以在管理界面中查看)。

注意: BAE的数据库扩展服务只能被部署在BAE中的应用访问,无法通过公网或BAE的本地开发环境访问。

服务使用说明

下述表格中的命令限制使用。

命令类别 命令
Keys(键) keys, migrate, move, restore, sort
Sring(字符串) append
List(链表) blpop, brpop, brpoplpush
Pub/Sub(发布/订阅) 全部命令
Transaction(事务) 全部命令
Script(脚本) 全部命令
Connection(连接) ping,select
Server(服务器) bgrewriteaof, bgsave, client kill, client list, client getname, client setname, config get, config set, config resetstat, debug object, debug, segfault, flushall, info, lastsave, monitor, save, shutdown, slaveof, slowlog, sync

错误码

错误信息 说明 建议
Server Error 服务器错误 联系云数据库管理员
Invalid Request 协议包非法或者命令长度超限 使用标准协议连接云数据库;减小命令长度
Invalid AkSkDbname AK、SK或数据库名称错误 请核对连接数库时使用的参数正确性
Auth Required 未通过权限验证 请先使用auth命令验证权限
Command Not Supported 不支持的命令 不使用这些命令
Access Forbidden 禁止访问 数据库容量超限或过期,扩容或续费
Connections Exceeded 连接数超限 优化应用代码,及时释放连接
Reponse Too Long 响应大于512KB 减少读取key的数量