V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  lolizeppelin  ›  全部回复第 49 页 / 共 49 页
回复总数  968
1 ... 40  41  42  43  44  45  46  47  48  49  
2017-07-17 18:14:51 +08:00
回复了 EchoUtopia 创建的主题 程序员 redis 实现的一个锁有问题,求大神帮忙看看
这个只要服务端支持就可以
新版的 python-redis 支持
旧版的 python 的 redis 客户端不支持可以自己封装
python-redis 的源码很简单的,怎么封装自己过一便
话说你们连 python-redis 的源码都没看过?

能一次操作当然要一次做,你先 set 在 expire 分成了两次通信
间隔较大的情况下你 expire 失败了回头删 key 搞不好就不是你设置的 key 了

而且还影响性能
本来你这个需求(用于约束用户 id )就会有不小的性能问题,还分两次问题更加多

顺便,楼上也有人提到了,约束用户 id 不应该用锁来实现
如果只是想唯一 key 的话,比较好的做法是程序那边实现一个类似 Snowflake 的唯一主键生成即可
比用 redis 队列 mysql 字段来弄这性能好多了

我那玩意是写给我的运维管理工具用的,算是写着玩的,不要拿去直接用,有问题不负责 233
2017-07-17 17:08:47 +08:00
回复了 EchoUtopia 创建的主题 程序员 redis 实现的一个锁有问题,求大神帮忙看看
1. setnx key 用很短的 ttl 比如 1.5s value 为相关的 id,
用这个 ttl 是因为我的锁是有层级的,设置多个 key 中途会超时
这特短时间的 ttl 能有效释放已经锁住的上层

2. set 成功后,添加一个定时器,定时器触发时间是外部的锁定时间,到时触发删除 key 并通知超时
3. 延长这个 key 的生存时间为 外部所用锁定时间

锁删除之前,先校验 value
这是我的锁的做法


---
如果只要简单的原子锁,set 直接用
set(key, value, px=int(timeout)+3, nx=True)
来设置时间不就好了

不要先 setnx 再 expire
2017-07-17 16:39:25 +08:00
回复了 EchoUtopia 创建的主题 程序员 redis 实现的一个锁有问题,求大神帮忙看看
我的做法是 第一次 set 的时候只有一个很短的 ttl
成功后在延长这个 key 的生存时间为需要锁定的时间
2017-07-17 16:36:52 +08:00
回复了 EchoUtopia 创建的主题 程序员 redis 实现的一个锁有问题,求大神帮忙看看
我代码都是基于协程的, 不折腾多线程
2017-07-17 16:36:14 +08:00
回复了 EchoUtopia 创建的主题 程序员 redis 实现的一个锁有问题,求大神帮忙看看
运维先学 2 就好
运维可以参考的最好的运维管理框架就是 openstack
抄会 openstack 的代码就能上一大台阶,估计能吊打不少 python 开发

openstack 目前是 2 的,有转 3 的趋势
等 openstack 转 3 了跟着就是.....
可以参考 openstack 的 web 服务怎么写的
2017-07-12 18:26:06 +08:00
回复了 nyaruko 创建的主题 Python Flask 使用过程中的一个问题
close fds 正解

或者 fork 后手动关闭 socket 的 fd

或者 fnctl 对端口 fd 设置标记


这些都是 python 以外的只是
算 Linux 程序开发的基本知识
1 ... 40  41  42  43  44  45  46  47  48  49  
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2319 人在线   最高记录 6543   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 23ms · UTC 03:24 · PVG 11:24 · LAX 20:24 · JFK 23:24
Developed with CodeLauncher
♥ Do have faith in what you're doing.