如何通过MySQL构建 Memcached KV 数据库

(1)介绍

从 MySQL 5.6 版本开始,MySQL支持除 SQL 外的其他访问方式,比如 NoSQL,甚至可以把 MySQL 打造成一个百万级并发访问的 KV 数据库或文档数据库。

下图展示了 MySQL 版本中支持的不同表的访问方式:
在这里插入图片描述
可以看到,除了标准的 SQL 访问,MySQL 5.6 版本开始还支持通过 Memcached 通信协议访问表中的数据,这时 MySQL 可以作为一个 KV 数据库使用。此外,MySQL 5.7 版本开始还支持通过新的 MySQL X 通信协议访问表中的数据,这时 MySQL 可以作为一个文档数据库使用。

但无论哪种 NoSQL 的访问方式,其访问的数据都是以表的方式进行存储。SQL 和 NoSQL 之间通过某种映射关系进行绑定。

对比传统的 NoSQL 数据库(比如 Memcached、MongoDB),MySQL 这样的访问更具有灵活性,在通过简单的 NoSQL 接口保障性能的前提下,又可以通过 SQL 的方式丰富对于数据的查询。另外,MySQL 提供的成熟事务特性、高可用解决方案,又能弥补 NoSQL 数据库在这方面的不足。

MySQL 5.6 版本开始支持通过插件 Memcached Plugin,以 KV 方式访问表,这时可以将 MySQL视作一个 Memcached KV 数据库。

对于数据的访问不再是通过 SQL 接口,而是通过 KV 数据库中常见的 get、set、incr 等请求。
SELECT XX from Table where XX=?
在日常SQL开发中对于类似如上含义的查询很多,即使是通过主键索引进行访问,但是在SQL解析也需要花费不少时间。

基于 Memcached 的 KV 访问,可以绕过 SQL 解析,通过映射关系,直接访问存储在 InnoDB 引擎中的数据,这样数据库的整体性能会在不花费额外成本的前提下得到极大的提升。

(2)配置和使用

【1】当需要使用memcached Plugin时候需要运行daemon_memcached plugin。
daemon_memcached插件仅支持在 Linux, Solaris, macOS操作系统。
在这里插入图片描述
libmemcached.so:MySQL 的 memcached 守护程序插件。
innodb_engine.so:一个用于 memcached 的 InnoDB API 插件。

【2】libevent 需要被安装
如果您没有从源代码构建 MySQL,则 libevent 库不包含在您的安装中。 使用适合您操作系统的安装方法安装 libevent 1.4.12 或更高版本。 例如,根据操作系统,您可能会使用 apt-get、yum 或 port install。 例如,在 Ubuntu Linux 上,使用:

sudo apt-get install libevent-dev

【3】安装映射表

配置 daemon_memcached 插件,通过运行位于 MYSQL_HOME/share 中的 innodb_memcached_config.sql 配置脚本使其可以与 InnoDB 表交互。 此脚本使用三个必需的表(cache_policies、config_options 和containers)安装 innodb_memcache 数据库。此外 ,它还在test数据库中安装 了demo_test 示例表。

find  /  -name 'innodb_memcached_config.sql'

在这里插入图片描述

mysql>  source /usr/share/mysql-8.0/innodb_memcached_config.sql

脚本安装完成之后,检查对应的表是否创建
在这里插入图片描述
innodb_memcache.containers :该表是最为重要的表,容器表中的KV映射提供到 InnoDB 表列的映射。与 daemon_memcached 插件一起使用的每个 InnoDB 表都需要容器表中的Entries 。

innodb_memcached_config.sql脚本插入了一个KV映射在containers 表中,它提供了demo_test 和KV映射。它还将单行数据插入到 demo_test 表中。 此数据允许您在设置完成后立即验证安装。
在这里插入图片描述
【4】激活插件,通过运行 INSTALL PLUGIN 语句激活 daemon_memcached 插件:

mysql>    INSTALL PLUGIN daemon_memcached soname "libmemcached.so";

插件安装后,每次重启 MySQL 服务器时都会自动激活。
安装插件,默认会启动11211端口
在这里插入图片描述

(3)通过命令行工具测试

当前在Windows下使用 telnet 命令发出 memcached 命令。 默认情况下,memcached 守护程序监听端口 11211。

telnet ip 11211

【设置值】
在这里插入图片描述
set 是存储值的命令
zy 是KEY值
10是操作标志; 被 memcached 忽略,但客户端可以使用它来指示任何类型的信息; 如果未使用,则指定 0
0 是过期时间(TTL); 如果未使用,则指定 0
16 是提供的值块的长度(以字节为单位)
hello 是存储的Value值
【获取值】

get  key

在这里插入图片描述

在这里插入图片描述
对于设置过期属性描述,其中红色框内的存储的是是时间戳,如果过期的数据是不会从表中删除的,但是通过get获取的结果就是空的。

【说明】
如果您关闭 MySQL 服务器,这也会关闭集成的 memcached 服务器,进一步尝试访问 memcached 数据会失败并出现连接错误。 通常,此时 memcached 数据也会消失,您需要应用程序逻辑在 memcached 重新启动时将数据加载回内存。 但是,InnoDB memcached 插件会为您自动执行此过程。
当您重新启动 MySQL 时,get 操作再次返回您存储在之前的 memcached 会话中的键值对。 当请求一个键并且关联的值不在内存缓存中时,会自动从 MySQL 对应的表中获取数据,比如test.demo_test 表中查询该值。

(4)通过JAVA代码代码测试

下面通过JAVA代码的方式操作MySQL中的KV映射数据,可参考如下引入依赖,
Spymemcached Memcached客户端是一个采用Java开发的异步、单线程的Memcached客户端。

        <dependency>
            <groupId>net.spy</groupId>
            <artifactId>spymemcached</artifactId>
            <version>2.12.3</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.27</version>
        </dependency>
        //memcached服务器
        MemcachedClient c=new MemcachedClient(
                new InetSocketAddress("ip", 11211));
        // 设置一个K V映射数据,过期时间为10秒
        c.set("mykey", 10, "hello World");
        // 检索和返回对应的值
        Object myObject=c.get("mykey");
        System.out.println(myObject);

操作代码API很简单,就是一个设置值和获取值得操作

在这里插入图片描述

(5)自定义KV映射表

以上的操作使用的是组件为我们自动创建的测试表作为 KV 访问,如果想将其他表通过 KV 的方式访问,可以继续在表 Containers 中进行配置

【创建自定义表】

创建一个 InnoDB 表。 该表必须有一个具有唯一索引的键列。该表还必须包括flags、cas 和expiry 列。 可能有一个或多个值列。
下面测试表user_info,三个自定义的列,user_id为唯一主键,name和phone为个人描述信息

CREATE TABLE user_info (
       user_id VARCHAR(32),
       name VARCHAR(1024),
       phone VARCHAR(1024),
       flags INT,
       cas BIGINT UNSIGNED, 
       expiry INT,
       primary key(user_id)
  ) ENGINE=InnoDB;

接下增加KV映射到 innodb_memcache.containers表中,使得daemon_memcached 插件可以访问InnoDB数据表。这个映射关系必须满足innodb_memcache.containers表定义规则。
【创建映射】
在这里插入图片描述

	INSERT INTO `innodb_memcache`.`containers` (
       `name`, `db_schema`, `db_table`, `key_columns`, `value_columns`,
       `flags`, `cas_column`, `expire_time_column`, `unique_idx_name_on_key`)
       VALUES ('default', 'test', 'user_info', 'user_id', 'name|phone', 
       'flags','cas','expiry','PRIMARY');

【说明】
1: 一般情况下containers.name配置的为主键列,即KEY
2:Value如果有多个值,需要 使用“|” 分隔符分割
3:innodb_memcache.containers 表flags、cas_column 和 expire_time_column 字段在使用 daemon_memcached 插件的应用程序中通常不重要。 但是,每个都需要一个指定的 InnoDB 表列。 插入数据时,如果这些列未使用,请为这些列指定 0。

【重启daemon_memcached插件】
更新 innodb_memcache.containers 表后,重新启动 daemon_memcache 插件以应用更改。

mysql> UNINSTALL PLUGIN daemon_memcached;
mysql> INSTALL PLUGIN daemon_memcached soname "libmemcached.so";

重启之后可以再次执行插入和查询操作,根据测试可以发现数据已经插入到user_info表中,并且name和phone分别插入到对应的列中

在这里插入图片描述

(6)小结

【1】通过 MySQL 进行访问的性能比原生 Memcached 好,数据库并发优化做得更好;
【2】存储可以持久化,支持事务,数据一致性和安全性更好;
【3】利用 MySQL 复制技术,可以弥补原生 Memcached 不支持数据复制的短板;
【4】通过daemon_memcached插件对于一些基础的KV操作不需要在单独引入一个中间件,可以直接复用MySQL所提供的功能,简化开发和维护,收敛技术栈
【5】对于一些经常需要根据主键或唯一索引查询的SQL 语句,可以通过这种方式进行优化。
【6】对比于SQL和KV的查询性能而言,通过KV的方式查询效率要好的非常多。
【7】所有的KV数据不仅存储在表中而且会持续留存,在开发中也非常方便的去将KV数据做统计和分析以及和InnoDB表数据做关联查询和分析,直接通过SQL语句处理即可。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ZWZhangYu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值