这里主要讨论解决Redis Cluster集群环境下的高并发问题.
问题
Redis的命令是串行执行的,但是在集群环境下命令的顺序是不能保证的,不同线程之间对同一个KEY的操作会有嵌套,造成数据不准确.
如果是Redis服务器是不是集群,则可以使用Multi,Exec,Watch的命令组合来解决原子性问题.
同时也可以根据业务情况独立一个Redis服务器,使用Multi,Exec,Watch来解决该问题(这也不失一种解决方案,毕竟分布式锁更消耗性能cuiyaonan2000@163.com)
解决方法1
Redis引入了Lua脚本.
可以使用Lua脚本把一些简单的逻辑操作和Redis操作放在一起,作为一个整体传递给Redis服务器依次执行.cuiyaonan2000@163.com
Lua
Lua 是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放, 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。
Lua 是巴西里约热内卢天主教大学(Pontifical Catholic University of Rio de Janeiro)里的一个研究小组于 1993 年开发的,该小组成员有:Roberto Ierusalimschy、Waldemar Celes 和 Luiz Henrique de Figueiredo。
Lua特性- 轻量级: 它用标准C语言编写并以源代码形式开放,编译后仅仅一百余K,可以很方便的嵌入别的程序里。
- 可扩展: Lua提供了非常易于使用的扩展接口和机制:由宿主语言(通常是C或C++)提供这些功能,Lua可以使用它们,就像是本来就内置的功能一样。
- 其它特性:
- 支持面向过程编程和函数式编程;
- 自动内存管理;只提供了一种通用类型的表(table),用它可以实现数组,哈希表,集合,对象;
- 语言内置模式匹配;闭包(closure);函数也可以看做一个值;提供多线程(协同进程,并非操作系统所支持的线程)支持;
- 通过闭包和table可以很方便地支持面向对象编程所需要的一些关键机制,比如数据抽象,虚函数,继承和重载等。
lua的程序有点像存储过程,存储在redis上,来提高服务的整体效率cuiyaonan2000@163.com.
- 减少网络开销: 即将多个命令整合到一起传递给Redis服务器
- 原子操作:多个命令在Redis服务器上是串行执行,不会受到其它线程的影响.
- 复用性:客户端发送的脚本会永久存在redis中,这样其他客户端可以复用这一脚本,而不需要使用代码完成相同的逻辑。
解决方法2
分布式锁