资讯专栏INFORMATION COLUMN

Redis在Php项目中的实际应用场景

Blackjun / 1642人阅读

摘要:前言一些案例中有的同学说为什么不可以用类型,类型完全可以实现呀我建议你看下我的专栏文章高级用法里面介绍了用类型的好处商品维度计数对商品喜欢数,评论数,鉴定数,浏览数进行计数说起电商,肯定离不开商品,而附带商品有各种计数喜欢数,评论数,鉴定数

前言

一些案例中有的同学说为什么不可以用string类型,string类型完全可以实现呀

我建议你看下我的专栏文章《Redis高级用法》,里面介绍了用hash类型的好处

商品维度计数

对商品喜欢数,评论数,鉴定数,浏览数进行计数
说起电商,肯定离不开商品,而附带商品有各种计数(喜欢数,评论数,鉴定数,浏览数,etc)
Redis的命令都是原子性的,你可以轻松地利用INCR,DECR等命令来计数。

采用Redis 的类型: Hash. 如果你对redis数据类型不太熟悉,可以参考
http://redis.io/topics/data-types-intro

为product定义个key product:,为每种数值定义hashkey, 譬如喜欢数like_num

$redis->hSet("product:123", "like_num ", 5);  // 添加 id为123的商品 like_num 为5
 
$redis->hIncrBy("product:123", "like_num ", 1);  // 添加 id为123的商品like_num +1

$redis->hGetAll("product:123"); // 获取id为123的商品相关信息
                                   array("like_num "=> 1)
用户维度计数

对用户动态数、关注数、粉丝数、喜欢商品数、发帖数等计数
用户维度计数同商品维度计数都采用 Hash. 为User定义个key 为 user:
为每种数值定义hashkey, 譬如关注数follow

$redis->hSet("user:100000", "follow ", 5);  // 添加uid为10000的用户follow 为5
 
$redis->hIncrBy("user:100000", "follow ", 1);  // 更新uid为10000的用户follow +1

$redis->hGetAll("user:100000"); // 获取uid为10000的用户
                                   array("like_num "=> 1)
                                 
存储社交关系

譬如将用戶的好友/粉丝/关注,可以存在一个sorted set中,score可以是timestamp
默认集合按照score递增排序
这样求两个人的共同好友的操作,可能就只需要用求交集命令即可

$redis->zAdd("user:1000:follow", 1463557212, "1001"); 

                                #uid为1000用户关注uid为1001 , score值设定时间戳1463557212

$redis->zAdd("user:1000:follow", 1463557333, "1002"); 

$redis->zAdd("user:2000:follow", 1463577568, "1001"); 

$redis->zAdd("user:2000:follow", 1463896964, "1003");
 
                                #uid为2000用户关注1001和1003用户 , score值设定时间戳

$redis->zInter("com_fllow:1000:2000", array("user:1000:follow", "user:2000:follow")); 

        #对集合"user:1000:follow"和"user:2000:follow"取交集"com_fllow:1000:2000"
        #获得共同关注的uid 

$redis->zRange("com_fllow:1000:2000",0,-1); // 获取全部集合元素
        #array("10001","10002")
用作缓存代替memcached

应用于商品列表,评论列表,@提示列表

相对memcached 简单的key-value存储来说,redis众多的数据结构(list,set,sorted set,hash,
etc)

可以更方便cache各种业务数据,性能也不亚于memcached。

NOTE: RPUSH pagewviews.user: EXPIRE pagewviews.user: 60 //注意要update timeout
反spam系统

应用系统评论、发布商品、论坛发贴的spam控制

作为一个电商网站被各种spam攻击是少不免(垃圾评论、发布垃圾商品、广告、刷自家商品排名等)

针对这些spam制定一系列anti-spam规则,其中有些规则可以利用redis做实时分析

譬如:1分钟评论不得超过2次、5分钟评论少于5次等(更多机制/规则需要结合drools )
常规sorted set将最近一天用户操作记录起来
(为什么不全部记录?节省memory,全部操作会记录到log,后续利用hadoop进行更全面分析统计)

#获取5秒内操作记录
$res = $redis->zRangeByScore("user:1000:comment", time() - 5, time());
#判断5秒内不能评论
if (!$res) {
    $redis->zAdd("user:1000:comment", time(), "评论内容");
} else {
    echo "5秒之内不能评论";
}

#5秒内评论不得超过2次
if($redis->zRangeByScore("user:1000:comment",time()-5 ,time())==1)
echo "5秒之内不能评论2次";

#5秒内评论不得少于2次

if(count($redis->zRangeByScore("user:1000:comment",time()-5 ,time()))<2)
echo "5秒之内不能评论2次";


 
用户Timeline/Feeds

应用于关注的人、主题、品牌及专栏

redis在这边主要当作cache使用

$redis->zAdd("user:2000:feed:topic", time(), "13");
//score 为timestamp uid为2000的用户关注tid为13的topic

$redis->expire("user:2000:feed:topic",24*60*60);
#关注有效期为24小时
# ttl 30天之内按秒数计算 30天之外以timestamp为准
最新列表&排行榜

用于记录用户刚刚喜欢的商品最新列表or排行榜 等业务场景

商品最新列表-sorted set结构呈现

        $redis->zAdd("user:1000:product:like", time(), "3002");
        $redis->zAdd("user:1000:product:like", time(), "3001");
        $redis->zAdd("user:1000:product:like", time(), "3004");
        $redis->zAdd("user:1000:product:like", time(), "3003");
        
        $redis->zRange("user:1000:product:like", 0, -1,true); 
        #默认喜欢时间升序序排列
        #
            Array(
                [3002] => 1463565179
                [3001] => 1463565189
                [3004] => 1463565199
                [3003] => 1463565209
            )
        
        $redis->zRevRange("user:1000:product:like", 0, -1,true); 
        #以喜欢时间降序排列
        #
            Array
            (
                [3003] => 1463565424
                [3004] => 1463565414
                [3001] => 1463565404
                [3002] => 1463565394
            )
        

排行榜-list数据结构呈现

        $redis->lPush("user:1000:product:like", "3002");
        $redis->lPush("user:1000:product:like", "3001");
        $redis->lPush("user:1000:product:like", "3004");
        $redis->lPush("user:1000:product:like", "3003");
        
        $redis->lRange("user:1000:product:like", 0, -1);
        
        Array
        (
            [0] => 3003
            [1] => 3004
            [2] => 3001
            [3] => 3002
        )
消息通知

采用Hash结构对消息通知业务场景计数

$redis->hSet("user:1000:message:notice", "system", 1);
#设置1条未读系统消息

$redis->hIncrBy("user:1000:message:notice", "system", 1);
#未读系统消息+1

$redis->hSet("user:1000:message:notice", "comment", 1);
#设置1条未读评论

$redis->hIncrBy("user:1000:message:notice", "comment", 1);
#未读评论+1

$redis->hGetAll("user:1000:message:notice");
#查看所有消息通知数量

Array
(
    [system] => 2
    [comment] => 2
)


将Redis用作消息队列

采用Redis的List数据结构实现分布式的消息队列

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/21593.html

相关文章

  • SegmentFault 技术周刊 Vol.37 - 分布式缓存利器:Redis

    摘要:持久化到中反向代理的负载均衡基于的集群搭建如何实现从中订阅消息转发到客户端的扩展是阻塞式,使用订阅发布模式时,会导致整个进程进入阻塞。缓存是用于解决高并发场景下系统的性能及稳定性问题的银弹。 showImg(https://segmentfault.com/img/bVYE6k?w=900&h=385); Redis 是由意大利程序员 Salvatore Sanfilippo(昵称:a...

    binaryTree 评论0 收藏0
  • Docker的典型应用场景

    摘要:接下来,执行以下命令把生成的软件包从镜像中复制出来然后目录下就会有我们刚刚制作的包。多版本混合部署随着产品的不断更新换代,一台服务器上部署多个应用或者同一个应用的多个版本在企业内部非常常见。作者魏世江联合创始人,长期从事相关研发工作。 相对于VM,docker在其轻量、配置复杂度以及资源利用率方面有着明显的优势。 随着docker技术的不断成熟,越来越多的企业开始考虑通过docker来...

    anyway 评论0 收藏0
  • 「真®全栈之路」Web前端开发的后端指南

    前言 在若干次前的一场面试,面试官看我做过python爬虫/后端 的工作,顺带问了我些后端相关的问题:你觉得什么是后端? 送命题。当时脑瓦特了,答曰:逻辑处理和数据增删改查。。。 showImg(https://user-gold-cdn.xitu.io/2019/4/24/16a4ed4fc8c18078); 当场被怼得体无完肤,羞愧难当。事后再反思这问题,结合资料总结了一下。发现自己学过的Re...

    chuyao 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<