每天 Shaarli
<?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 更高效地管理和查询表格化数据。
文件数据库:
<?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();
}
?>