Memcached 和 mysqld 的联通

一 概述:
  1. what's UDFs ?

    UDFs是User Defined Functions的缩写,表示Mysql用户自定义的函数,应用程序可以利用这些函数从MySQL5.0以上的版本的数据库中访问Memcached写入或者获取的数据。此外,MySql 从5.1版本开始支持触发器。从而可以在触发器中使用UDFs直接更新Memcached的内容,这种方式降低了应用程序的设计和编写的复杂性。

  2. 下面简单介绍UDFs的安装和使用。安装UDFs需要在数据库服务器上安装两个包,分别是libmemcached和memcached_functions_mysql,这两个包都可以从http://download.tangent.org/下载,安装如下:

    2.1. 需要的软件有memcached-1.2.6,libevent-1.4.4-stable,libmemcached-0.30这些软件非常简单,yum -y install libmemcached* 就可以安装了,因此不做说明。

    2.2. 安装mysql,也不做说明。

    2.3. 安装Memcached_functions_mysql,基本步骤如下:下载地址:https://launchpad.net/memcached-udfs

   # 下载解包以后,进入到目录下面,开始执行下面的安装命令
[root@salt memcached_functions_mysql-1.1]# ./configure --with-mysql=/usr/bin/mysql_config --prefix=/usr/local/memcached_functions_mysql
[root@salt memcached_functions_mysql-1.1]# make && make install

安装完以后,切换到源码目录下,把memcached_function_mysql 装到mysql内部里面去,有2中方法:

  • 第一种方法是在MySQL的SQL命令行中执行memcached_functions_mysql源码目录下的sql/install_functions.sql
  • 第二种方法是运行memcached_functions_mysql源码目录下的utils/install.pl这个Pcrl脚本,把memcache function作为UDFs加入MySQL。

下面我采取的是第二种方法:

   [root@salt memcached_functions_mysql]# cd /tmp/memcached_functions_mysql-1.1
[root@salt utils]# cp /usr/local/memcached_functions_mysql/lib/libmemcached_functions_mysql.so /usr/lib64/mysql/plugin/
[root@salt memcached_functions_mysql-1.1]# cd utils/
[root@salt utils]# ls
install.pl
[root@salt utils]# ./install.pl

如果你的数据库设置了密码,那么就在install.pl脚本的78行附近,把密码传个那个opt_password的变量:

 73 $opt_schema ||= 'test';
74 $opt_user ||= 'root';
75 $opt_host ||= 'localhost';
76 $opt_password ||= '123456'; # 78行,添加这个变量,告诉连接数据库的密码
77 my $existing_functions;
78
79 my $dbh= DBI->connect("DBI:mysql:$opt_schema", $opt_user, $opt_password)
80 or croak "Unable to connect! $DBI::errstr\n";

一路回车敲击Y后,终于把Memcached_function_mysql装进到了mysql中,我们在数据库检查下,共32行:

select name,dl from mysql.func;
+------------------------------+---------------------------------+
| name | dl |
+------------------------------+---------------------------------+
| memc_cas_by_key | libmemcached_functions_mysql.so |
| memc_cas | libmemcached_functions_mysql.so |
| memc_servers_set | libmemcached_functions_mysql.so |
| memc_add | libmemcached_functions_mysql.so |
| memc_libmemcached_version | libmemcached_functions_mysql.so |
| memc_add_by_key | libmemcached_functions_mysql.so |
| memc_server_count | libmemcached_functions_mysql.so |
| memc_stat_get_keys | libmemcached_functions_mysql.so |
| memc_append | libmemcached_functions_mysql.so |
| memc_replace_by_key | libmemcached_functions_mysql.so |
| memc_prepend | libmemcached_functions_mysql.so |
| memc_behavior_get | libmemcached_functions_mysql.so |
| memc_udf_version | libmemcached_functions_mysql.so |
| memc_set_by_key | libmemcached_functions_mysql.so |
| memc_get_by_key | libmemcached_functions_mysql.so |
| memc_increment | libmemcached_functions_mysql.so |
| memc_behavior_set | libmemcached_functions_mysql.so |
| memc_stats | libmemcached_functions_mysql.so |
| memc_list_distribution_types | libmemcached_functions_mysql.so |
| memc_list_hash_types | libmemcached_functions_mysql.so |
| memc_append_by_key | libmemcached_functions_mysql.so |
| memc_servers_behavior_set | libmemcached_functions_mysql.so |
| memc_replace | libmemcached_functions_mysql.so |
| memc_set | libmemcached_functions_mysql.so |
| memc_prepend_by_key | libmemcached_functions_mysql.so |
| memc_get | libmemcached_functions_mysql.so |
| memc_list_behaviors | libmemcached_functions_mysql.so |
| memc_delete | libmemcached_functions_mysql.so |
| memc_stat_get_value | libmemcached_functions_mysql.so |
| memc_decrement | libmemcached_functions_mysql.so |
| memc_delete_by_key | libmemcached_functions_mysql.so |
| memc_servers_behavior_get | libmemcached_functions_mysql.so |
+------------------------------+---------------------------------+
32 rows in set (0.30 sec)

二 memcached_function_mysql的应用实例:

1 创建2张表

新建2张表,urls和results,更新urls表中的内容,使系统自动更新Memcached的内容,results用来记录更新Memcached失败的记录。

SQL语句:

mysql> create database test character set 'utf8';
mysql> create table urls(id int(10) not null,url varchar(255) not null default '',primary key(`id`));
mysql> create table results(id int(10) not null,result varchar(255) not null default 'error',time timestamp null default current_timestamp , primary key (`id`));
2 创建3个触发器

2.1. 当向urls表中插入数据时,对Memcached执行set操作,trigger大代码如下:

mysql> delimiter //     # 切换结束符
mysql> drop trigger if exists url_mem_insert;
-> create trigger url_mem_insert before insert on urls
-> for each row begin set @mm = memc_set(NEW.id,NEW.url);
-> if @mm <>0 then
-> insert into results(id) values(NEW.id);
-> end if;
-> END//
Query OK, 0 rows affected, 1 warning (0.00 sec) Query OK, 0 rows affected (0.03 sec) mysql> DELIMITER ;

2.2. 当对urls表中的数据进行更新时,对Memcached执行replace操作。sql语句如下

mysql> delimiter //
mysql> drop trigger if exists url_mem_update;
-> create trigger url_mem_update before update on urls for each row begin
-> set @mm = memc_replace(OLD.id , NEW.url);
-> if @mm <> 0 then
-> insert into results(id) values(OLD.id);
-> end if;
-> end //
Query OK, 0 rows affected, 1 warning (0.00 sec) Query OK, 0 rows affected (0.36 sec) mysql> delimiter ;

2.3. 当对urls表中的数据进行删除操作时,对Memcached执行delete操作,sql代码如下:

mysql> delimiter //
mysql> drop trigger if exists url_mem_delete;
-> create trigger url_mem_delete before delete on urls for each row begin
-> set @mm = memc_delete(OLD.ID);
-> if @mm <> 0 then
-> insert into results(id) values(OLD.id);
-> end if;
-> end //
Query OK, 0 rows affected, 1 warning (0.00 sec) Query OK, 0 rows affected (0.29 sec) mysql> delimiter ;

2.4. 设置Memcached相关参数

2.4.1. 设置UDFs操作Memcached服务器的IP地址和端口

mysql> select memc_servers_set('127.0.0.1:11211')
-> ;
+-------------------------------------+
| memc_servers_set('127.0.0.1:11211') |
+-------------------------------------+
| 0 |
+-------------------------------------+
1 row in set (0.35 sec) mysql> select memc_server_count();
+---------------------+
| memc_server_count() |
+---------------------+
| 1 |
+---------------------+
1 row in set (0.00 sec)

2.4.2. 在Mysql命令行中列出可以修改Memcached参数的行为,执行命令和输出结果如下:

mysql> select memc_list_behaviors()\G;
*************************** 1. row ***************************
memc_list_behaviors():
MEMCACHED SERVER BEHAVIORS
MEMCACHED_BEHAVIOR_SUPPORT_CAS
MEMCACHED_BEHAVIOR_NO_BLOCK
MEMCACHED_BEHAVIOR_TCP_NODELAY
MEMCACHED_BEHAVIOR_HASH
MEMCACHED_BEHAVIOR_CACHE_LOOKUPS
MEMCACHED_BEHAVIOR_SOCKET_SEND_SIZE
MEMCACHED_BEHAVIOR_SOCKET_RECV_SIZE
MEMCACHED_BEHAVIOR_BUFFER_REQUESTS
MEMCACHED_BEHAVIOR_KETAMA
MEMCACHED_BEHAVIOR_POLL_TIMEOUT
MEMCACHED_BEHAVIOR_RETRY_TIMEOUT
MEMCACHED_BEHAVIOR_DISTRIBUTION
MEMCACHED_BEHAVIOR_BUFFER_REQUESTS
MEMCACHED_BEHAVIOR_USER_DATA
MEMCACHED_BEHAVIOR_SORT_HOSTS
MEMCACHED_BEHAVIOR_VERIFY_KEY
MEMCACHED_BEHAVIOR_CONNECT_TIMEOUT
MEMCACHED_BEHAVIOR_KETAMA_WEIGHTED
MEMCACHED_BEHAVIOR_KETAMA_HASH
MEMCACHED_BEHAVIOR_BINARY_PROTOCOL
MEMCACHED_BEHAVIOR_SND_TIMEOUT
MEMCACHED_BEHAVIOR_RCV_TIMEOUT
MEMCACHED_BEHAVIOR_SERVER_FAILURE_LIMIT
MEMCACHED_BEHAVIOR_IO_MSG_WATERMARK
MEMCACHED_BEHAVIOR_IO_BYTES_WATERMARK MEMCACHED_HASH_DEFAULT
MEMCACHED_HASH_MD5
MEMCA
1 row in set (0.00 sec) ERROR:
No query specified

设置MEMCACHED_BEHAVIOR_NO_BLOCK 为打开状态,这样Memcached出现问题的时候,也就是连接不上的时候,数据可以继续插入Mysql中,但有报错提示;如不设置此值,那么Memcached失败时,数据需要到memcached失败超时后才可以插入到表中。

通过下面的设置,可以避免这样的情况发生:

mysql> select  memc_servers_behavior_set('MEMCACHED_BEHAVIOR_NO_BLOCK','1');
+--------------------------------------------------------------+
| memc_servers_behavior_set('MEMCACHED_BEHAVIOR_NO_BLOCK','1') |
+--------------------------------------------------------------+
| 0 |
+--------------------------------------------------------------+
1 row in set (0.00 sec) mysql> select memc_servers_behavior_set('MEMCACHED_BEHAVIOR_TCP_NODELAY','1');
+-----------------------------------------------------------------+
| memc_servers_behavior_set('MEMCACHED_BEHAVIOR_TCP_NODELAY','1') |
+-----------------------------------------------------------------+
| 0 |
+-----------------------------------------------------------------+
1 row in set (0.00 sec)

2.4.3. 测试Mysql与Memcached的数据同步性

2.4.3.1. 数据增加

  • 我们先在mysql上插入一条数据:
mysql> insert into urls values(2,'http://www.baidu.com');
Query OK, 1 row affected (0.04 sec)
mysql> select memc_get('2');
+-------------------+
| memc_get('2') |
+-------------------+
| http://www.jd.com |
+-------------------+
1 row in set (0.02 sec)

然后在另一个终端上telnet memcached执行命令,命令如下:

[root@salt ~]# telnet 127.0.0.1 11211
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
get 2 #2就是id号,我们刚才插入数据的ID号为2,所以这里也是为2
VALUE 2 0 20
http://www.baidu.com
END

2.4.3.2 删除数据

mysql:

mysql> delete from test.urls where id=2;

memcached:

get 2
END

2.4.3.3 修改数据同理可得,在mysql一端修改后,自动同步到memcached上去。

Mysql和Memcached的连动的更多相关文章

  1. CentOS7下安装Mysql和Memcached 以及 使用C#操作Mysql和Memcached

    我本身是学.net的,但是现在很多主流SQL和NOSQL都是部置在linux下,本着好学的精神,前段时间装了个虚拟机,在其装上CentOS64位的服务器系统,对于英文0基础,linux0基础的我来说, ...

  2. Mysql 官方Memcached 插件初步试用感受 - schweigen - ITeye技术网站

    Mysql 官方Memcached 插件初步试用感受 - schweigen - ITeye技术网站 Mysql 官方Memcached 插件初步试用感受

  3. mysql+redis+memcached

    mysql+redis+memcached 数据库 数据库设计 a. 单表 b. FK(单表:一张表存储时,如果有重复出现的字段为了防止硬盘的浪费,所以做一个FK:去掉FK变成单表(这样子访问速度快了 ...

  4. 门户网站架构Nginx+Apache+MySQL+PHP+Memcached+Squid

    服务器的大用户量的承载方案 一.前言二.编译安装三. 安装MySQL.memcache四. 安装Apache.PHP.eAccelerator.php-memcache五. 安装Squid六.后记 一 ...

  5. CentOS6.6 32位 Minimal版本纯编译安装Nginx Mysql PHP Memcached

    声明:部分编译指令在博客编辑器里好像被处理了,如双横线变成单横线了等等,于是在本地生成了一个pdf版本,在下面地址可以下载. LNMP+Memcached CentOS是红帽发行的免费的稳定Linux ...

  6. 在Ubuntu上安装Redis MySQL MongoDB memcached Nginx

    1.安装Redis sudo apt-get install redis-server 2.安装MySQL sudo apt-get install mysql-server 3.安装MongoDB ...

  7. Linux(centOS)手动安装删除Apache+MySQL+PHP+Memcached原创无错版

    =================== 第一步:Apache安装 =================== 下载 去 http://www.apache.org 自己找最新的 国内有很多镜像点例如人人和 ...

  8. 让memcached和mysql更好的工作

    这次是Fotolog的经验,传说中比Flickr更大的网站,Fotolog在21台服务器上部署了51个memcached实例,总计有254G缓存空间可用,缓存了多达175G的内容,这个数量比很多网站的 ...

  9. Memcached与MySQL数据同步

    1.介绍 在生产环境中,我们经常使用MySQL作为应用的数据库.但是随着用户的增多数据量的增大,我们将会自然而然的选择Memcached作为缓存数据库,从而减小MySQL的压力.但是memcached ...

随机推荐

  1. C#根据当前时间获取周,月,季度,年度等时间段的起止时间

    最近有个统计分布的需求,需要按统计本周,上周,本月,上月,本季度,上季度,本年度,上年度等时间统计分布趋势,所以这里就涉及到计算周,月,季度,年度等的起止时间了,下面总结一下C#中关于根据当前时间获取 ...

  2. Who Says What to Whom on Twitter-www2011-20160512

    分析性论文 what: who? 本文将Twitter中的用户分为了两大类--普通用户和精英用户,精英用户又被分为四类,分别为媒体(media).名人(celebrities).博主(bloggers ...

  3. android之广播(一)

    Android中的广播 系统在运行过程中会产生很多事件,某些事件产生的时候,比如:电量的改变,收发短信.拨打电话.屏幕解锁.开机等等,系统会发送广播.只要应用程序接受到这条广播就知道系统发生了相应的事 ...

  4. Allegro 中手动制作螺丝孔封装

    以直径2.5mm的螺丝孔为例: 添加过孔,通常过孔的尺寸稍大于实际的螺丝直径,这里设置为2.8mm的直径. 添加过孔焊盘的其他属性. 制作边上的小焊盘. 新建Package Symbol然后点击Lay ...

  5. 当在XP系统上无法安装Mysql ODBC时,怎么办?

    system32下面缺失如下连接中的dll http://www.33lc.com/soft/19950.html 这个dll名为: msvcr100.dll 本来安装过程中会出现Error 1918 ...

  6. iOS -- 神战

    http://github.ibireme.com/github/list/ios/# https://github.com/Tim9Liu9/TimLiu-iOS http://www.ios122 ...

  7. HIbernate的脏数据检测和延缓加载

    脏数据监测: 在一个事务中,加载的数据,除了返回给用户之外,会复制一份在session中,在事务提交时,会用session中的备份和用户的数据进行比对,如果用户的数据状态改变, 则用户的数据即为:脏数 ...

  8. 【BZOJ 1503】【NOI 2004】郁闷的出纳员

    $Splay$模板题. 复习一下伸展树的模板. 一定不要忘了push啊!!! 对于减工资后删掉员工的操作,我选择插入一个$min+delta_{减少的工资}$的节点,把它$Splay$到根,砍掉它自己 ...

  9. win7如何让局域网其他电脑通过IP直接访问自己电脑的网站

    一.打开控制面板 二.打开防火墙 三.点击右侧高级设置 四.点击防火墙属性 五.点击防火墙状态选择为关闭,确定 六.点击右侧允许或功能通过windows防火墙 七.执行第六部会打开防火墙通信例外窗口, ...

  10. hdu 4612 强连通

    题意:有一些联通的地方,如果2点间只有一条路径,这样的边叫做桥,现在让你添加一个桥,使最后的桥最少,问最少的桥使多少? 先求一次强连通分量,然后图就分成了几个块,将这几个块看做点,求出总共有多少条重建 ...