Skip to content

Instantly share code, notes, and snippets.

@imbyc
Last active August 18, 2023 15:43
Show Gist options
  • Save imbyc/afeb94fa7b78729c4b86bceef56ea9e8 to your computer and use it in GitHub Desktop.
Save imbyc/afeb94fa7b78729c4b86bceef56ea9e8 to your computer and use it in GitHub Desktop.
使用redis保留固定数量的最新数据,按时间淘汰掉旧数据
<?php
public function getGoodsIdMapCache($goodsId)
{
$redis = Cache::store('redis')->handler();
return $redis->hGet('dtk_goodsid_map', $goodsId);
}
public function setGoodsIdMapCache($goodsIds)
{
$limit = 5000;
$redis = Cache::store('redis')->handler();
foreach ( $goodsIds as $key => $value ) {
// 添加新数据到有序集合,分数为时间戳
$redis->zAdd('dtk_goodsid_map_key', microtime(true) * 1000, $key);
$redis->hSet('dtk_goodsid_map', $key, $value);
}
// 检查有序集合的数量,如果超过5000个,则移除旧的键
$totalItems = $redis->zCard('dtk_goodsid_map_key');
if ( $totalItems > $limit ) {
$itemsToRemove = $totalItems - $limit;
$oldKeys = $redis->zRange('dtk_goodsid_map_key', 0, $itemsToRemove - 1);
foreach ( $oldKeys as $oldKey ) {
// 移除对应的哈希表中的值
$redis->hDel('dtk_goodsid_map', $oldKey);
}
// 移除有序集合中的旧键
$redis->zRemRangeByRank('dtk_goodsid_map_key', 0, $itemsToRemove - 1);
}
}
$this->setGoodsIdMapCache([
'NOGKQmNHnOBAnBR6t2' => 'bMzJ2ecgtBb6GPsyPQSQt6-gX3Nx7RTpXO4pOoRCo',
'9za58XohO39KoOzPtX4' => '8VwJdX9fntX27wQhgARTbt8-qZrM90nfn07dJnB5Iy',
'jGwQkK5TXg0Zj7DqTz' => 'D3Ommo9iDtKzmXBiQJoTjtn-oZ8rny4fBVr4MGmwUj',
'zD03ZyKIoXgPOV3OUO' => 'QJNNXyeFQtjna5piX5XiatQ-2myXjz9cMvp79eN9Uv',
'YJGeOZNHBkBygRDmfa' => 'a2zJ2QiotoQ9YRFQb5Ijty-ZRbyAMYiA9ANbPQWUv',
'zD03ZyKIoX7Yxz3VFzK' => 'w9jbRgGigtqxnY3Fo4Nsbtd-KyBOw9YHjJgG8oRNiy',
'KqGo5mwuj57g6PXWU6' => 'JKaaXdGtRtZ29KJHX8rHvta-4DQwgzXf8BxGKPjaur',
'XqGwrmpu0Ka8yMeoUg' => '2ZDrqKqiotBnDy0haeMfDtD-G7Md8xzIqgPa2OVRfnN',
'ANgJ0akHKg8N3yWQHYz' => 'm2mD9p6FktegyaASz6Buot3-6XVpoz2TyJW27jMohg',
'POG60mWHKn3y5q99S2X' => 'KqDPnwvS3t3ZKBDhm84SJtW-G7Md8xzIqr83vwWWfP',
]);
var_dump($this->getGoodsIdMapCache('NOGKQmNHnOBAnBR6t2'));
var_dump($this->getGoodsIdMapCache('zD03ZyKIoX7Yxz3VFzK'));
var_dump($this->getGoodsIdMapCache('POG60mWHKn3y5q99S2X'));
<?php
public function setGoodsIdMapCache($goodsIds)
{
$limit = 5000;
$redis = Cache::store('redis')->handler();
// 添加新数据到有序集合和哈希表
$pipeline = $redis->pipeline(); // 使用 Redis 的 pipeline 提高效率
foreach ($goodsIds as $key => $value) {
$pipeline->zAdd('dtk_goodsid_map_key', microtime(true) * 1000, $key);
$pipeline->hSet('dtk_goodsid_map', $key, $value);
}
$pipeline->exec(); // 执行 pipeline 中的操作
// 移除旧数据
$totalItems = $redis->zCard('dtk_goodsid_map_key');
if ($totalItems > $limit) {
$itemsToRemove = $totalItems - $limit;
$pipeline = $redis->pipeline(); // 新的 pipeline
$oldKeys = $redis->zRange('dtk_goodsid_map_key', 0, $itemsToRemove - 1);
foreach ($oldKeys as $oldKey) {
$pipeline->hDel('dtk_goodsid_map', $oldKey);
}
$pipeline->zRemRangeByRank('dtk_goodsid_map_key', 0, $itemsToRemove - 1);
$pipeline->exec();
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment