XQuery/使用Memcached模块
您希望设置一个分布式缓存系统,以便多个系统可以共享有关它们各自缓存中内容的信息。此模块实现了memcached协议。
注意:我在eXist 2.1下使用memcached模块时遇到了一些问题。如果您能使其正常工作,请告诉我。
要启用该模块,您必须执行以下步骤
步骤 1 将 $EXIST_HOME/extensions/local.build.properties 中的 include.module.memcached 属性从 false 更改为 true
include.module.memcached = true
步骤 2 取消 $EXIST_HOME/conf.xml 中的注释
<module uri="http://exist-db.org/xquery/memcached" class="org.exist.xquery.modules.memcached.MemcachedModule" />
步骤 3
- 运行“build”重新编译
步骤 4
- 重启eXist服务器
步骤 5
- 启动您的memcached服务器(它不是eXist系统的一部分)
如果您运行函数 util:get-module-info('http://exist-db.org/xquery/memcached'),它现在应该返回模块描述。
有两个函数可以创建和删除客户端:mcache:create-client($properties, $is-binary-indicator) 和 mcache:shutdown($client)
函数 mcache:create-client 返回一个 xs:long,表示客户端句柄。所有将来的引用都将使用此句柄。
以下示例代码由模块作者 Evgeny Gazdovsky 提供
在您需要为一个或多个memcached服务器创建memcached客户端之前。
import module namespace cache="http://exist-db.org/xquery/cache";
import module namespace mcache="http://exist-db.org/xquery/memcached";
let $properties := <properties><property name="host" value="localhost"/></properties>
let $client := mcache:create-client($properties, false())
return cache:put("memcached", "client", $client)
如果您希望使用一个客户端连接多个服务器,则必须添加属性,例如
let $properties :=
(
<properties><property name="host" value="server1"/></properties>,
<properties><property name="host" value="server2"/></properties>,
<properties><property name="host" value="server3"/></properties>
)
如果您的memcached服务器侦听的端口不是标准端口:11211,则必须为该服务器添加“port”属性
let $properties :=
<properties>
<property name="host" value="localhost"/>
<property name="port" value="your port value here"/>
</properties>
为了在不同的查询中使用相同的连接,我们使用缓存模块来存储客户端句柄。如果您希望在memcached中设置(添加、替换、删除)内容,可以使用类似以下的脚本
import module namespace cache="http://exist-db.org/xquery/cache";
import module namespace mcache="http://exist-db.org/xquery/memcached";
let $client := cache:get("memcached", "client")
return
if ($client)
then mcache:set($client, "key", "foo", 3600)
else ()
此脚本将为键“key”存储字符串值“foo”,持续时间为 3600 秒。除了 xs:base64Binary 之外的所有值都将存储为字符串。xs:base64Binary 将存储为字节数组。要存储 XML 片段,您必须先对其进行序列化(请参阅 util:serialeze() 函数)。要从 memcached 中获取数据,请使用类似以下的脚本
import module namespace cache="http://exist-db.org/xquery/cache";
import module namespace mcache="http://exist-db.org/xquery/memcached";
let $client := cache:get("memcached", "client")
return
if ($client)
then mcache:get($client, "key")
else ()
经过一段时间(本例中为 3600 秒)后,该值将过期,之后,将返回空序列以表示键“key”。
当您进行连接时,您应该能够在控制台中看到以下 INFO 消息
2012-03-10 11:16:15.741 INFO net.spy.memcached.MemcachedConnection: Added {QA sa=localhost/127.0.0.1:11211, #Rops=0, #Wops=0, #iq=0, topRop=null, topWop=null, toWrite=0, interested=0} to connect queue
Rops 是读取操作,Wops 是写入操作数量。
2012-03-10 11:16:15.819 INFO net.spy.memcached.MemcachedConnection: Connection state changed for sun.nio.ch.SelectionKeyImpl@66a236
关闭时,日志文件中将包含以下内容
2012-03-10 11:55:42.850 INFO net.spy.memcached.MemcachedClient: Shut down memcached client