Redis 利用返回值 进行原子性缓存(php)

TODO : 在此之上, 是需要了解redis 如何对空数据进行缓存
Redis 是常用的缓存系统, 但是不正确的使用, 会导致一些异常情况
下面是我之前写的, 一个对列表进行缓存的操作, 支持对空列表的缓存

$cacheType = $redis->type($key);
if (empty($cacheType)) {
    self::loadCache($params); // 如果是空列表, 则将一个string 存入key 中,否则使用zAdd 存入列表
    $cacheType = $redis->type($key);
}

if ($cacheType == Redis::REDIS_ZSET) {
    $idList = $redis->zRange($key, $start, $end);
}elseif($cacheType == Redis::REDIS_STRING){
    $idList = []; //对空数据进行缓存
}

以上的代码, 大多数情况没有问题, 但是某些极端情况下, 在执行type的时候, 这个key 存在, 但是下面执行到zRange的时候, 这个key过期了, 就会导致idList 是一个空列表.

解决方法

$idList = $redis->zRange($key, $start, $end); // 直接执行zrange操作

// 根据zRange的返回类型, 来判断数据是否被缓存
if(is_array($idList) && empty($idList)){
    // 如果zRange返回的是空数据, 则说明数据没有被缓存
    self::loadCache($params);
    $idList = $redis->zRange($key, $start, $end);
}

if($idList === false){ // 这里必须使用===来判断
    //如果zRange返回的是false, 则说明缓存中存在的数据类型不是zset , 我们认为此时缓存的结果为空列表
    return [];
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 【本教程目录】 1.redis是什么2.redis的作者3.谁在使用redis4.学会安装redis5.学会启动r...
    徐猿猿阅读 1,880评论 0 35
  • 使用缓存是系统性能优化的第一黄金法则。 缓存的设计和使用对一个系统的性能至关重要,平时接触到项目无论多少也都会在某...
    刀刃丿阅读 1,354评论 0 6
  • 原帖地址:https://www.jianshu.com/p/2f14bc570563 redis概述 Redis...
    onlyHalfSoul阅读 2,189评论 0 28
  • redis是什么 redis是一个开源的、使用C语言编写的、支持网络交互的、可基于内存也可持久化的Key-Valu...
    烨枫_邱阅读 788评论 0 6
  • NOSQL类型简介键值对:会使用到一个哈希表,表中有一个特定的键和一个指针指向特定的数据,如redis,volde...
    MicoCube阅读 4,060评论 2 27