业务中有一个场景是需要记录公众号中48小时内活跃过的用户,以便我们可以给他们推送客服消息。这个适用场景如下:点击打开链接
需要记录的事件有:关注、发消息、点击菜单。所以思路就是每次用户触发这些事件的时候,微信服务器会给我们服务器发消息。这个时候可以记录当前时间,并以userId为key存储到redis中。要想在Yii框架中使用redis,需要在web.php中配置一下:
'wechat_active_time_redis' = [
'class' => 'yii\redis\Connection',
'hostname' => '127.0.0.1',
'port' => 8888,
'database' => 5,
]
下面介绍下Yii框架下要实现这个功能所要用到的redis知识。
Yii框架执行redis命令代码如下:
Yii::$app->wechat_active_time_redis->executeCommand('SET', [$user_id, time(), 'EX', 47 * 60 *60]);
redis中的命令可以在如下链接中查看:redis命令
这段代码执行的结果可以在redis中查看到:这就表明,用户id为783239的用户,在时间戳为1515565250的时间触发了这个动作。这条记录会被保存47小时。redis中记录过期后,redis会有两种清除机制。一种是主动清除,就是起一个定时任务,每十秒中扫描一次,查看是否有过期记录,如果有就删除。一种是被动清除,仅当记录被访问的时候,检查是否过期。
要获取reids中所存储的相关记录可以使用keys命令。
Yii::$app->wechat_active_time_redis->executeCommand('KEYS', ['*']);
这段代码就等于执行了如下命令:keys *
最后介绍一下hset和hget的命令:
比如:hset user 1 25, 三个参数分别为:key, field, value. 可以理解为在redis中创建了一个名字为user的hash表,hash表中存在一对键值对,key为1,value为25,在user这张hash表中可以插入多条记录,比如再执行:hset user 2 26.
同样的使用hget可以选择某个hash表中的某个字段。使用hkeys可以把某个hash表中所有的字段打印出来:
注意:hset不能针对field去设置过期时间,只能根据key,也就是说,时间到了,整个hash表都会被删除。