1、在 Postman 中 POST:http://api.pcs-api.localhost/v1/mobile/rtcs/invite-accept ,将 Body 中的数据以数组的格式写入 Redis 缓存中,如图1
2、每一次请求时,Body 中的数据会发生变化,其程序中的实现逻辑如下:
RTC 邀请接受通话:/mobile/rtcs/invite-accept ( mobile/rtc/invite-accept ) 1、请求参数列表 ( 1 ) user_name:必填,用户名称 ( 2 ) call_mode:必填,通话方式,voice_call:语音通话;video_call:视频通话 2、输入数据验证规则 ( 1 ) 必填:user_name、call_mode ( 2 ) 字符串:user_name、call_mode ( 3 ) 范围([voice_call, video_call]):call_mode ( 4 ) 判断房间是否存在,是:响应失败 3、操作数据 ( 1 ) 设置RTC 邀请接受通话数据的缓存键 ( 2 ) 从缓存中取回RTC 邀请接受通话数据 A、如果不存在,则序列化,将RTC 邀请接受通话数据存放到缓存供下次使用,在缓存中永久保留 B、如果存在,则反序列化,带索引检查计算数组的差集,如果差集不为空,将RTC 邀请接受通话数据存放到缓存供下次使用,在缓存中永久保留
3、带索引检查计算数组的差集,以对比数组是否相等。由于 Body 中的数据经过了严格的验证,因此,可以确保 Body 中的数据仅会小于等于缓存中的数据。代码实现如下:
// 设置RTC 邀请接受通话数据的缓存键
$redisCache = Yii::$app->redisCache;
$gisRtcInviteAcceptCacheKey = implode(':', ['gis', 'rtc', 'invite', 'accept', $identity->group_id]);
// 从缓存中取回RTC 邀请接受通话数据
$gisRtcInviteAcceptCacheData = $redisCache[$gisRtcInviteAcceptCacheKey];
$requestGisRtcInviteAccept = [
'user_name' => $user_name,
'call_mode' => $call_mode,
];
if ($gisRtcInviteAcceptCacheData === false) {
// 将RTC 邀请接受通话数据存放到缓存供下次使用,在缓存中永久保留
$redisCache->set($gisRtcInviteAcceptCacheKey, serialize($requestGisRtcInviteAccept));
} else {
$gisRtcInviteAccept = unserialize($gisRtcInviteAcceptCacheData);
// 带索引检查计算数组的差集
$result = array_diff_assoc($gisRtcInviteAccept, $requestGisRtcInviteAccept);
if (!empty($result)) {
// 将RTC 邀请接受通话数据存放到缓存供下次使用,在缓存中永久保留
$redisCache->set($gisRtcInviteAcceptCacheKey, serialize($requestGisRtcInviteAccept));
}
}
4、array_diff_assoc() 返回一个数组,该数组包括了所有在 array1 中但是不在任何其它参数数组中的值。注意和 array_diff() 不同的是键名也用于比较。分别打印缓存中的数组、Body 中的请求数据、带索引检查计算数组的差集。符合预期。仅当 带索引检查计算数组的差集 不为空时,才重新设置覆盖缓存中的数据。
$gisRtcInviteAccept
Array
(
[user_name] => huaqiyun
[call_mode] => voice_call
)
{
"user_name": "huaqiyun1",
"call_mode": "voice_call"
}
array(1) {
["user_name"]=>
string(8) "huaqiyun"
}
$gisRtcInviteAccept
Array
(
[user_name] => huaqiyun
[call_mode] => voice_call
)
{
"user_name": "huaqiyun",
"call_mode": "video_call"
}
array(1) {
["call_mode"]=>
string(10) "voice_call"
}
$gisRtcInviteAccept
Array
(
[user_name] => huaqiyun
[call_mode] => voice_call
)
{
"user_name": "huaqiyun2",
"call_mode": "video_call"
}
array(2) {
["user_name"]=>
string(8) "huaqiyun"
["call_mode"]=>
string(10) "voice_call"
}
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/tech/pnotes/250537.html
