redis单key如何提高并发

redis单key如何提高并发,第1张

问题:
假如单台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服务器压力


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/dianzi/13313940.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-07-13
下一篇 2023-07-13

发表评论

登录后才能评论

评论列表(0条)

保存