RDS可以和云数据库Memcache、云数据库Redis搭配使用,组成高吞吐、低延迟的存储解决方案。下面以云数据库Memcache与RDS的搭配使用为例介绍缓存数据持久化方案。

背景信息

与RDS相比,云数据库缓存产品有如下两个特性:

  • 响应速度快,云数据库Memcache和云数据库Redis请求的时延通常在几毫秒以内。

  • 缓存区能够支持比RDS更高的QPS(每秒处理请求数)。

环境要求

  • 本地环境或者ECS已安装memcached并且已启动memcached环境(支持SASL扩展)。

    memcached下载地址:memcached

    memcached安装步骤,请参见memcached安装步骤

  • 以Python为例,本地或者ECS环境需安装python、pip、python-memcached。

    python-memcached安装命令如下:

    sudo pip install python-memcached

memcached安装步骤

  1. 将下载的memcached安装文件上传到Linux系统,例如/opt/soft目录下。
  2. 执行如下命令,解压memcached压缩包。
    tar -zxvf memcached-1.6.9.tar.gz
  3. 下载libevent库。
    说明 下载地址为:libevent下载地址
  4. 执行如下命令,解压libevent压缩包:
    tar -zxvf libevent-2.1.12-stable.tar.gz
  5. 进入libevent解压目录,依次执行如下命令,安装libevent:
    sudo ./configure --prefix=/usr/local/libevent
    sudo make
    sudo make install
    说明 --prefix是安装路径配置项。
  6. 进入memcached解压目录,依次执行如下命令,安装memcached:
    sudo ./configure --prefix=/usr/local/memcached --with-libevent=/usr/local/libevent
    sudo make
    sudo make install
  7. 执行如下命令,启动memcached的服务器:
    sudo /usr/local/memcached/bin/memcached -d -m 10 -u root -p 11211 -c 256 -P /tmp/memcached.pid
  8. 执行如下命令,查看服务是否启动成功:
    ps -ef | grep 11211
    如果启动成功,返回类似如下结果:
    root     16940     1  0 Mar23 ?        00:00:05 /usr/local/memcached/bin/memcached -d -m 10 -u root -p 11211 -c 256 -P /tmp/memcached.pid
  9. 执行如下命令,结束服务:
    sudo kill `cat /tmp/memcached.pid`

代码示例

云数据库Memcache与RDS搭配使用的代码示例如下:

#!/usr/bin/env python
import memcache
import mysql_client

def memcache_demon():
    memcache_client = memcache.Client(["ip:port"], debug=True)
    #在云数据库Memcache中查找某个值
    res = memcache_client.get('s_id')
    print("res:", res)
    if res is not None:
        return res  #查询到值则返回
    else:
        #未查询到值,则在RDS查询操作
        res = mysql_client.fetchone()
        # 向云数据库Memcache中写入缓存数据,并设置过期时间
        memcache_client.set('s_id', res, time=30)
        return res

python连接数据库获取数据代码示例如下:

import pymysql

def fetchone():
    db = pymysql.connect(host='ip',
                         user='user',
                         password='pwd',
                         database='dbname',
                         port=3306,
                         charset='utf8')
    # 使用cursor()方法创建一个游标对象cursor
    cursor = db.cursor()
    # 使用execute()方法执行SQL查询
    cursor.execute("select s_id from student")
    s_id = cursor.fetchone();
    if s_id:
        print('s_id:',s_id)
    # 关闭游标
    cursor.close()
    # 关闭数据库连接
    db.close()
    return s_id