我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Redis怎么批量设置过期时间

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Redis怎么批量设置过期时间

这篇文章将为大家详细讲解有关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怎么批量设置过期时间”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Redis怎么批量设置过期时间

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

下载Word文档

猜你喜欢

Redis怎么批量设置过期时间

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

redis如何批量设置过期时间

在Redis中,可以使用EXPIRE命令来为多个key设置过期时间,例如:EXPIRE key1 10EXPIRE key2 20EXPIRE key3 30这将分别为key1、key2和key3设置过期时间为10秒、20秒和30秒。
redis如何批量设置过期时间
2024-04-09

redis怎么设置过期时间

redis中的过期时间自动删除超过生命周期的键,可有效缓存短暂有效期的数据。设置过期时间有两种方法:1. expire命令,设置过期时间(秒);2. pexpire命令,设置过期时间(毫秒)。可通过ttl命令查询过期时间,返回剩余过期时间(
redis怎么设置过期时间
2024-05-21

redis在java怎么设置过期时间

本篇文章详细介绍了在Java中使用Jedis和Lettuce库为Redis键设置过期时间的方法。过期时间的单位可以是秒、毫秒、微秒或毫微秒。过期时间可以覆盖现有过期时间,并可以近似获取键的剩余生存时间。除了上述方法,还可以使用PEXPIRE、PEXPIREAT和PXAT命令设置过期时间。
redis在java怎么设置过期时间
2024-04-02

Redis怎么设置键的过期时间

在Redis中,可以使用EXPIRE命令或者SET命令的EX参数来设置键的过期时间。使用EXPIRE命令:EXPIRE key seconds其中,key是要设置过期时间的键名,seconds是过期的秒数。例如,要让键mykey在60秒
Redis怎么设置键的过期时间
2024-05-07

redis怎么设置默认的过期时间

在Redis中,可以使用`EXPIRE`命令设置键的过期时间。但是,如果你想要为所有键设置一个默认的过期时间,可以使用Redis的`CONFIG`命令来修改`timeout`属性。下面是设置默认过期时间的步骤:1. 使用`CONFIG GE
2023-09-06

Redis设置key的过期时间

本文主要介绍了Redis设置key的过期时间,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
2023-01-28

java如何设置redis过期时间

如何设置Redis过期时间(Java版)本文详细介绍了使用Java在Redis中设置过期时间的方法,包括EXPIRE、EXPIREAT、SETEX、PSETEX和PERSIST命令。还提供了最佳实践建议,例如根据键值对访问频率设置过期时间、使用SCAN命令删除过期键值对以及使用Redis的过期策略功能。
java如何设置redis过期时间
2024-04-02

redis如何设置不过期时间

在 Redis 中设置键不过期的方法有两种:1. 不设置过期时间:在设置键时,不指定过期时间参数即可。例如使用 `SET key value` 命令设置键值对,该键就不会设置过期时间。2. 使用持久化方法:通过持久化方式将数据保存在磁盘中,
2023-09-05

php redis如何设置过期时间

本文将为大家详细介绍“php redis如何设置过期时间”,内容步骤清晰详细,细节处理妥当,而小编每天都会更新不同的知识点,希望这篇“php redis如何设置过期时间”能够给你意想不到的收获,请大家跟着小编的思路慢慢深入,具体内容如下,一
2023-06-06

redis注解设置缓存过期时间

如何在使用 redis 注解时设置缓存过期时间?导入 redis 依赖项。使用 @cacheable 和 @cacheput 注解的 ttl 属性。ttl 属性指定缓存的过期时间,单位为秒。Redis 注解设置缓存过期时间问题:如何在使用
redis注解设置缓存过期时间
2024-04-19

redis缓存过期时间如何设置

在Redis中,可以通过使用EXPIRE命令来设置缓存的过期时间。语法如下:```EXPIRE key seconds```其中,key表示要设置过期时间的缓存键,seconds表示过期时间,以秒为单位。当缓存键的过期时间到达指定时间后,R
2023-08-30

如何在Redis中设置过期时间

在Redis中设置过期时间可以使用EXPIRE命令或者EXPIREAT命令。使用EXPIRE命令设置过期时间:EXPIRE key seconds其中,key是要设置过期时间的键名,seconds是过期时间,单位是秒。例如,设置键名为myk
如何在Redis中设置过期时间
2024-04-09

如何为redis设置缓存过期时间

你可以使用EXPIRE命令来为Redis设置缓存过期时间。下面是设置缓存过期时间的步骤:1. 使用EXPIRE命令设置缓存的过期时间。该命令的语法如下:```EXPIRE key seconds```其中,`key`是你要设置过期时间的缓存
2023-09-11

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录