广告
返回顶部
首页 > 资讯 > 精选 >Redis怎么批量设置过期时间
  • 500
分享到

Redis怎么批量设置过期时间

2023-06-21 20:06:52 500人浏览 薄情痞子
摘要

这篇文章将为大家详细讲解有关Redis怎么批量设置过期时间,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Redis如何批量设置过期时间呢?不要说在foreach中通过set()函数批量设置过期时间我们引入

这篇文章将为大家详细讲解有关Redis怎么批量设置过期时间,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

Redis如何批量设置过期时间呢?

不要说在foreach中通过set()函数批量设置过期时间

我们引入redis的PIPLINE,来解决批量设置过期时间的问题。

PIPLINE的原理是什么?

未使用pipline执行N条命令

Redis怎么批量设置过期时间

使用pipline执行N条命令

Redis怎么批量设置过期时间

通过图例可以很明显的看出来PIPLINE的原理:

客户端通过PIPLINE拼接子命令,只需要发送一次请求,在redis收到PIPLINE命令后,处理PIPLINE组成的命令块,减少了网络请求响应次数。

网络延迟越大PIPLINE的优势越能体现出来

拼接的子命令条数越多使用PIPLINE的优势越能体现出来

注意:并不是拼接的子命令越多越好,N值也有是上限的,当拼接命令过长时会导致客户端等待很长时间,造成网络堵塞;我们可以根据实际情况,把大批量命令拆分成几个PIPLINE执行。

代码封装

//批量设置过期时间public static function myPut(array $data, $ttl = 0){    if (empty($data)) {        return false;    }    $pipeline = Redis::connection('cache')        ->multi(\Redis::PIPELINE);    foreach ($data as $key => $value) {        if (empty($value)) {            continue;        }        if ($ttl == 0) {            $pipeline->set(trim($key), $value);        } else {            $pipeline->set(trim($key), $value, $ttl);        }    }    $pipeline->exec();}

项目实战

需求描述

  • 打开APP,给喜欢我的人发送我的上线通知(为了避免打扰,8小时内重复登录不触发通知)

  • 每个人每半小时只会收到一次这类上线通知(即半小时内就算我喜欢的1万人都上线了,我也只收到一次喜欢的人上线通知)

要点分析

  • 合理使用缓存,减少DB读写次数

  • 不仅要减少DB读写次数,也要减少Redis的读写次数,使用PIPLINE

代码实现解析

  • canRecall() 写的比较优雅,先判断是否已发送的标记,再判断HouseOpen::getCurrentOpen(),因为HouseOpen::getCurrentOpen()是要查询DB计算的,这种代码要尽可能少的被执行到,减少DB查询。

  • array_diff() 取差集的思路,获得需要推送的人

封装工具

<?PHPnamespace App\Model\House;...class HouseLikeRecallUser{    protected $_userid = '';    protected $_availableUser = [];    protected $_recallFlagKey = '';    const TYPE_TTL_HOUSE_LIKE_RECALL = 60 * 30; //半小时后可以再次接收到喜欢的xxx进入通知    const TYPE_TTL_HOUSE_LIKE_RECALL_FLAG = 60 * 60 * 8; //8小时重复登录不触发    //初始化 传入setRecalled 的过期时间    public function __construct($userid)    {        $this->_userid = $userid;        //登录后给喜欢我的人推送校验:同一场次重复登录不重复发送        $this->_recallFlagKey = CacheKey::getCacheKey(CacheKey::TYPE_HOUSE_LIKE_RECALL_FLAG, $this->_userid);    }    //设置当前用户推送标示    public function setRecalled()    {        Cache::put($this->_recallFlagKey, 1, self::TYPE_TTL_HOUSE_LIKE_RECALL_FLAG);    }    //获取当前用户是否触发推送    public function canRecall()    {        $res = false;        if (empty(Cache::get($this->_recallFlagKey))) {            $houseOpen = HouseOpen::getCurrentOpen();            if ($houseOpen['status'] == HouseOpen::HOUSE_STATUS_OPEN) {                $res = true;            }        }        return $res;    }    //获取需要推送用户    public function getAvailableUser()    {        //获得最近喜欢我的用户        $recentLikeMeUser = UserRelationSingle::getLikeMeUserIds($this->_userid, 100, Utility::getBeforeNDayTimestamp(7));        //获得最近喜欢我的用户的 RECALL缓存标记        foreach ($recentLikeMeUser as $userid) {            $batchKey[] = CacheKey::getCacheKey(CacheKey::TYPE_HOUSE_LIKE_RECALL, $userid);        }        //获得最近喜欢我的且已经推送过的用户        $cacheData = [];        if (!empty($batchKey)) {            $cacheData = Redis::connection('cache')->mget($batchKey);        }        //计算最近喜欢我的用户 和 已经推送过的用户 的差集:就是需要推送的用户        $this->_availableUser = array_diff($recentLikeMeUser, $cacheData);        return $this->_availableUser;    }    //更新已经推送的用户    public function updateRecalledUser()    {        //批量更新差集用户        $recalledUser = [];        foreach ($this->_availableUser as $userid) {            $cacheKey = CacheKey::getCacheKey(CacheKey::TYPE_HOUSE_LIKE_RECALL, $userid);            $recalledUser[$cacheKey] = $userid;        }        //批量更新 设置过期时间        self::myPut($recalledUser, self::TYPE_TTL_HOUSE_LIKE_RECALL);    }    //批量设置过期时间    public static function myPut(array $data, $ttl = 0)    {        if (empty($data)) {            return false;        }        $pipeline = Redis::connection('cache')            ->multi(\Redis::PIPELINE);        foreach ($data as $key => $value) {            if (empty($value)) {                continue;            }            if ($ttl == 0) {                $pipeline->set(trim($key), $value);            } else {                $pipeline->set(trim($key), $value, $ttl);            }        }        $pipeline->exec();    }}

调用工具类

public function handle(){    $userid = $this->_userid;    $houseLikeRecallUser = new HouseLikeRecallUser($userid);    if ($houseLikeRecallUser->canRecall()) {        $recallUserIds = $houseLikeRecallUser->getAvailableUser();        $houseLikeRecallUser->setRecalled();        $houseLikeRecallUser->updateRecalledUser();        //群发推送消息        .        .        .    }}

关于“Redis怎么批量设置过期时间”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

--结束END--

本文标题: Redis怎么批量设置过期时间

本文链接: https://www.lsjlt.com/news/300400.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Redis怎么批量设置过期时间
    这篇文章将为大家详细讲解有关Redis怎么批量设置过期时间,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Redis如何批量设置过期时间呢?不要说在foreach中通过set()函数批量设置过期时间我们引入...
    99+
    2023-06-21
  • Redis如何批量设置过期时间(PIPLINE的使用)
    合理的使用缓存策略对开发同学来讲,就好像孙悟空习得自在极意功一般~ Redis如何批量设置过期时间呢? 不要说在foreach中通过set()函数批量设置过期时间 我们引入redis...
    99+
    2022-11-12
  • Redis中怎么设置过期时间的Key
    Redis中怎么设置过期时间的Key,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。1、 DEL/SET/GETSET等命令会清除过期时间在使用...
    99+
    2022-10-18
  • Redis怎么设置生存和过期时间
    这篇“Redis怎么设置生存和过期时间”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Red...
    99+
    2022-10-19
  • redis怎么设置默认的过期时间
    在Redis中,可以使用`EXPIRE`命令设置键的过期时间。但是,如果你想要为所有键设置一个默认的过期时间,可以使用Redis的`...
    99+
    2023-09-06
    redis
  • Redis设置key的过期时间
    Redis中可以设置数据的过期时间,一旦过期自动删除数据。 1.设置过期时间 expire 127.0.0.1:6379> set name "ok" //设置10s后过期,e...
    99+
    2023-01-28
    Redis设置key过期时间 Redis key过期时间
  • redis如何设置过期时间
    redis如何设置过期时间?相信很多新手小白还没学会这个技能,通过这篇文章的总结,希望你能学会这个技能。以下资料是实现的步骤。1、Redis中key的过期时间通过EXPIRE key seconds命令来设...
    99+
    2022-10-18
  • 怎么在redis中设置key的过期时间
    在redis中设置key过期时间的方法:1.启动redis服务;2.登录redis数据库;3.执行命令设置过期时间;具体步骤如下:首先,在命令行中启动redis服务;service redis start mysql服务启动后,输入用户名,...
    99+
    2022-10-22
  • php redis如何设置过期时间
    本文将为大家详细介绍“php redis如何设置过期时间”,内容步骤清晰详细,细节处理妥当,而小编每天都会更新不同的知识点,希望这篇“php redis如何设置过期时间”能够给你意想不到的收获,请大家跟着小编的思路慢慢深入,具体内容如下,一...
    99+
    2023-06-06
  • redis如何设置不过期时间
    在 Redis 中设置键不过期的方法有两种:1. 不设置过期时间:在设置键时,不指定过期时间参数即可。例如使用 `SET key v...
    99+
    2023-09-05
    redis
  • redis缓存过期时间如何设置
    在Redis中,可以通过使用EXPIRE命令来设置缓存的过期时间。语法如下:```EXPIRE key seconds```其中,k...
    99+
    2023-08-30
    redis
  • Redis 过期键的设置、获取和删除过期时间
    Redis 过期键的设置、获取和删除过期时间 设置过期 默认情况下键是没有生存时间的,也就是永不过期,除非清空内存。 设置的键的生存时间也很容易,可以通过4个命令设置(任选一即可):EXPIRE、PEXP...
    99+
    2022-10-18
  • 如何设置合适的redis过期时间
    这篇文章运用简单易懂的例子给大家介绍如何设置合适的redis过期时间,代码非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。          ...
    99+
    2022-10-18
  • 如何为redis设置缓存过期时间
    你可以使用EXPIRE命令来为Redis设置缓存过期时间。下面是设置缓存过期时间的步骤:1. 使用EXPIRE命令设置缓存的过期时间...
    99+
    2023-09-11
    redis
  • 浅谈redis的过期时间设置和过期删除机制
    目录一:设置过期时间二:保存过期时间三:移除过期时间四:计算并返回剩余生存时间五:过期键的删除策略六:redis使用的策略一:设置过期时间 redis有四种命令可以用于设置键的生存时...
    99+
    2022-11-13
  • JavaScript中怎么设置Cookie过期时间
    这篇文章主要讲解了“JavaScript中怎么设置Cookie过期时间”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JavaScript中怎么设置Cooki...
    99+
    2022-10-19
  • Java怎么设置过期时间的map
    这篇文章给大家分享的是有关Java怎么设置过期时间的map的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、技术背景在实际的项目开发中,我们经常会使用到缓存中间件(如redis、MemCache等)来帮助我们提高...
    99+
    2023-06-29
  • asp中怎么设置session过期时间
    在ASP中,可以通过设置Session对象的Timeout属性来设置Session的过期时间。Timeout属性表示Session的...
    99+
    2023-08-18
    asp session
  • Redis系列(六):设置/移除键的过期时间
    本篇博客是Redis系列的第6篇,主要讲解以下内容: 数据库数量 切换目标数据库 设置键的过期时间 移除键的过期时间 本系列的前5篇可以点击以下链接查看: Redis系列(一):Redis简介及环境安装 Redis系列(二):...
    99+
    2019-07-09
    Redis系列(六):设置/移除键的过期时间
  • redis怎么设置哈希过期
    在Redis中,可以通过使用`EXPIRE`命令设置哈希过期时间。该命令接受两个参数,第一个参数是哈希的键名,第二个参数是过期时间(...
    99+
    2023-09-01
    redis
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作