考虑以下几个方面memcached当修改现有的MySQL模式或应用程序以使用daemon_memcached
插件:
memcached键不能包含空格或换行符,因为这些字符在ASCII协议中用作分隔符。如果正在使用包含空格的查找值,在将它们用作调用中的键之前,请将它们转换或哈希为不包含空格的值
add ()
,设置()
,get ()
,等等。虽然理论上这些字符在使用二进制协议的程序中的键中是允许的,但是您应该限制键中使用的字符,以确保与广泛的客户机兼容。如果有一个短的数字主键的列
InnoDB
表,将其用作的惟一查找键memcached通过将整数转换为字符串值。如果memcached服务器用于多个应用程序,或与多个应用程序InnoDB
表中,请考虑修改名称,以确保它是惟一的。例如,在数值之前加上表名,或者数据库名和表名。请注意的
daemon_memcached
插件支持对映射的插入和读取InnoDB
具有整数
定义为主键。不能将分区表用于查询或存储的数据memcached.
的memcached协议将数值作为字符串传递。将数值存储在底层
InnoDB
表,以实现可以在SQL函数中使用的计数器,如SUM ()
或AVG ()
,例如:使用
VARCHAR
具有足够的字符以容纳最大期望数的所有数字的列(如果适用于负号、小数点或两者,还需要额外的字符)。在任何使用列值执行算术的查询中,使用
把()
函数将值从字符串转换为整数或其他数值类型。例如:#字母条目返回为零。SELECT CAST(c2 as unsigned integer) FROM demo_test;#因为可能有0的数值,不能取消它们的资格。#测试字符串值,找出整数,并只对它们求平均值。SELECT AVG(cast(c2 as unsigned integer)) FROM demo_test WHERE c2 BETWEEN '0' and '9999999999';#视图让你隐藏查询的复杂性。结果已经被转换;#不需要每次重复转换函数和WHERE子句。CREATE VIEW numbers AS SELECT c1 KEY, CAST(c2 AS UNSIGNED INTEGER) val FROM demo_test WHERE c2 BETWEEN '0' and '9999999999';SELECT SUM(val) FROM numbers;
请注意调用将结果集中的任何字母值转换为0
把()
.当使用函数时,如AVG ()
,它取决于结果集中的行数,包括在哪里
子句过滤掉非数字值。
如果
InnoDB
用作键的列的值可以大于250字节,将值哈希到小于250字节。方法使用现有表
daemon_memcached
插件中为其定义一个条目innodb_memcache.containers
表格将该表设为所有表的默认值memcached请求时,指定值默认的
在的名字
列,然后重新启动MySQL服务器使更改生效。的不同类使用多个表memcached数据,设置多个条目innodb_memcache.containers
表的名字
您所选择的值,然后发出一个memcached的形式的请求得到@@
或的名字
设置@@
在应用程序中指定要用于后续操作的表memcached请求。的名字
下面是使用预定义表以外的表的示例
test.demo_test
表,请参阅例15.13“使用InnoDB memcached应用程序使用自己的表”.有关所需的表布局,请参见“InnoDB memcached插件内部程序”第15.20.8节.要使用多个
InnoDB
表列值memcached的键值对中指定用逗号、分号、空格或管道字元分隔的列名value_columns
的字段innodb_memcache.containers
的入口InnoDB
表格例如,指定col1, col2 col3
或col1 | col2 | col3
在value_columns
字段。在将字符串传递到之前,使用管道字符作为分隔符将列值连接到单个字符串memcached
添加
或集
调用。字符串会自动解压缩到正确的列中。每一个得到
调用返回一个字符串,该字符串包含同样由管道字符分隔的列值。可以使用适当的应用程序语言语法解包这些值。
例15.13使用InnoDB memcached应用程序使用自己的表
这个例子展示了如何使用您自己的表和示例Python应用程序memcached
用于数据操作。
该示例假设daemon_memcached
插件的安装如第15.20.3节“设置InnoDB memcached Plugin”.它还假设您的系统被配置为运行使用python-memcache
模块。
创建
multicol
表,其中存储国家信息,包括人口、面积和司机侧数据(“R”
对于权利和“L”
左)。mysql>使用测试;mysql> CREATE TABLE ' multicol ' (' country ' varchar(128) NOT NULL DEFAULT ", ' population ' varchar(10) DEFAULT NULL, ' area_sq_km ' varchar(9) DEFAULT NULL, ' drive_side ' varchar(1) DEFAULT NULL, ' c3 ' int(11) DEFAULT NULL, ' c4 ' bigint(20) unsigned DEFAULT NULL, ' c5 ' int(11) DEFAULT NULL, PRIMARY KEY (' country ')) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
中插入一条记录
innodb_memcache.containers
表,以便daemon_memcached
插件可以访问multicol
表格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 ('bbb','test','multicol','country','population,area_sq_km,drive_side', 'c3','c4','c5','PRIMARY');mysql >提交;
的
innodb_memcache.containers
记录multicol
表指定了的名字
的价值“bbb”
,它是表标识符。请注意如果一个人
InnoDB
表用于所有memcached应用程序,的名字
值可设置为默认的
避免使用@@
转换表的符号。的
db_schema
列设置为测验
的数据库名称multicol
表驻留。的
db_table
列设置为multicol
的名称InnoDB
表格key_columns
设置为唯一国家
列。的国家
控件中的主键定义为multicol
表定义。而不是单一的
InnoDB
表列保存复合数据值,数据被划分到三个表列中(人口
,area_sq_km
,drive_side
).中指定以逗号分隔的列列表以容纳多个值列value_columns
字段。中定义的列value_columns
字段是存储或检索值时使用的列。的值
旗帜
,expire_time
,cas_column
类中使用的值为基础demo.test
示例表。类的应用程序中,这些字段通常不重要daemon_memcached
因为MySQL保持数据同步,不需要担心数据过期或过时。的
unique_idx_name_on_key
字段设置为主要的
,它引用在惟一值上定义的主索引国家
列中的multicol
表格
将示例Python应用程序复制到一个文件中。在本例中,示例脚本被复制到一个名为
multicol.py
.示例Python应用程序将数据插入
multicol
表并检索所有键的数据,演示如何访问InnoDB
表通过daemon_memcached
插件。import sys, os import memcache def connect_to_memcached(): memc = memcache. client (['127.0.0.1:11211'], debug=0);返回memc def banner(message):打印打印" = " * len(消息)打印消息打印" = " * len(消息)country_data =[(“加拿大”、“34820000”、“9984670”、“R”),(“美国”、“314242000”、“9826675”、“R”),(“爱尔兰”、“6399152”、“84421”、“L”),(“英国”、“62262000”、“243610”、“L”),(“墨西哥”、“113910608”、“1972550”、“R”),(“丹麦”、“5543453”、“43094”、“R”),(“挪威”、“5002942”、“385252”、“R”),(“阿联酋”,“8264070”,“83600”,“R”),(“印度”、“1210193422”、“3287263”、“L”),(“中国”、“1347350000”、“9640821”、“R”),]def switch_table (memc、表):关键 = "@@" + 表打印”切换默认表”表“+ +”通过发行得到“+键+”。”结果= memc.get(关键)def insert_country_data (memc):横幅(“通过memcached接口插入初始数据”)的项目country_data:国家=人口项目[0]=[1]项面积=项目[2]drive_side =项目[3]键=国家值= " | " . join([人口、面积、drive_side])打印”键= " +键打印“价值= " +值如果memc.add(键,值):打印“添加新键值对。”:memc.set(key,value) def query_country_data(memc): banner("检索所有键(国家名)的数据")为项目在country_data: key =项目[0]结果= memc.get(key)打印"这里是从数据库检索的结果为键" +键+ ":"打印结果(m_population, m_area, m_drive_side) = result.split("|")打印"未包装的人口值:" + m_population打印"未包装的区域值:" + m_area打印"未包装的驱动器侧值:+ m_drive_side if __name__ == '__main__': memc = connect_to_memcached() switch_table(memc,"bbb") insert_country_data(memc) query_country_data(memc) sys.exit(0)
示例Python应用程序说明:
运行应用程序不需要数据库授权,因为数据操作是通过memcached接口。所需的惟一信息是本地系统上的端口号memcached守护进程听。
来确保应用程序使用
multicol
表,switch_table ()
函数被调用,该函数执行一个虚拟得到
或集
请求使用@@
符号。的的名字
请求中的值为bbb
,即multicol
中定义的表标识符innodb_memcache.containers.name
字段。更有描述性的
的名字
值可能在实际应用程序中使用。中指定的是表标识符,而不是表名得到@@……
请求。用于插入和查询数据的实用函数演示了如何将Python数据结构转换为管道分隔的值,以便将数据发送到MySQL
添加
或集
方法返回的管道分隔的值,以及如何解包得到
请求。此额外处理仅在映射单个memcached值到多个MySQL表列。
运行示例Python应用程序。
Shell > python multi - col.py
如果成功,示例应用程序返回以下输出:
连接到memcached。通过为'@@bbb'发出GET,将默认表切换到'bbb'。============================================== 通过memcached插入初始数据接口 ============================================== R键=加拿大值= 34820000 | 34820000 |添加新键,值对。Key = USA Value = 314242000|9826675|R新增Key、Value对。Key = Ireland Value = 6399152|84421|L新增Key、Value对。Key = UK Value = 62262000|243610|L新增Key、Value对。Key = Mexico Value = 113910608|1972550|R新增Key、Value对。Key = Denmark Value = 5543453|43094|R添加新的Key,值对。Key = Norway Value = 5002942|385252|R增加新的Key、值对。Key = UAE Value = 8264070|83600|R新增Key、Value对。 Key = India Value = 1210193422|3287263|L Added new key, value pair. Key = China Value = 1347350000|9640821|R Added new key, value pair. ============================================ Retrieving data for all keys (country names) ============================================ Here is the result retrieved from the database for key Canada: 34820000|9984670|R Unpacked population value: 34820000 Unpacked area value : 9984670 Unpacked drive side value: R Here is the result retrieved from the database for key USA: 314242000|9826675|R Unpacked population value: 314242000 Unpacked area value : 9826675 Unpacked drive side value: R Here is the result retrieved from the database for key Ireland: 6399152|84421|L Unpacked population value: 6399152 Unpacked area value : 84421 Unpacked drive side value: L Here is the result retrieved from the database for key UK: 62262000|243610|L Unpacked population value: 62262000 Unpacked area value : 243610 Unpacked drive side value: L Here is the result retrieved from the database for key Mexico: 113910608|1972550|R Unpacked population value: 113910608 Unpacked area value : 1972550 Unpacked drive side value: R Here is the result retrieved from the database for key Denmark: 5543453|43094|R Unpacked population value: 5543453 Unpacked area value : 43094 Unpacked drive side value: R Here is the result retrieved from the database for key Norway: 5002942|385252|R Unpacked population value: 5002942 Unpacked area value : 385252 Unpacked drive side value: R Here is the result retrieved from the database for key UAE: 8264070|83600|R Unpacked population value: 8264070 Unpacked area value : 83600 Unpacked drive side value: R Here is the result retrieved from the database for key India: 1210193422|3287263|L Unpacked population value: 1210193422 Unpacked area value : 3287263 Unpacked drive side value: L Here is the result retrieved from the database for key China: 1347350000|9640821|R Unpacked population value: 1347350000 Unpacked area value : 9640821 Unpacked drive side value: R
查询
innodb_memcache.containers
表来查看您先前为multicol
表格的示例条目demo_test
初始化过程中创建的daemon_memcached
插件设置。第二个记录是您为multicol
表格SELECT * FROM innodb_memcache。集装箱\G *************************** 1;行 *************************** 名称:aaa db_schema:测试db_table: demo_test key_columns: c1 value_columns: c2旗帜:c3 cas_column: c4 expire_time_column: c5 unique_idx_name_on_key:初选 *************************** 2。row *************************** name: bbb db_schema: test db_table: multicol key_columns: country value_columns: population,area_sq_km,drive_side flags: c3 cas_column: c4 expire_time_column: c5 unique_idx_name_on_key: PRIMARY
查询
multicol
表查看示例Python应用程序插入的数据。该数据可用于MySQL查询,它演示了如何使用SQL或通过应用程序(使用适当的MySQL连接器或API).SELECT * FROM test.multicol;+---------+------------+------------+------------+------+------+------+ | 国家人口| | area_sq_km | drive_side | c3 | c4 | c5 | +---------+------------+------------+------------+------+------+------+ | 加拿大| 34820000 | 34820000 | 11 R | 0 | | 0 | |中国| 1347350000 | 1347350000 | 20 R | 0 | | 0 | |丹麦| 43094 | 5543453 | 16 R | 0 | | 0 | |印度| 1210193422 | 1210193422 | 19 L | 0 | | 0 | |爱尔兰| 84421 | 6399152 | 13 L | 0 | | 0 | |墨西哥| 113910608 | 113910608 | 15 R | 0 | | 0||Norway | 5002942 | 385252 | R | 0 | 17 | 0 | | UAE | 8264070 | 83600 | R | 0 | 18 | 0 | | UK | 62262000 | 243610 | L | 0 | 14 | 0 | | USA | 314242000 | 9826675 | R | 0 | 12 | 0 | +---------+------------+------------+------------+------+------+------+
请注意在定义被视为数字的列的长度时,始终允许有足够的大小来容纳必要的数字、小数点、符号字符、前导零等。字符串列中的值太长,例如
VARCHAR
通过删除一些字符来截断,这可能会产生无意义的数值。控件上运行报告类型查询(可选)
InnoDB
表,该表存储memcached数据。您可以通过SQL查询生成报告,跨任何列执行计算和测试,而不仅仅是列
国家
键列。(因为下面的例子只使用了几个国家的数据,所以这些数字仅用于说明。)下面的查询返回人们靠右开车的国家的平均人口,以及名称以字母开头的国家的平均面积”U”:SELECT AVG(population) FROM multicol WHERE drive_side = 'R';+-------------------+ | avg(人口 ) | +-------------------+ | 261304724.7142857 | +-------------------+ mysql >选择总和(area_sq_km)从multicol国家像“U %”;+-----------------+ | sum (area_sq_km ) | +-----------------+ | 10153885 | +-----------------+
因为
人口
而且area_sq_km
列存储字符数据,而不是强类型的数值数据,例如函数AVG ()
而且SUM ()
首先将每个值转换为数字。这种方法不工作对于诸如<
或>
,例如,在比较基于字符的值时,9 > 1000
,这是不应该出现在诸如按人口排序
.要获得最精确的类型处理,请对将数值列转换为适当类型的视图执行查询。这种技术可以让您的问题变得简单SELECT *
来自数据库应用程序的查询,同时确保类型转换、筛选和排序正确。下面的示例显示了一个视图,可以查询该视图以查找按人口降序排列的前三个国家,其结果反映了最新的数据multicol
表格,以人口和地区数字作为数字处理:mysql> CREATE VIEW populous_nations AS SELECT country, cast(population AS unsigned integer) population, cast(area_sq_km AS unsigned integer) area_sq_km, drive_side FROM multicol ORDER BY cast(population AS unsigned integer) DESC LIMIT 3;SELECT * FROM populous_countries;+---------+------------+------------+------------+ | 国家人口| | area_sq_km | drive_side | +---------+------------+------------+------------+ | 印度R中国| 1347350000 | 1347350000 | | | | 1210193422 | 1210193422 | L | |美国| 314242000 | 314242000 | R | +---------+------------+------------+------------+ mysql > DESC populous_countries;+------------+---------------------+------+-----+---------+-------+ | 字段默认零关键| | | | |类型多 | +------------+---------------------+------+-----+---------+-------+ | 国家| varchar(128) |不 | | | | | 人口|长整型数字(10)无符号|是| |零| | | area_sq_km | int(9)无符号|是| |零| | | drive_side | varchar(1) |是| | NULL | | +------------+---------------------+------+-----+---------+-------+