zoukankan      html  css  js  c++  java
  • 关于YiII框架的扩展memcache中set设置时间就get查询失效的解决方案(版本是1.1.20)

    0x01 前言

    在使用Yii框架的扩展memcache缓存的时候,存储数据有一个set方法,来看一下set方法的原型:

    public boolean set(string $id, mixed $value, integer $expire=0, ....)
    

    第一个参数时设置键名的,第二个参数是设置要缓存的值也就是键值,第三个参数是设置缓存的时间多久失效(默认是0,也就是永远不失效,如果不为0,最大为30天,也就是2592000秒),如果设置为1,就缓存1秒也就是1秒后失效

    当不设置缓存的时间时,使用get方法获取键值是没有问题的,如图:
    在这里插入图片描述
    在这里插入图片描述
    但是如果设置了时间,那么get查询就显示为空

    先重启一下服务,清除内存中的数据(因为缓存的数据是在内存当中的,服务重启数据丢失,就是没了的意思)

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    显示为空,就是查询不到数据

    0x02 解决方案

    在这里插入图片描述
    在这里插入图片描述

    打开CMemCache.php的源文件,将注释(注释是原代码)改为红圈圈(红圈圈是改完的)中的行。重启服务后在试一遍

    在这里插入图片描述
    在这里插入图片描述

    发现成功了

    在这里插入图片描述
    在这里插入图片描述

    最后等待10秒后(记得将set注释的,避免重复),缓存值消失,达到了最初的目的

    0x03 原理

    在这里插入图片描述

    这就是文件没有更改时的代码,其中$expire就是我们所要设置的缓存时间的参数。来看一下if分支,假如我们设置的缓存时间不大于0的话,就返回0,也就是永久有效(这个在上面说明过);如果大于0的话,就将缓存的时间加上一个time()函数返回的值,当时我看了一下我的time()函数返回的值是1543045753,之后加上我们设置的缓存时间就远远大于2592000秒(上面有讲过)。所以set方法就没有储存值,当然也查询不到,所以get查询的时候为空

    0x04 总结

    以上就是set设置时间就get查询失效的解决方案,也算是YII框架中的一个小bug,原理也讲了,希望大家理解

    PS:如果认为我这个博客有什么问题或者有修改意见的,请一定要告诉我,非常感谢(我的邮箱2412875746@qq.com)

  • 相关阅读:
    springboot成神之——websocket发送和请求消息
    springboot成神之——发送邮件
    springboot成神之——spring文件下载功能
    springboot成神之——spring的文件上传
    springboot成神之——basic auth和JWT验证结合
    springboot成神之——Basic Auth应用
    leetcode-easy-array-122 best time to buy and sell stocks II
    leetcode-easy-array-31 three sum
    leetcode-mid-others-621. Task Scheduler
    leetcode-mid-math-371. Sum of Two Integers-NO-???
  • 原文地址:https://www.cnblogs.com/csnd/p/11800560.html
Copyright © 2011-2022 走看看