redis、memache 乐观锁和进程

来源:互联网 发布:gis地图数据 编辑:程序博客网 时间:2024/05/20 06:27

Memcached乐观锁

Memcached提供了2个命令 gets + cas。gets取出数据的时候,同时返回版本号;修改之后, cas回去的时候,会比较该版本号和服务器上最新的版本号。如果不等,则cas失败。

Redis乐观锁

Redis提供了watch命令,如下所示:

    watch  key1   //修改数据之前,执行watch,意思监听此key    multi    set key1  foo  //如果别的客户端在此期间修改了该key1,此处更新将失败    exec 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

方案3 – Redis事务

Redis也提供了事务的概念,但它不能回滚。如果1条命令执行错误,会继续执行下面的。

      multi      get foo      ...      incr foo      exec
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

此处的multi/extc,类似Mysql中的beganTransaction/endTransaction。 
另外,由于redis是单线程的,因此事务里面的多条语句执行时,不会被打断。

Memcached的多线程 vs. Redis单线程

我们都知道, Memcached内部是多线程的,而Redis是单线程的。多线程好理解,但Redis为什么要搞成单线程呢? 
个人认为,有以下几个原因: 
(1)redis有各种复杂的数据结构list, has, set。也就是说,对于一个(key, value),value的类型可以是list, hash, set。在实际应用场景中,很容易出现多个客户端对同一个key的这个复杂的value数据结构进行并发操作,如果是多线程,势必要引入锁,而锁却是性能杀手。 
相比较而言,memcached只有简单的get/set/add操作,没有复杂数据结构,在互斥这个问题上,没有redis那么严重。

(2)对于纯内存操作来说,cpu并不是瓶颈,瓶颈在网络IO上。所以即使单线程,也很快。另外,如果要利用多核的优势,可以在一个机器上开多个redis实例。

0 0
原创粉丝点击