每天 Shaarli

一天内的所有链接,汇聚在一个页面上。

October 28, 2024

Note: PHP使用Redis
<?php
// 检查 Redis 扩展是否已加载
if (!extension_loaded('redis')) {
    die("Redis extension is not loaded.");
}

try {
    // 创建 Redis 客户端实例
    $redis = new Redis();

    // 连接到 Redis 服务器 (假设是本地服务器,默认端口 6379)
    $redis->connect('127.0.0.1', 6379);

    // 设置一个键值对
    $redis->set("greeting", "Hello, Redis!");

    // 获取并显示该值
    $greeting = $redis->get("greeting");
    echo "<p>Greeting from Redis: " . htmlspecialchars($greeting) . "</p>";

    // 增加一个计数器
    $redis->incr("counter");
    $counter = $redis->get("counter");
    echo "<p>Visit count: " . htmlspecialchars($counter) . "</p>";

    // 删除键
    $redis->del("greeting");

} catch (Exception $e) {
    // 错误处理
    echo "Could not connect to Redis: ", $e->getMessage();
}
?>

Redis 的持久化配置

打开 Redis 配置文件(AlpineLinux中位于 /etc/redis.conf),根据需要设置持久化选项:

# 启用 RDB 快照(例如每 5 分钟有 1 次更新时生成快照)
save 300 1

# 启用 AOF 持久化
appendonly yes

修改完配置文件后,重启 Redis 使配置生效:

rc-service redis restart

Redis 的跨 PHP 脚本共享

只要 Redis 服务在运行,所有连接到它的 PHP 脚本都可以共享数据。在其他 PHP 文件中,只需重复相同的 Redis 连接代码,即可访问 Redis 中的数据。

例如,在 other_script.php 中可以使用:

<?php
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);

// 读取之前设置的计数器
$counter = $redis->get("counter");
echo "Current visit count: " . htmlspecialchars($counter);
?>

将表格结构的数据存储在 Redis 中

1. 使用 Redis 哈希(Hash)类型

Redis 哈希类型可以用来存储类似行记录的数据,每一行是一个 Redis 哈希,每列是哈希的字段。
适用于单条记录的数据存储,且查询特定字段非常高效。
示例
假设有一张“用户表”,包含 id, name, 和 email 列:

<?php
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);

// 添加一个用户记录,key 为 "user:1"
$redis->hSet("user:1", "id", 1);
$redis->hSet("user:1", "name", "Alice");
$redis->hSet("user:1", "email", "alice@example.com");

// 获取用户记录
$user = $redis->hGetAll("user:1");
print_r($user);
?>

结果

Array
(
    [id] => 1
    [name] => Alice
    [email] => alice@example.com
)

2. 使用 Redis 列表(List)类型

Redis 列表可以用来按顺序存储多行数据,例如多个用户的 id 列表。
可以用于模拟表中的一列,但没有字段标识,适合按顺序存取数据的场景。
示例

$redis->lPush("user_ids", 1);
$redis->lPush("user_ids", 2);
$redis->lPush("user_ids", 3);

$userIds = $redis->lRange("user_ids", 0, -1);
print_r($userIds);

3. 使用 Redis 集合(Set)和有序集合(Sorted Set)

集合(Set)适合无序、去重的数据列,适用于存储唯一的字段(如标签)。
有序集合(Sorted Set)适合存储排序数据,例如排行榜或按日期排序的数据。
示例

$redis->zAdd("user_scores", 100, "user:1");
$redis->zAdd("user_scores", 150, "user:2");

4. 将整张表序列化存储

如果需要存储复杂的表格数据,可以将整个表格序列化为 JSON 格式字符串,并存储到 Redis 中。
示例

$userData = [
    ['id' => 1, 'name' => 'Alice', 'email' => 'alice@example.com'],
    ['id' => 2, 'name' => 'Bob', 'email' => 'bob@example.com'],
];

$redis->set("users", json_encode($userData));

// 获取并解码
$decodedData = json_decode($redis->get("users"), true);
print_r($decodedData);

总结

Redis 哈希最适合存储类似数据库表的行记录。
JSON 序列化适合存储复杂的表格数据结构。
使用合适的数据类型可以让 Redis 更高效地管理和查询表格化数据。

Note: PHP操作Sqlite3数据库

文件数据库:

<?php
// 定义数据库文件的路径
$dbFile = 'database.db';

try {
    // 创建或打开 SQLite3 数据库
    $db = new SQLite3($dbFile);

    // 创建一个表格,如果已经存在则跳过
    $db->exec("CREATE TABLE IF NOT EXISTS users (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        name TEXT NOT NULL,
        email TEXT NOT NULL UNIQUE
    )");

    // 插入一些数据
    $insertData = [
        ['name' => 'Alice', 'email' => 'alice@example.com'],
        ['name' => 'Bob', 'email' => 'bob@example.com'],
        ['name' => 'Charlie', 'email' => 'charlie@example.com'],
    ];

    $stmt = $db->prepare("INSERT OR IGNORE INTO users (name, email) VALUES (:name, :email)");
    foreach ($insertData as $data) {
        $stmt->bindValue(':name', $data['name'], SQLITE3_TEXT);
        $stmt->bindValue(':email', $data['email'], SQLITE3_TEXT);
        $stmt->execute();
    }

    // 从数据库读取数据
    $result = $db->query("SELECT * FROM users");

    // 输出数据
    echo "<h1>Users List</h1>";
    echo "<table border='1'>";
    echo "<tr><th>ID</th><th>Name</th><th>Email</th></tr>";
    while ($row = $result->fetchArray(SQLITE3_ASSOC)) {
        echo "<tr>";
        echo "<td>" . htmlspecialchars($row['id']) . "</td>";
        echo "<td>" . htmlspecialchars($row['name']) . "</td>";
        echo "<td>" . htmlspecialchars($row['email']) . "</td>";
        echo "</tr>";
    }
    echo "</table>";

    // 关闭数据库连接
    $db->close();

} catch (Exception $e) {
    echo "Error: " . $e->getMessage();
}
?>

内存数据库:

<?php
try {
    // 创建一个 SQLite3 的内存数据库
    $db = new SQLite3(':memory:');

    // 创建一个表
    $db->exec("CREATE TABLE users (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        name TEXT NOT NULL,
        email TEXT NOT NULL UNIQUE
    )");

    // 插入一些数据
    $db->exec("INSERT INTO users (name, email) VALUES ('Alice', 'alice@example.com')");
    $db->exec("INSERT INTO users (name, email) VALUES ('Bob', 'bob@example.com')");
    $db->exec("INSERT INTO users (name, email) VALUES ('Charlie', 'charlie@example.com')");

    // 从数据库读取数据
    $result = $db->query("SELECT * FROM users");

    // 输出数据
    echo "<h1>Users List (Memory Database)</h1>";
    echo "<table border='1'>";
    echo "<tr><th>ID</th><th>Name</th><th>Email</th></tr>";
    while ($row = $result->fetchArray(SQLITE3_ASSOC)) {
        echo "<tr>";
        echo "<td>" . htmlspecialchars($row['id']) . "</td>";
        echo "<td>" . htmlspecialchars($row['name']) . "</td>";
        echo "<td>" . htmlspecialchars($row['email']) . "</td>";
        echo "</tr>";
    }
    echo "</table>";

    // 关闭数据库连接
    $db->close();

} catch (Exception $e) {
    echo "Error: " . $e->getMessage();
}
?>