Last active
August 18, 2023 15:43
-
-
Save imbyc/afeb94fa7b78729c4b86bceef56ea9e8 to your computer and use it in GitHub Desktop.
使用redis保留固定数量的最新数据,按时间淘汰掉旧数据
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?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')); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?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