为了账号安全,请及时绑定邮箱和手机立即绑定

thinkphp商城如何处理高并发,怎么使用memcache做缓存

thinkphp商城如何处理高并发,怎么使用memcache做缓存

波斯汪 2019-05-31 07:02:46
thinkphp商城如何处理高并发,怎么使用memcache做缓存
查看完整描述

3 回答

?
宝慕林4294392

TA贡献2021条经验 获得超8个赞


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

ThinkPHP其实并不支持分布式缓存功能,这可以从官方提供的CacheMemcache.class.php文件中看到:

if(empty($options)) {

  $options = array

  (

    'host' => '127.0.0.1',

    'port' => 11211,

    'timeout' => false,

    'persistent' => false

  );

}

$func = $options['persistent'] ? 'pconnect' : 'connect';

$this->expire = isset($options['expire'])?$options['expire']:C('DATA_CACHE_TIME');

$this->handler = new Memcache;

$this->connected = $options['timeout'] === false ?

$this->handler->$func($options['host'], $options['port']) :

$this->handler->$func($options['host'], $options['port'], $options['timeout']);

    

不过不要紧,稍微修改下就行了,即

    

if(empty($options)) {

  $options = array

  (

    'timeout' => false,

    'persistent' => false,

    'servers'=>array(

      array('ip'=>'127.0.0.1','port'=>11211),

      array('ip'=>'127.0.0.1','port'=>11212),

      array('ip'=>'202.116.32.4','port'=>11211),

    ),

  );

}

//分布式处理函数

$func="addServer";

$this->expire = isset($options['expire'])?$options['expire']:C('DATA_CACHE_TIME');

$this->handler = new Memcache;

if($options['timeout']===false)

{

  foreach($options['servers'] as $server)

  {

    $this->handler->$func($server['ip'],$server['port']);

  }

}

    

闲来无事,于是就在本机上启动了两个MemCache服务器,顺手编写了一段简单的监控代码(隔一段时间自动刷新一次),进行测试。如果发现服务器运行不正常,则使用PhpMailer自动发送一封Email到管理员邮箱。测试结果表明,两台Memcache服务器均工作正常,而另外一台虚假的服务器当然是无法连接到的。


 



查看完整回答
反对 回复 2019-06-01
?
白猪掌柜的

TA贡献1893条经验 获得超10个赞

所有的被发送到memcached的单个命令是完全原子的。如果您针对同一份数据同时发送了一个set命令和一个get命令,它们不会影响对方。它们将被串行化、先后执行。即使在多线程模式,所有的命令都是原子的,除非程序有bug:)
命令序列不是原子的。如果您通过get命令获取了一个item,修改了它,然后想把它set回memcached,我们不保证这个item没有被其他进程(process,未必是操作系统中的进程)操作过。在并发的情况下,您也可能覆写了一个被其他进程set的item。

memcached
1.2.5以及更高版本,提供了gets和cas命令,它们可以解决上面的问题。如果您使用gets命令查询某个key的item,memcached会
给您返回该item当前值的唯一标识。如果您覆写了这个item并想把它写回到memcached中,您可以通过cas命令把那个唯一标识一起发送给
memcached。如果该item存放在memcached中的唯一标识与您提供的一致,您的写操作将会成功。如果另一个进程在这期间也修改了这个
item,那么该item存放在memcached中的唯一标识将会改变,您的写操作就会失败。





查看完整回答
反对 回复 2019-06-01
?
繁星coding

TA贡献1797条经验 获得超4个赞

thinkphp 本身并没有进行高并发处理的功能

高并发 的先要知道你自己做的东西哪里并发高

thinkphp 内置很多第三方的内存缓存类,你只要把redis memcache memcached这些缓存安装上,用内存缓存可以缓解高并发。只是缓解并不能完全解决。
高并发要想说可以写一本书了 ,不是thinkphp能解决的问题



查看完整回答
反对 回复 2019-06-01
  • 3 回答
  • 0 关注
  • 920 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信