美文网首页
Redis 利用返回值 进行原子性缓存(php)

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

作者: 湛青 | 来源:发表于2019-03-07 12:10 被阅读0次

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 [];
}

相关文章

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

    TODO : 在此之上, 是需要了解redis 如何对空数据进行缓存Redis 是常用的缓存系统, 但是不正确的使...

  • PHP问题汇总

    php异常级别 redis持久化机制 redis缓存雪崩和缓存穿透 其他redis问题 redis地理位置 mys...

  • Redis分布式锁

    分布式锁方案 redis锁和Memcached的方式类似,利用Redis的setnx命令。此命令同样是原子性操作,...

  • redis操作原子性

    Redis操作原子性的原因 Redis的操作之所以是原子性的,是因为Redis是单线程的。

  • 缓存

    缓存配置文件 config/cache.php 主流的缓存如:Memcached 和 Redis 数据库 作为缓存...

  • SB集成Redis学习笔记之实际应用场景-java干货

    之前利用springBoot中的缓存机制,使用Redis作为缓存容器,做了一个缓存的简单Demo,当然Redis不...

  • Spring Boot整合Redis,并且实现查询操作,以及工具

    最近我在把项目的php后端改成Java后端,之前的php项目我用的是Redis做的缓存记录,然后还要用订阅进行短信...

  • Java多线程

    01 |可见性、原子性和有序性问题:并发编程Bug的源头 原子性:线程切换导致原子性。 可见性:CPU缓存导致可见...

  • redis发布订阅模式

    最近项目中,有个功能点是利用redis的发布订阅机制,进行服务器本地缓存数据同步。由于redis发布订阅功能的可靠...

  • redis的事务

    事务的原子性的解析 1.进队列之前redis已经识别错误了,会保持原子性 2.进队列之前redis不能识别错误,会...

网友评论

      本文标题:Redis 利用返回值 进行原子性缓存(php)

      本文链接:https://www.haomeiwen.com/subject/gexcpqtx.html