在 PHP 7.4 中,带索引检查计算数组的差集,以对比 Body 中的请求参数与缓存中的数组是否相等
1、在 Postman 中 POST:http://api.pcs-api.localhost/v1/mobile/rtcs/invite-accept ,将 Body 中的数据以数组的格式写入 Redis 缓存中,如图1
2、每一次请求时,Body 中的数据会发生变化,其程序中的实现逻辑如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | 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 中的数据仅会小于等于缓存中的数据。代码实现如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | // 设置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 中的请求数据、带索引检查计算数组的差集。符合预期。仅当 带索引检查计算数组的差集 不为空时,才重新设置覆盖缓存中的数据。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 | $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" } |
近期评论