Flutter Redis数据库操作插件angel3_redis的使用

Flutter Redis数据库操作插件angel3_redis的使用

Pub Version (包括预发布版本) 空安全 Discord 许可证

angel_redis 分支以支持NNBD

Redis-enabled服务用于Angel3框架。RedisService 可以单独使用,或者作为上游数据库结果缓存的 <a href="https://pub.dev/packages/angel3_cache">CacheService</a> 的后端。

安装

package:angel3_redis 需要Angel3。

在你的 pubspec.yaml 文件中:

dependencies:
    angel3_framework: ^8.0.0
    angel3_redis: ^8.0.0

使用

将一个 <code>RespCommandsTier2</code> 实例(来自 <code>package:resp_client</code>)传递给 <code>RedisService</code> 构造函数。你也可以传递一个可选前缀,如果你正在使用 <code>angel3_redis</code> 来处理多个逻辑上独立的集合,则推荐这样做。Redis 是一个扁平的键值存储;通过为使用的键添加前缀,<code>angel3_redis</code> 可以提供使用分离存储而不是单个节点的经验。

如果没有前缀,不同的集合可能会互相覆盖数据。

注意事项

  • <code>index</code><code>modify</code> 不是原子操作;每个都执行两个独立的查询。<code>angel3_redis</code> 将数据存储为JSON字符串,而不是Redis哈希,因此无法原地更新。
  • <code>index</code> 使用Redis的 <code>KEYS</code> 功能,所以在生产环境中尽量少用,如果使用的话。在一个较大的数据库中,它可能会很快成为一个瓶颈。
  • <code>remove</code> 使用 <code>MULTI</code>+<code>EXEC</code> 在事务中。
  • 优先使用 <code>update</code> 而不是 <code>modify</code>。前者只执行一个查询,但会覆盖给定键的当前内容。
  • 当调用 <code>create</code> 时,你可能已经有一个 <code>id</code> 用于插入到存储中。例如,当你缓存另一个数据库时,你会保留项目的ID或主键。<code>angel3_redis</code> 会注意这一点。如果没有 <code>id</code>,则会通过 <code>INCR</code> 调用创建一个ID。

示例

也在 <code>example/main.dart</code> 中:

import 'package:angel3_redis/angel3_redis.dart';
import 'package:resp_client/resp_client.dart';
import 'package:resp_client/resp_commands.dart';
import 'package:resp_client/resp_server.dart';

void main() async {
  // 连接到本地Redis服务器
  var connection = await connectSocket('localhost');
  var client = RespClient(connection);
  
  // 创建一个RedisService实例,带有一个前缀
  var service = RedisService(RespCommandsTier2(client), prefix: 'example');

  // 创建一个对象
  await service.create({'id': 'a', 'hello': 'world'});

  // 读取该对象
  var read = await service.read('a');
  print(read['hello']); // 输出 "world"

  // 删除该对象
  await service.remove('a');

  // 关闭连接
  await connection.close();
}

更多关于Flutter Redis数据库操作插件angel3_redis的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter Redis数据库操作插件angel3_redis的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何在Flutter中使用angel3_redis插件来操作Redis数据库的示例代码。angel3_redis是一个Dart包,用于与Redis数据库进行交互,虽然它主要用于Dart后端项目,但你可以在Flutter项目的某些部分(如后台服务)中使用它。

请注意,由于Flutter主要用于构建前端应用,直接在Flutter前端代码中操作Redis并不常见。通常,你会在Flutter应用中调用一个后端服务,该服务使用angel3_redis与Redis进行交互。

以下是一个简单的后端Dart服务示例,它使用angel3_redis与Redis进行交互,并通过HTTP接口提供数据访问:

1. 添加依赖

首先,在你的pubspec.yaml文件中添加angel3_frameworkangel3_redis的依赖:

dependencies:
  angel_framework: ^4.0.0 # 确保使用兼容版本
  angel3_redis: ^2.0.0    # 确保使用兼容版本

2. 编写后端服务

创建一个新的Dart文件(例如server.dart),并编写以下代码:

import 'package:angel_framework/angel_framework.dart';
import 'package:angel3_redis/angel3_redis.dart';
import 'dart:async';

void main() async {
  // 创建Angel应用
  var app = Angel();

  // 配置Redis客户端
  var redis = await Redis.connect('redis://localhost:6379');

  // 使用中间件将Redis客户端添加到Angel容器中
  app.container.singleton('redis', redis);

  // 示例路由:设置Redis键值对
  app.post('/set', (req, res) async {
    var key = req.body['key'];
    var value = req.body['value'];

    if (key == null || value == null) {
      return res.status(400).json({'error': 'Missing key or value'});
    }

    await redis.set(key, value);
    return res.json({'message': 'Key-value pair set successfully'});
  });

  // 示例路由:获取Redis键值对
  app.get('/get/:key', (req, res) async {
    var key = req.params['key'];

    if (key == null) {
      return res.status(400).json({'error': 'Missing key'});
    }

    var value = await redis.get(key);
    return res.json({'key': key, 'value': value});
  });

  // 启动服务器
  await app.listen(3000);
  print('Server is running on http://localhost:3000');
}

3. 运行后端服务

在终端中运行以下命令来启动后端服务:

dart run server.dart

4. 在Flutter前端调用后端服务

现在,你可以在Flutter应用中通过HTTP请求来调用这个后端服务。例如,使用dio库来发送HTTP请求:

# 在你的Flutter项目的pubspec.yaml中添加dio依赖
dependencies:
  dio: ^4.0.0 # 确保使用兼容版本

然后在你的Flutter代码中:

import 'package:flutter/material.dart';
import 'package:dio/dio.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter Redis Example'),
        ),
        body: Center(
          child: RedisExample(),
        ),
      ),
    );
  }
}

class RedisExample extends StatefulWidget {
  @override
  _RedisExampleState createState() => _RedisExampleState();
}

class _RedisExampleState extends State<RedisExample> {
  String result = '';

  void _setKeyValue() async {
    var dio = Dio();
    var response = await dio.post('http://localhost:3000/set',
        data: {
          'key': 'myKey',
          'value': 'myValue'
        });
    setState(() {
      result = response.data.toString();
    });
  }

  void _getKeyValue() async {
    var dio = Dio();
    var response = await dio.get('http://localhost:3000/get/myKey');
    setState(() {
      result = response.data.toString();
    });
  }

  @override
  Widget build(BuildContext context) {
    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: <Widget>[
        Text('Result: $result'),
        ElevatedButton(
          onPressed: _setKeyValue,
          child: Text('Set Key-Value'),
        ),
        ElevatedButton(
          onPressed: _getKeyValue,
          child: Text('Get Key-Value'),
        ),
      ],
    );
  }
}

以上代码展示了如何在Flutter应用中通过HTTP请求与后端服务进行交互,后端服务使用angel3_redis与Redis数据库进行交互。这样,你就可以在Flutter应用中实现对Redis数据库的操作。

回到顶部