缓存类的实例是否有问题

我发现laravel的缓存真是强大,什么都可以缓存。
我写了一个用户类,这个用户类里面有一个cache方法,将$this进行缓存,结果发现真的缓存成功了,而且后续请求只要发现有缓存就从Cache::get()获取实例进行操作,然后再进行缓存,这个猜想竟然实现了,惊呆了。
我用的是redis缓存,查看了一下redis缓存的情况,发现跟缓存arrary不大一样,缓存arrary的话,redis中有一大串东西,但是缓存类的实例只有十几个字符,所以我心里有点担忧,我之前是在nodejs写网站,所以对php还是入门,不是很了解这是什么原理。
我对php的理解是每当用户访问网站或者发送一个post请求,php是开一个线程,那么这个线程结束实例也就消失了吧,所以有些疑惑,不理解!

本帖已被设为精华帖!
本帖由 Summer 于 7年前 加精
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 3
Summer

Redis 缓存的 get 和 put 方法,在文件 laravel/framework/src/Illuminate/Cache/RedisStore.php 里 :

/**
 * Retrieve an item from the cache by key.
 *
 * @param  string  $key
 * @return mixed
 */
public function get($key)
{
    if (! is_null($value = $this->connection()->get($this->prefix.$key))) {
        return is_numeric($value) ? $value : unserialize($value);
    }
}

/**
 * Store an item in the cache for a given number of minutes.
 *
 * @param  string  $key
 * @param  mixed   $value
 * @param  int     $minutes
 * @return void
 */
public function put($key, $value, $minutes)
{
    $value = is_numeric($value) ? $value : serialize($value);

    $minutes = max(1, $minutes);

    $this->connection()->setex($this->prefix.$key, $minutes * 60, $value);
}

对象在放进缓存之前使用 PHP 的 serialize 函数把对象序列号,取出来以后再使用 unserialize 进行反序列化。

对象在序列化的时候,只序列化对象的 当前状态 进行处理,如:对象的属性等。方法、类的结构等是在 unserialize 时,从 对象 对应的 上加载的。所以你觉得很小,因为序列化一个对象存储的东西并不多。

也就是说,一个 serialize 的内容,可以 unserialize 来一个对象。

php是开一个线程,那么这个线程结束实例也就消失了吧

是的,不过你把数据存储在缓存里,就已经不受进程的限制了,同等情况下,不同进程可以拿到没有过期的缓存。

7年前 评论

@Summer 谢谢解惑,在学redis的时候也学到序列化,当时还不是很懂这个序列化的意思,现在有点明白了

7年前 评论

php 的序列化方法 serialize() 可处理除了 resource 之外的任何类型,对象(实例)也是可以序列化的。

7年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!