学习

此应用程序利用了 Redis 核心数据结构、JSON、TimeSeries、搜索和查询功能。填充的数据稍后用于显示具有实时更新的可搜索交易概览,以及具有实时余额和最大支出者更新的个人财务管理概览。

在应用程序启动时,在 app/server.js 中,安排了一个 cron 作业,用于定期创建随机银行交易并将这些交易填充到 Redis 中。

app/server.js
//cron job to trigger createBankTransaction() at regular intervals

cron.schedule('*/10 * * * * *', async () => {
  const userName = process.env.REDIS_USERNAME;

  createBankTransaction(userName);

  //...
});
  • 交易生成器会创建一个随机的银行借记或贷记,该操作将反映在(默认)用户初始余额 $100,000.00 上。
  • 交易数据以 JSON 文档的形式保存在 Redis 中。
  • 为了捕获随时间变化的余额,每笔交易的 balanceAfter 值会记录在键为 balance_ts 的 TimeSeries 中。
  • 为了跟踪最大支出者,有序集合 bigspenders 中的关联成员 fromAccountName 会按交易金额递增。请注意,此金额可以是正数或负数。
app/transactions/transactionsGenerator.js
let balance = 100000.0;
const BALANCE_TS = 'balance_ts';
const SORTED_SET_KEY = 'bigspenders';

export const createBankTransaction = async () => {
  //to create random bank transaction
  let vendorsList = source.source; //app/transactions/transaction_sources.js
  const random = Math.floor(Math.random() * 9999999999);

  const vendor = vendorsList[random % vendorsList.length]; //random vendor from the list

  const amount = createTransactionAmount(vendor.fromAccountName, random);
  const transaction = {
    id: random * random,
    fromAccount: Math.floor((random / 2) * 3).toString(),
    fromAccountName: vendor.fromAccountName,
    toAccount: '1580783161',
    toAccountName: 'bob',
    amount: amount,
    description: vendor.description,
    transactionDate: new Date(),
    transactionType: vendor.type,
    balanceAfter: balance,
  };

  //redis json feature
  const bankTransaction = await bankTransactionRepository.save(transaction);
  console.log('Created bankTransaction!');
  // ...
};

const createTransactionAmount = (vendor, random) => {
  let amount = createAmount(); //random amount
  balance += amount;
  balance = parseFloat(balance.toFixed(2));

  //redis time series feature
  redis.ts.add(BALANCE_TS, '*', balance, { DUPLICATE_POLICY: 'first' });
  //redis sorted set as secondary index
  redis.zIncrBy(SORTED_SET_KEY, amount * -1, vendor);

  return amount;
};

使用 RedisInsight 查看示例 bankTransaction 数据

提示

下载 RedisInsight 以查看您的 Redis 数据或在工作台中使用原始 Redis 命令。