V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
TIGERB
V2EX  ›  PHP

redis 五种常见使用场景下 PHP 实战

  •  4
     
  •   TIGERB · 2017-02-19 21:30:41 +08:00 · 7911 次点击
    这是一个创建于 2838 天前的主题,其中的信息可能已经有所发展或是发生改变。

    前言

    redis 等 nosql 简单高效的解决了高并发场景下的一系列问题,并很大程度的解放了持久化 DB 的业务压力。

    实战

    测试用例

    5 种使用场景都提供测试用例,使用方法:

    • 克隆项目: git clone [email protected]:TIGERB/easy-tips.git
    • 运行脚本: php redis/test.php [实例名称], 例如测试悲观锁: 运行 php redis/test.php p-lock
    运行结果:
    
    执行 count 加 1 操作~ 
    
    count 值为: 1
    
    运行 php redis/test.php 获取参数列表
    
    参数列表:
    
    参数有误,正确示例: php redis/test.php p-lock 
    ====================================== 
    参数列表: 
    Array
    (
        [缓存] => cache
        [队列] => queue
        [悲观锁] => p-lock
        [乐观锁] => o-lock
        [消息订阅 /推送] => Array
            (
                [订阅] => sub
                [推送] => pub
            )
    
    )
    
    

    源码

    源码地址 https://github.com/TIGERB/easy-tips

    这是我的一个关于《一个 php 技术栈后端猿的知识储备大纲》的知识总结,目前只完成了“设计模式”。

    纠错

    如果大家发现有什么不对的地方,可以发起一个issue或者pull request,我会及时纠正, THX ~

    补充:发起 pull request 的 commit message 请参考文章Commit message 编写指南

    第 1 条附言  ·  2017-02-20 13:41:25 +08:00
    纠正 标题《 redis 五种常见使用场景下 PHP 实战》



    《 redis 五种常见使用场景下 PHP 实现》
    20 条回复    2018-12-14 13:04:16 +08:00
    ydxred
        1
    ydxred  
       2017-02-19 21:37:05 +08:00   ❤️ 1
    前排...
    ersic
        2
    ersic  
       2017-02-19 21:57:37 +08:00 via Android   ❤️ 1
    收藏待看
    zonghua
        3
    zonghua  
       2017-02-20 00:25:28 +08:00 via iPhone   ❤️ 1
    PHP 都这么多花样了
    Lucups
        4
    Lucups  
       2017-02-20 00:27:49 +08:00   ❤️ 2
    恕我直言,这真的不是实战。。。
    实战应该有具体的业务场景。
    改为示例更为稳妥。
    quericy
        5
    quericy  
       2017-02-20 00:35:30 +08:00   ❤️ 1
    https://github.com/TIGERB/easy-tips/blob/master/redis/pessmistic-lock.php#L30

    这里抢锁的时候是不是应该设置为$microtimeout 而不是$microtime ?
    TIGERB
        6
    TIGERB  
    OP
       2017-02-20 08:39:58 +08:00
    @Lucups 没毛病~ thx~
    TIGERB
        7
    TIGERB  
    OP
       2017-02-20 08:41:20 +08:00
    @quericy 我看看, thx~
    torbrowserbridge
        8
    torbrowserbridge  
       2017-02-20 09:09:15 +08:00
    没有异常捕获,没有返回值判断,不及格
    baoguok
        9
    baoguok  
       2017-02-20 09:56:23 +08:00
    感谢分享
    TIGERB
        10
    TIGERB  
    OP
       2017-02-20 10:03:34 +08:00
    @torbrowserbridge 哈哈~ 批评的好,受教了~

    thx~
    TIGERB
        11
    TIGERB  
    OP
       2017-02-20 10:03:51 +08:00
    @baoguok 互相学习~ thx~
    TIGERB
        12
    TIGERB  
    OP
       2017-02-20 10:13:59 +08:00
    @quericy 已纠正, thx~
    Patrick95
        13
    Patrick95  
       2017-02-20 10:19:10 +08:00
    虽然不是真正意义的实战,但足够用来学习了!
    mcfog
        14
    mcfog  
       2017-02-20 12:19:18 +08:00
    关于 redis 锁,分布式建议看 redlock https://redis.io/topics/distlock ,而单机锁参考 https://redis.io/commands/set 的后半部分

    使用 PHP 本地时间的话,如果 PHP 有多台机器会乱
    Jeremial
        15
    Jeremial  
       2017-02-20 12:53:48 +08:00
    iyaozhen
        16
    iyaozhen  
       2017-02-20 13:16:14 +08:00
    1. 不和别的系统共享缓存的话,序列化使用原生的 serialization 是否更好?
    2. list 做队列有个问题,当数据量很大的时候(消费速度赶不上生产速度) redis 会蹦,而且原生不支持分布式,扩展性较差。 PHP 原生支持异步回调不是太好,不然使用 BRPOP 指令消费更加合适,使用 RPOP 的话相当于轮训了
    3. 演示发布订阅的话,是不是多启动几个订阅者更加好,体现广播的效果
    TIGERB
        17
    TIGERB  
    OP
       2017-02-20 13:34:19 +08:00
    @iyaozhen
    @mcfog 好的,认真学习下,非常感谢~
    changwei
        18
    changwei  
       2017-02-20 22:11:09 +08:00
    segmentfault 上经常看见楼主,哈哈
    TIGERB
        19
    TIGERB  
    OP
       2017-02-20 22:13:37 +08:00
    @changwei 哈哈~
    geekbin
        20
    geekbin  
       2018-12-14 13:04:16 +08:00
    @TIGERB 悲观所中的「$microtimeout = $microtime+$timeout+1;」为啥要加 1 秒,不是有之前的 5 秒超时了吗?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   6000 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 02:13 · PVG 10:13 · LAX 18:13 · JFK 21:13
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.