热 Rod Node.JS 客户端指南


Red Hat Data Grid 8.2

配置和使用 Hot Rod JS 客户端

Red Hat Customer Content Services

摘要

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

Red Hat Data Grid

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

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

Data Grid 文档

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

Data Grid 下载

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

注意

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

使开源包含更多

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

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

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

1.1. 安装 Hot Rod JS 客户端

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

先决条件

  • Node.js 版本 1214
  • Data Grid Server 8.2.

流程

  1. 从红帽客户门户下载并提取 redhat-datagrid-<version>-nodejs-client.zip
  2. 从提取的目录安装 tgz 软件包,如下例所示:

    $ npm install /path/to/redhat-datagrid-<version>-nodejs-client/infinispan-<version>.tgz
    Copy to Clipboard Toggle word wrap

1.2. 配置数据网格连接

配置 Hot Rod JS 客户端以连接到 Data Grid 服务器。

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

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

由于 Hot Rod JS 客户端是拓扑感知,所以如果连接到一个 Data Grid 服务器中断,客户端会在集群中的其他节点上重试任何不完整的操作。同样,如果在一个 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。

先决条件

  • 在 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. 配置身份验证

数据网格服务器使用不同的 SASL 机制来验证 Hot Rod JS 客户端连接。

先决条件

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

流程

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

1.3.1. SASL 身份验证机制

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

PLAIN

通过线路以类似于 HTTP BASIC 身份验证的方式以纯文本(未加密)发送凭据。

重要

要保护数据网格凭证,您应该只使用 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

除了非ce用来加密凭据外,还使用 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

除了哈希算法和非ce 值外,使用 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. 配置加密

Data Grid Server 可以强制不同类型的 SSL/TLS 加密来保护 Hot Rod JS 客户端连接。

先决条件

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

流程

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

1.4.1. 加密类型

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

Data Grid Server 身份

对于基本加密,您可以在配置中为 Data Grid 服务器证书添加签名证书或 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 Server 配置中启用客户端证书身份验证,请添加密钥存储,如下例所示:

注意

在使用客户端证书身份验证时,您必须使用 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
Server Name Indication (SNI)

如果您使用 SNI 来允许 Hot Rod JS 客户端请求数据网格服务器主机名,请为与 Data Grid Server 配置中的主机名匹配的 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)密钥的问题。

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

1.5. 配置数据格式

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

注意

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

流程

  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 客户端后,请先尝试一些基本的缓存操作,然后再继续与数据网格进行更复杂的交互。

2.1.1. hello world

在 Data Grid Server 上创建一个名为 "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 提供 asyncawait 结构,可简化缓存操作。

单个缓存条目

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 Server,然后从 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 转换程序进行不必要的往返。例如,这允许您查找与事件内键关联的值,而不是在以后检索它们。

远程事件转换器

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 协议存储有关数据网格值的元数据。这个元数据提供了一个确定性因素,可让您为特定条件执行缓存操作。例如,如果版本不匹配,则需要替换键的值。

使用 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

© 2025 Red Hat