V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
Richard14
V2EX  ›  Python

Redis 乐观锁的实际使用场景是什么?是不是没用?

  •  1
     
  •   Richard14 · 2022-04-15 14:39:21 +08:00 · 2464 次点击
    这是一个创建于 944 天前的主题,其中的信息可能已经有所发展或是发生改变。

    如题,redis 通过 watch/multi 事务实现乐观锁,通过 setnx 实现悲观锁,大概看了看介绍感觉乐观锁没啥用啊,因为 redis 的事务只保证连续执行而不保证原子执行,事务里的操作可以有若干步成功加若干步失败同时存在,那还有啥用呢?

    个人看法下乐观锁的使用场景是,首先需要是分布节点同步状态,单节点下无需使用 redis 同步。其次该需求需要上锁,且乐观锁能解决,且乐观锁方案效率比悲观锁高。想了一圈没想出来啥场景符合上述要求。

    A. 比如一个普通的多进程同步状态需求,比如对以账号为单位对接口进行流量限制,那么统计一个账号访问过一个接口,只需要给该账号对应的 key 执行 incr 就可以表示访问次数+1 ,由于本身是原子的, 多个节点同时执行也不存在需不需要锁的问题。

    B. 再比如网上常见举例的秒杀需求,比如 10000 个线程选出 10 个秒杀成功的。只需要将 token 设为 10 ,然后每个线程里 decr 不就行了,由于 decr 返回的是执行成功后的结果,10000 个线程分别获取的值将会是 10 到-9990 ,只需要业务线程判断自己的回文是否大于 0 不就可以判断自己是否成功抢到了秒杀,同样也不需要锁。

    所以 redis 的乐观锁有啥用?

    =========================

    顺便吐槽一下 redis 在 py 的支持,官方支持搞了个同步库,既然用 redis 了肯定是注重效率的应用,搞同步是不是完全没人用。。。异步版本最近才加入,我试了半天也没试明白异步下如何成功调用 watch+multi 事务。。。

    3 条回复    2022-04-16 20:39:59 +08:00
    ipwx
        1
    ipwx  
       2022-04-15 16:15:11 +08:00
    既然用 redis 了肯定是注重效率的应用
    ----

    非也非也,可能只是不适用 DB 的场景。比如实时数据推送
    Richard14
        2
    Richard14  
    OP
       2022-04-16 15:27:16 +08:00
    @ipwx 确实。。不过就算是消息推送类应用,使用同步逻辑总归感觉是非常怪。。
    ipwx
        3
    ipwx  
       2022-04-16 20:39:59 +08:00
    @Richard14 写起来容易而已嘛( lol )
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1063 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 22:39 · PVG 06:39 · LAX 14:39 · JFK 17:39
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.