hot Rod Node.JS Client Guide


Red Hat Data Grid 8.3

配置和使用 Hot Rod JS 客户端

Red Hat Customer Content Services

摘要

hot Rod JS 客户端为 Node.js 应用程序提供对 Data Grid 集群的异步、事件驱动的访问。异步操作结果通过"Promise"实例表示,允许客户端串联多个调用并集中错误处理。

Red Hat Data Grid

Data Grid 是一个高性能分布式内存数据存储。

无架构数据结构
将不同对象存储为键值对的灵活性。
基于网格的数据存储
旨在在集群中分发和复制数据。
弹性扩展
动态调整节点数量,以便在不中断服务的情况下满足需求。
数据互操作性
从不同端点在网格中存储、检索和查询数据。

Data Grid 文档

红帽客户门户网站中提供了 Data Grid 的文档。

Data Grid 下载

访问 红帽客户门户上的 Data Grid 软件下载。

注意

您必须有一个红帽帐户才能访问和下载数据中心软件。

使开源包含更多

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。我们从这四个术语开始:master、slave、黑名单和白名单。由于此项工作十分艰巨,这些更改将在即将推出的几个发行版本中逐步实施。详情请查看 CTO Chris Wright 的信息

第 1 章 安装和配置 Hot Rod JS 客户端

在安装 Hot Rod JS 客户端前,请确定您的系统满足要求。然后,您可以配置 Hot Rod JS 客户端来连接到 Data Grid Server,将不同的介质类型用于键和值,并自定义日志记录。

1.1. 安装 Hot Rod JS 客户端

Data Grid 提供 Hot Rod JS 客户端的发布,您可以通过 NPM 软件包管理器进行安装。

先决条件

  • Node.js 版本 1214
  • Data Grid Server 8.3。

流程

  1. 在您的 NPM 配置中添加红帽软件仓库。

    您可以使用 npm config 命令,或者在项目中的 .npmrc 文件中添加以下内容:

    @redhat:registry=https://npm.registry.redhat.com
    registry=https://registry.npmjs.org/
    Copy to Clipboard Toggle word wrap
  2. 安装 Hot Rod JS 客户端,如下所示:

    npm install @redhat/infinispan
    Copy to Clipboard Toggle word wrap

1.2. 配置 Data Grid 连接

配置 Hot Rod JS 客户端以连接到数据中心服务器。

如果向配置添加多个服务器地址,则 Hot Rod JS 客户端循环,直到它找到它可以连接的节点。

但是,您只需要为客户端添加一个 Data Grid Server 地址来接收整个集群拓扑。如果 Hot Rod JS 客户端连接到作为集群成员的单个服务器实例,客户端会获取所有节点的地址信息。

由于 Hot Rod JS 客户端已识别拓扑,如果连接到一个 Data Grid Server 中断,客户端会在集群中的其他节点上重试任何不完整的操作。同样,如果在一个 Data Grid 服务器上注册的客户端监听程序失败或离开集群,客户端会以透明的方式将监听程序注册迁移到集群中的另一节点,以便继续接收事件。

先决条件

  • 安装 Hot Rod JS 客户端。
  • 至少有一个正在运行的 Data Grid 服务器实例。

流程

  • 在客户端配置中指定 Data Grid 服务器的主机名和端口。

    var infinispan = require('infinispan');
    
    var connected = infinispan.client(
      [{port: 11322, host: '127.0.0.1'}, {port: 11222, host: '127.0.0.1'}]
      {
        // Configure client connections with authentication and encryption here.
      }
    );
    
    connected.then(function (client) {
    
      var members = client.getTopologyInfo().getMembers();
    
      // Displays all members of the Data Grid cluster.
      console.log('Connected to: ' + JSON.stringify(members));
    
      return client.disconnect();
    
    }).catch(function(error) {
    
      console.log("Got error: " + error.message);
    
    });
    Copy to Clipboard Toggle word wrap

1.2.1. 在客户端配置中定义 Data Grid 集群

当您在独立数据中心中设置 Data Grid 集群时,以便执行跨站点复制,您可以在客户端配置中添加不同站点的连接详情。

先决条件

  • 安装 Hot Rod JS 客户端。
  • 配置数据中心以进行跨站点复制。

流程

  1. 在您的 配置中添加集群 定义。
  2. 为每个 Data Grid 集群 添加名称 和服务器 定义。

    var connected = infinispan.client({port: 11222, host: '127.0.0.1'},
      {
        clusters: [
          {
            name: 'LON',
            servers: [{port: 11222, host: 'LON-host'}]
          },
          {
            name: 'NYC',
            servers: [{port: 11222, host: 'NYC-host1'}, {port: 11322, host: 'NYC-host2'}]
          }
        ]
      });
    Copy to Clipboard Toggle word wrap

1.2.2. 手动切换 Data Grid 集群

将 Hot Rod JS 客户端的 Data Grid 集群更改为连接。

先决条件

  • 在 Hot Rod JS 客户端配置中定义 Data Grid 集群。

流程

  1. 调用 switchToCluster (clusterName) 方法,来强制客户端切换到客户端配置中定义的 Data Grid 集群。
  2. 调用 switchToDefaultCluster () 方法开始使用初始 Data Grid 集群。

    var connected = infinispan.client({port: 11222, host: '127.0.0.1'},
      {
        clusters: [
          {
            name: 'LON',
            servers: [{port: 11222, host: 'LON-host'}]
          },
          {
            name: 'NYC',
            servers: [{port: 11222, host: 'NYC-host1'}, {port: 11322, host: 'NYC-host2'}]
          }
        ]
      });
    
    connected.then(function (client) {
    
      var switchToB = client.getTopologyInfo().switchToCluster('NYC');
    
      switchToB.then(function(switchSucceed) {
    
        if (switchSucceed) {
          ...
        }
    
        ...
    
        var switchToDefault = client.getTopologyInfo().switchToDefaultCluster();
    
        switchToDefault.then(function(switchSucceed) {
    
          if (switchSucceed) {
            ...
          }
    
        })
    
      })
    
    });
    Copy to Clipboard Toggle word wrap

1.3. 配置身份验证

Data Grid Server 使用不同的 SASL 机制来验证 Hot Rod JS 客户端连接。

先决条件

  • 创建 Data Grid 用户。
  • 在 Data Grid 服务器配置中的 Hot Rod 连接器中添加 SASL 身份验证机制。

流程

  1. 打开 Hot Rod JS 客户端配置进行编辑。
  2. 添加设置 enabled: true 标志的身份验证方法。
  3. 为与 Hot Rod 连接器的 SASL 身份验证机制匹配的 saslMechanism 参数指定一个值。
  4. 根据需要配置特定于 SASL 身份验证机制的任何参数。

1.3.1. SASL 身份验证机制

热 Rod JS 客户端可使用以下 SASL 身份验证机制连接到 Data Grid 服务器。

PLAIN

以纯文本(未加密)发送凭据,其方式类似于 HTTP BASIC 身份验证。

重要

要保护 Data Grid 凭证,您应该只结合使用 PLAIN 身份验证与 TLS 加密。

var connected = infinispan.client(
  {port: 11222, host: '127.0.0.1'},
  {
    authentication: {
      enabled: true,
      saslMechanism: 'PLAIN',
      userName: 'username',
      password: 'changeme'
    }
  }
);
Copy to Clipboard Toggle word wrap
DIGEST-MD5

除了非ces 来加密凭据外,使用 MD5 哈希算法。

var connected = infinispan.client(
  {port: 11222, host: '127.0.0.1'},
  {
    authentication: {
      enabled: true,
      saslMechanism: 'DIGEST-MD5',
      userName: 'username',
      password: 'changeme',
      serverName: 'infinispan'
    }
  }
);
Copy to Clipboard Toggle word wrap
SCRAM

除了哈希算法和非值加密凭证外,还使用 salt 值。热 Rod 端点支持 SCRAM-SHA-1SCRAM-SHA-256SCRAM-SHA-384SCRAM-SHA-512 哈希算法,以实现强度。

var connected = infinispan.client(
  {port: 11222, host: '127.0.0.1'},
  {
    authentication: {
      enabled: true,
      saslMechanism: 'SCRAM-SHA-1',
      userName: 'username',
      password: 'changeme'
    }
  }
);
Copy to Clipboard Toggle word wrap

1.4. 配置加密

数据中心服务器可以强制实施不同类型的 SSL/TLS 加密来保护 Hot Rod JS 客户端连接。

先决条件

  • 创建 Hot Rod JS 客户端可用于验证数据中心服务器身份的信任存储。
  • 如果您将 Data Grid 服务器配置为验证或验证客户端证书,请根据需要创建密钥存储。

流程

  1. 打开 Hot Rod JS 客户端配置进行编辑。
  2. 添加设置 enabled: true 标记的 ssl 方法。
  3. 提供特定于您使用的加密类型的任何其他配置。

1.4.1. 加密类型

热 Rod JS 客户端可以使用不同类型的加密来与 Data Grid Server 协商安全连接。

Data Grid Server 身份

对于基本加密,您可以在配置中为 Data Grid Server 证书添加签名证书或 CA 捆绑包,如下所示:

注意

要验证发布到 Data Grid Server 的证书,Hot Rod JS 客户端需要完整证书链或以 Root CA 开头的部分链。

var connected = infinispan.client({port: 11222, host: '127.0.0.1'},
  {
    ssl: {
      enabled: true,
      trustCerts: ['my-root-ca.crt.pem']
    }
  }
);
Copy to Clipboard Toggle word wrap
信任存储

您可以使用 PKCS12PFX 格式添加信任存储,如下所示:

var connected = infinispan.client({port: 11222, host: '127.0.0.1'},
  {
    ssl: {
      enabled: true,
      cryptoStore: {
        path: 'my-truststore.p12',
        passphrase: 'secret'
      }
    }
  }
);
Copy to Clipboard Toggle word wrap
客户端证书身份验证

如果您在 Data Grid 服务器配置中启用客户端证书身份验证,请添加密钥存储,如下例所示:

注意

在使用客户端证书身份验证时,您必须使用 EXTERNAL 身份验证机制配置 Hot Rod JS 客户端。

var connected = infinispan.client({port: 11222, host: '127.0.0.1'},
  {
    ssl: {
      enabled: true,
      trustCerts: ['my-root-ca.crt.pem'],
      clientAuth: {
        key: 'privkey.pem',
        passphrase: 'secret',
        cert:ssl 'cert.pem'
      }
    }
  }
);
Copy to Clipboard Toggle word wrap
服务器名称验证(SNI)

如果您使用 SNI 来允许 Hot Rod JS 客户端请求 Data Grid Server 主机名,请为与 Data Grid 服务器配置中主机名匹配的 sniHostName 参数设置一个值。

注意

sniHostName 参数默认为 localhost

var connected = infinispan.client({port: 11222, host: '127.0.0.1'},
  {
    ssl: {
      enabled: true,
      trustCerts: ['my-root-ca.crt.pem']
      sniHostName: 'example.com'
    }
  }
);
Copy to Clipboard Toggle word wrap
提示

默认情况下,热 Rod JS 客户端不允许自签名证书,这可能会导致开发或测试环境中没有公共证书颁发机构(CA)密钥的问题。

查看 Data Grid 代码教程 中有关使用 Java keytool 创建签名证书的示例。

1.5. 配置数据格式

热 Rod JS 客户端可以作为原生 JavaScript 对象表示法(JSON)对象或字符串对象处理键和值。默认情况下,客户端将条目处理为 String 对象。如果要以 JSON 格式将数据传送到 Data Grid 服务器,您必须配置 Hot Rod JS 客户端。

注意

脚本操作仅支持字符串键/值对和字符串参数。

流程

  1. 在您的客户端中添加 dataFormat 配置。
  2. 根据 keyTypevalueType 参数,为键和值设置数据格式。

键和值可以有不同的介质类型。对于 JSON 对象,指定 application/json。对于 String 对象,指定 text/plain 或省略参数以使用默认值。

var infinispan = require('infinispan');

var connected = infinispan.client(
    {port: 11222, host: '127.0.0.1'},
    {
        dataFormat : {
            keyType: 'application/json',
            valueType: 'application/json'
        }
    }
);

connected.then(function (client) {

  var clientPut = client.put({k: 'key'}, {v: 'value'});

  var clientGet = clientPut.then(
      function() { return client.get({k: 'key'}); });

  var showGet = clientGet.then(
      function(value) { console.log("get({k: 'key'})=" + JSON.stringify(value)); });

  return showGet.finally(
      function() { return client.disconnect(); });

}).catch(function(error) {

  console.log("Got error: " + error.message);

});
Copy to Clipboard Toggle word wrap

1.6. 配置日志记录

热 Rod JS 客户端使用 log4js,您可以通过以 JSON 格式提供配置来修改。

流程

  1. 以 JSON 格式创建日志配置。

    例如,以下 JSON 配置了一个将 TRACE 级别日志事件写入文件的附加程序:

    {
      "appenders": {
        "test": {
          "type": "fileSync",
          "filename": "my-log-file.log"
        }
      },
      "categories": {
        "default": {
          "appenders": ["test"],
          "level": "trace"
        }
      }
    }
    Copy to Clipboard Toggle word wrap
  2. var log4js = require ('log4js') 语句添加到 Hot Rod JS 客户端配置中。
  3. 使用 log4js.configure () 方法指定 JSON 日志记录配置的路径,如下例所示:

    var log4js = require('log4js');
    log4js.configure('path/to/my-log4js.json');
    Copy to Clipboard Toggle word wrap

第 2 章 使用 Hot Rod JS 客户端

查看将 Hot Rod JS 客户端与 Data Grid 搭配使用的一些示例。

2.1. hot Rod JS 客户端示例

安装和配置 Hot Rod JS 客户端后,请先尝试一些基本缓存操作来开始使用它,然后再进入更复杂的 Data Grid 交互。

2.1.1. hello world

在 Data Grid 服务器上创建一个名为 "myCache" 的缓存,然后添加并检索条目。

var infinispan = require('infinispan');

// Connect to Data Grid Server.
// Use an existing cache named "myCache".
var connected = infinispan.client(
  {port: 11222, host: '127.0.0.1'},
  {
    cacheName: 'myCache',
    clientIntelligence: 'BASIC',
    authentication: {
      enabled: true,
      saslMechanism: 'DIGEST-MD5',
      userName: 'username',
      password: 'changeme'
    }
  }
);

connected.then(function (client) {

  console.log('Connected to `myCache`');

  // Add an entry to the cache.
  var clientPut = client.put('hello', 'world');

  // Retrieve the entry you added.
  var clientGet = clientPut.then(
      function() { return client.get('hello'); });

  // Print the value of the entry.
  var showGet = clientGet.then(
      function(value) { console.log('get(hello)=' + value); });

  // Disconnect from Data Grid Server.
  return client.disconnect();

}).catch(function(error) {

  // Log any errors.
  console.log("Got error: " + error.message);

});
Copy to Clipboard Toggle word wrap

2.1.2. 使用条目并检索缓存统计信息

添加、检索、删除单个条目并查看缓存的统计信息。

var infinispan = require('infinispan');

var connected = infinispan.client(
  {port: 11222, host: '127.0.0.1'},
  {
    cacheName: 'myCache',
    authentication: {
        enabled: true,
        saslMechanism: 'DIGEST-MD5',
        userName: 'username',
        password: 'changeme'
    }
  }
);

connected.then(function (client) {

  var clientPut = client.put('key', 'value');

  var clientGet = clientPut.then(
      function() { return client.get('key'); });

  var showGet = clientGet.then(
      function(value) { console.log('get(key)=' + value); });

  var clientRemove = showGet.then(
      function() { return client.remove('key'); });

  var showRemove = clientRemove.then(
      function(success) { console.log('remove(key)=' + success); });

  var clientStats = showRemove.then(
    function() { return client.stats(); });

  var showStats = clientStats.then(
    function(stats) {
      console.log('Number of stores: ' + stats.stores);
      console.log('Number of cache hits: ' + stats.hits);
      console.log('All statistics: ' + JSON.stringify(stats, null, " "));
    });

  return showStats.finally(
      function() { return client.disconnect(); });

}).catch(function(error) {

  console.log("Got error: " + error.message);

});
Copy to Clipboard Toggle word wrap

2.1.3. 使用多个缓存条目

创建带有简单递归循环的多个缓存条目。

var infinispan = require('infinispan');

var connected = infinispan.client(
  {port: 11222, host: '127.0.0.1'},
  {
    cacheName: 'myCache',
    authentication: {
        enabled: true,
        saslMechanism: 'DIGEST-MD5',
        userName: 'username',
        password: 'changeme'
    }
  }
);

connected.then(function (client) {
  var data = [
    {key: 'multi1', value: 'v1'},
    {key: 'multi2', value: 'v2'},
    {key: 'multi3', value: 'v3'}];

  var clientPutAll = client.putAll(data);

  var clientGetAll = clientPutAll.then(
    function() { return client.getAll(['multi2', 'multi3']); });

  var showGetAll = clientGetAll.then(
    function(entries) {
      console.log('getAll(multi2, multi3)=%s', JSON.stringify(entries));
    }
  );

  var clientIterator = showGetAll.then(
    function() { return client.iterator(1); });

  var showIterated = clientIterator.then(
    function(it) {
      function loop(promise, fn) {
        // Simple recursive loop over the iterator's next() call.
        return promise.then(fn).then(function (entry) {
          return entry.done
            ? it.close().then(function () { return entry.value; })
            : loop(it.next(), fn);
        });
      }

      return loop(it.next(), function (entry) {
        console.log('iterator.next()=' + JSON.stringify(entry));
        return entry;
      });
    }
  );

  var clientClear = showIterated.then(
    function() { return client.clear(); });

  return clientClear.finally(
    function() { return client.disconnect(); });

}).catch(function(error) {

  console.log("Got error: " + error.message);

});
Copy to Clipboard Toggle word wrap

2.1.4. 使用 Async 和 Await 结构

Node.js 提供 asyncwait 结构,可简化缓存操作。

单个缓存条目

const infinispan = require("infinispan");

const log4js = require('log4js');
log4js.configure('example-log4js.json');

async function test() {
  await new Promise((resolve, reject) => setTimeout(() => resolve(), 1000));
  console.log('Hello, World!');

  let client = await infinispan.client({port: 11222, host: '127.0.0.1'});
  console.log(`Connected to Infinispan dashboard data`);

  await client.put('key', 'value');

  let value = await client.get('key');
  console.log('get(key)=' + value);

  let success = await client.remove('key');
  console.log('remove(key)=' + success);

  let stats = await client.stats();
  console.log('Number of stores: ' + stats.stores);
  console.log('Number of cache hits: ' + stats.hits);
  console.log('All statistics: ' + JSON.stringify(stats, null, " "));

  await client.disconnect();
}

test();
Copy to Clipboard Toggle word wrap

多个缓存条目

const infinispan = require("infinispan");

const log4js = require('log4js');
log4js.configure('example-log4js.json');

async function test() {
  let client = await infinispan.client({port: 11222, host: '127.0.0.1'});
  console.log(`Connected to Infinispan dashboard data`);

  let data = [
    {key: 'multi1', value: 'v1'},
    {key: 'multi2', value: 'v2'},
    {key: 'multi3', value: 'v3'}];

  await client.putAll(data);

  let entries = await client.getAll(['multi2', 'multi3']);
  console.log('getAll(multi2, multi3)=%s', JSON.stringify(entries));

  let iterator = await client.iterator(1);

  let entry = {done: true};

  do {
    entry = await iterator.next();
    console.log('iterator.next()=' + JSON.stringify(entry));
  } while (!entry.done);

  await iterator.close();

  await client.clear();

  await client.disconnect();
}

test();
Copy to Clipboard Toggle word wrap

2.1.5. 运行服务器端脚本

您可以将自定义脚本添加到 Data Grid 服务器,然后从 Hot Rod JS 客户端运行它们。

脚本示例

// mode=local,language=javascript,parameters=[k, v],datatype='text/plain; charset=utf-8'
cache.put(k, v);
cache.get(k);
Copy to Clipboard Toggle word wrap

脚本执行

var infinispan = require('infinispan');
var readFile = Promise.denodeify(require('fs').readFile);

var connected = infinispan.client(
  {port: 11222, host: '127.0.0.1'}
  {
    // Configure client connections with authentication and encryption here.
  }
);

connected.then(function (client) {

  var addScriptFile = readFile('sample-script.js').then(
    function(file) {
      return client.addScript('sample-script', file.toString());
    });

  var clientExecute = addScriptFile.then(
    function() {
      return client.execute('sample-script', {k: 'exec-key', v: 'exec-value'});
    });

  var showExecute = clientExecute.then(
    function(ret) { console.log('Script execution returned: ' + ret); });

  return showExecute.finally(
    function() { return client.disconnect(); });

}).catch(function(error) {

  console.log("Got error: " + error.message);

});
Copy to Clipboard Toggle word wrap

2.1.6. 注册事件监听程序

事件监听程序会在缓存更新时通知 Hot Rod JS 客户端,包括在创建、修改、删除或过期条目时。

注意

创建和修改条目的事件会通知客户端有关键和值。用于删除和过期的事件仅会通知客户端有关密钥。

事件监听程序注册

var infinispan = require('infinispan');

var connected = infinispan.client(
  {port: 11222, host: '127.0.0.1'}
  {
    // Configure client connections with authentication and encryption here.
  }
);

connected.then(function (client) {

    var clientAddListenerCreate = client.addListener('create', onCreate);

    var clientAddListeners = clientAddListenerCreate.then(
        function(listenerId) {
            // Associate multiple callbacks with a single client-side listener.
            // To do this, register listeners with the same listener ID.
            var clientAddListenerModify =
                client.addListener('modify', onModify, {listenerId: listenerId});

            var clientAddListenerRemove =
                client.addListener('remove', onRemove, {listenerId: listenerId});

            return Promise.all([clientAddListenerModify, clientAddListenerRemove]);
        });

    var clientCreate = clientAddListeners.then(
        function() { return client.putIfAbsent('eventful', 'v0'); });

    var clientModify = clientCreate.then(
        function() { return client.replace('eventful', 'v1'); });

    var clientRemove = clientModify.then(
        function() { return client.remove('eventful'); });

    var clientRemoveListener =
        Promise.all([clientAddListenerCreate, clientRemove]).then(
            function(values) {
                var listenerId = values[0];
                return client.removeListener(listenerId);
            });

    return clientRemoveListener.finally(
        function() { return client.disconnect(); });

}).catch(function(error) {

    console.log("Got error: " + error.message);

});

function onCreate(key, version) {
    console.log('[Event] Created key: ' + key +
        ' with version: ' + JSON.stringify(version));
}

function onModify(key, version) {
    console.log('[Event] Modified key: ' + key +
        ', version after update: ' + JSON.stringify(version));
}

function onRemove(key) {
    console.log('[Event] Removed key: ' + key);
}
Copy to Clipboard Toggle word wrap

您可以从事件监听器调整通知,以避免使用 key-value-with-previous-converter-factory converter 进行不必要的往返。例如,这允许您在事件中找到与键值关联的值,而不是在以后检索它们。

远程事件转换器

var infinispan = require('infinispan');

var connected = infinispan.client(
    {port: 11222, host: '127.0.0.1'}
    , {
        dataFormat : {
            keyType: 'application/json',
            valueType: 'application/json'
        }
    }
);

connected.then(function (client) {
    // Include the remote event converter to avoid unnecessary roundtrips.
    var opts = {
        converterFactory : {
            name: "key-value-with-previous-converter-factory"
        }
    };

    var clientAddListenerCreate = client.addListener('create', logEvent("Created"), opts);

    var clientAddListeners = clientAddListenerCreate.then(
        function(listenerId) {
            // Associate multiple callbacks with a single client-side listener.
            // To do this, register listeners with the same listener ID.
            var clientAddListenerModify =
                client.addListener('modify', logEvent("Modified"), {opts, listenerId: listenerId});

            var clientAddListenerRemove =
                client.addListener('remove', logEvent("Removed"), {opts, listenerId: listenerId});

            return Promise.all([clientAddListenerModify, clientAddListenerRemove]);
        });

    var clientCreate = clientAddListeners.then(
        function() { return client.putIfAbsent('converted', 'v0'); });

    var clientModify = clientCreate.then(
        function() { return client.replace('converted', 'v1'); });

    var clientRemove = clientModify.then(
        function() { return client.remove('converted'); });

    var clientRemoveListener =
        Promise.all([clientAddListenerCreate, clientRemove]).then(
            function(values) {
                var listenerId = values[0];
                return client.removeListener(listenerId);
            });

    return clientRemoveListener.finally(
        function() { return client.disconnect(); });

}).catch(function(error) {

    console.log("Got error: " + error.message);

});

function logEvent(prefix) {
    return function(event) {
        console.log(prefix + " key: " + event.key);
        console.log(prefix + " value: " + event.value);
        console.log(prefix + " previous value: " + event.prev);
    }
}
Copy to Clipboard Toggle word wrap

提示

您可以将自定义转换器添加到 Data Grid Server。如需更多信息,请参阅 Data Grid 文档

2.1.7. 使用条件操作

Hot Rod 协议将有关值的元数据存储在 Data Grid 中。此元数据提供了一个确定因素,可让您为特定条件执行缓存操作。例如,如果要替换键的值(如果版本不匹配)。

使用 getWithMetadata 方法检索与键值关联的元数据。

var infinispan = require('infinispan');

var connected = infinispan.client(
  {port: 11222, host: '127.0.0.1'}
  {
    // Configure client connections with authentication and encryption here.
  }
);

connected.then(function (client) {

  var clientPut = client.putIfAbsent('cond', 'v0');

  var showPut = clientPut.then(
      function(success) { console.log(':putIfAbsent(cond)=' + success); });

  var clientReplace = showPut.then(
      function() { return client.replace('cond', 'v1'); } );

  var showReplace = clientReplace.then(
      function(success) { console.log('replace(cond)=' + success); });

  var clientGetMetaForReplace = showReplace.then(
      function() { return client.getWithMetadata('cond'); });

  // Call the getWithMetadata method to retrieve the value and its metadata.
  var clientReplaceWithVersion = clientGetMetaForReplace.then(
      function(entry) {
        console.log('getWithMetadata(cond)=' + JSON.stringify(entry));
        return client.replaceWithVersion('cond', 'v2', entry.version);
      }
  );

  var showReplaceWithVersion = clientReplaceWithVersion.then(
      function(success) { console.log('replaceWithVersion(cond)=' + success); });

  var clientGetMetaForRemove = showReplaceWithVersion.then(
      function() { return client.getWithMetadata('cond'); });

  var clientRemoveWithVersion = clientGetMetaForRemove.then(
      function(entry) {
        console.log('getWithMetadata(cond)=' + JSON.stringify(entry));
        return client.removeWithVersion('cond', entry.version);
      }
  );

  var showRemoveWithVersion = clientRemoveWithVersion.then(
      function(success) { console.log('removeWithVersion(cond)=' + success)});

  return showRemoveWithVersion.finally(
      function() { return client.disconnect(); });

}).catch(function(error) {

  console.log("Got error: " + error.message);

});
Copy to Clipboard Toggle word wrap

2.1.8. 使用临时数据

使用 getWithMetadatasize 方法使缓存条目过期。

var infinispan = require('infinispan');

var connected = infinispan.client(
  {port: 11222, host: '127.0.0.1'}
  {
    // Configure client connections with authentication and encryption here.
  }
);

connected.then(function (client) {

  var clientPutExpiry = client.put('expiry', 'value', {lifespan: '1s'});

  var clientGetMetaAndSize = clientPutExpiry.then(
    function() {
      // Compute getWithMetadata and size in parallel.
      return Promise.all([client.getWithMetadata('expiry'), client.size()]);
    });

  var showGetMetaAndSize = clientGetMetaAndSize.then(
    function(values) {
      console.log('Before expiration:');
      console.log('getWithMetadata(expiry)=' + JSON.stringify(values[0]));
      console.log('size=' + values[1]);
    });

  var clientContainsAndSize = showGetMetaAndSize.then(
    function() {
      sleepFor(1100); // Sleep to force expiration.
      return Promise.all([client.containsKey('expiry'), client.size()]);
    });

  var showContainsAndSize = clientContainsAndSize.then(
    function(values) {
      console.log('After expiration:');
      console.log('containsKey(expiry)=' + values[0]);
      console.log('size=' + values[1]);
    });

  return showContainsAndSize.finally(
    function() { return client.disconnect(); });

}).catch(function(error) {

  console.log("Got error: " + error.message);

});

function sleepFor(sleepDuration){
  var now = new Date().getTime();
  while(new Date().getTime() < now + sleepDuration){ /* Do nothing. */ }
}
Copy to Clipboard Toggle word wrap

法律通告

Copyright © 2023 Red Hat, Inc.
The text of and illustrations in this document are licensed by Red Hat under a Creative Commons Attribution–Share Alike 3.0 Unported license ("CC-BY-SA"). An explanation of CC-BY-SA is available at http://creativecommons.org/licenses/by-sa/3.0/. In accordance with CC-BY-SA, if you distribute this document or an adaptation of it, you must provide the URL for the original version.
Red Hat, as the licensor of this document, waives the right to enforce, and agrees not to assert, Section 4d of CC-BY-SA to the fullest extent permitted by applicable law.
Red Hat, Red Hat Enterprise Linux, the Shadowman logo, the Red Hat logo, JBoss, OpenShift, Fedora, the Infinity logo, and RHCE are trademarks of Red Hat, Inc., registered in the United States and other countries.
Linux® is the registered trademark of Linus Torvalds in the United States and other countries.
Java® is a registered trademark of Oracle and/or its affiliates.
XFS® is a trademark of Silicon Graphics International Corp. or its subsidiaries in the United States and/or other countries.
MySQL® is a registered trademark of MySQL AB in the United States, the European Union and other countries.
Node.js® is an official trademark of Joyent. Red Hat is not formally related to or endorsed by the official Joyent Node.js open source or commercial project.
The OpenStack® Word Mark and OpenStack logo are either registered trademarks/service marks or trademarks/service marks of the OpenStack Foundation, in the United States and other countries and are used with the OpenStack Foundation's permission. We are not affiliated with, endorsed or sponsored by the OpenStack Foundation, or the OpenStack community.
All other trademarks are the property of their respective owners.
返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2026 Red Hat