假如单台redis的单key并发在2万,如何提高到4万。
慢着,加机器只能解决读,写好像并没有软用。
假设库存有100,为了提高并发,
分成5个key
后台有个调度系统,来平衡数据。好像还有问题。
如果还剩一个库存,如何搞?如果有2个key分别有一个,我要买2个如何搞?
其实这个是根据业务来的,按照上图,前端应该展示20个库存。这个方案主要是针对解决高并发来。如果针对与一次买非常多的场景的时候,就不存在高并发。
原理很简单,set 一个 锁-key,如果成功则说明加锁成功,反之则失败。
为了确保分布式锁可用,我们至少要确保锁的实现同时满足以下几个条件:
基于以上条件,采用set扩展参数,保证原子性 *** 作: SET lock-key "lock-client" EX 10086 NX
lock-key "lock-client" 指定 加锁client,解锁时用于判断。
EX 10010 指定过期时间
NX 只在键不存在时,才对键进行设置 *** 作。效果等同于 SETNX 命令。
只不过早期版本redis不支持set的扩展参数,这就需要用到 lua 脚本了 。
加锁可以在高版本借助set命令实现原子 *** 作,但解锁就不可以了,依然得用到lua脚本。
Redis在26版本推出了 lua 脚本功能,允许开发者使用Lua语言编写脚本传到Redis中执行。使用脚本的好处如下:
需要在获得 lock-key 后判断加锁对象是否为当前client,是,则解锁。Lua 脚本如下:
if rediscall('get', KEYS[1]) == ARGV[1] then return rediscall('del', KEYS[1]) else return 0 end
执行方式:eval;
eval 参数列表: eval lua-script key-num [key1 key2 key3 ] [value1 value2 value3 ] ,参数解析:
eval执行示例: eval "rediscall('set',KEYS[1],ARGV[1])" 1 lua-key lua-val ;
完整解锁执行脚本:
eval "if rediscall('get', KEYS[1]) == ARGV[1] then return rediscall('del', KEYS[1]) else return 0 end" 1 lock-key client-val
----------End----------
可以将超时时间设置的长一些,不过不可取修改配置文件 降低空闲连接断开的时长,增加同一时间最大客户端连接数
也可以增加slave节点数量,创建基于分布式的redis连接池。能有效减轻redis服务器压力
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)