`
san_yun
  • 浏览: 2639490 次
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

使用memcache实现高并发计数器

 
阅读更多
在网站中很多场景都有计数的需求,比如找回密码要求一天只能找回10次。如果并发量比较高会导致数据库频繁的更新和查询,可以使用memcached来实现计数器,代码很简单:

使用2个memcache,一个用于存储增加的计数器,另一个用于上锁。锁有时间限制,如果未到期,那么就更新memcache里的计数器;如果到期,就创建一个新锁,并把memcache里的值增加到数据库里,并删除现有的memcache里的计数器。

实现代码如下:
def incrementCounter(key, update_interval=10):
  """Increments a memcached counter.
  Args:
    key: 数据库里计数器实体的key.
    update_interval: 更新频率.
  """
  lock_key = "counter_lock:%s" % key
  count_key = "counter_value:%s" % key
  if memcache.add(lock_key, None, time=update_interval):
    count = int(memcache.get(count_key) or 0) + 1
    def tx():
      entity = db.get(key)
      entity.counter += count
      entity.put()
    db.run_in_transaction(tx)
    memcache.delete(count_key)
  else:
    memcache.incr(count_key, initial_value=0)



注意那个memcache.add函数,如果未到期,那么加锁失败,直接增加memcache的值;如果到期,那么加锁成功,更新memcache到datastore。

这种方法可能存在这些缺陷:

    如果计数频率太低,会导致memcache几乎没用,每次都得更新数据库。这比直接访问数据库多用了3次memcache操作。
    如果memcache里的计数器过期,那就会丢失更新间隔内的计数值。但一般是计算频率过低导致的,而频率越低,丢失的计数值就越小。
    需要真正的计数值时,需要同时访问datastore和memcache。
    在更新数据库和删除memcache里的计数器时存在不同步,可能丢失计数值。解决办法是把delete函数改成decr函数,剪掉之前获取的计数值即可。不过这样就会长期占用memcache了。

实际上如果memcache能提供一个失效事件,每次失效时自动更新到数据库,将会是个很不错的特性。
分享到:
评论

相关推荐

    memcache实现网站全局计数器

    2. **分桶计数**:在高并发场景下,为了避免单个计数器的性能瓶颈,可以使用多个计数器(分桶),每个桶负责一部分流量,定期进行汇总。 3. **持久化**:虽然Memcached数据存储在内存中,但可以通过定期将计数器数据...

    memcache1.2.1 for windows

    Memcache是一个广泛使用的开源高性能分布式内存对象缓存系统,它能够通过在内存中存储数据来减少对数据库的访问,从而提高Web应用的性能。 描述中的"windows下memcache安装包 附带php扩展包"揭示了这个压缩包不仅...

    MemCache和Redis缓存介绍

    它通过将数据存储在内存中,实现快速读取,适用于处理大量数据的高并发场景。 2. **工作原理**:MemCache基于键值对(key-value)存储,将数据以键的形式映射到内存中的值。当应用程序需要数据时,首先查询MemCache...

    memcache

    - **计数器:** 对于博客的阅读次数、评论数量等,使用`increment()`或`decrement()`进行原子操作,避免并发问题。 4. **优化与注意事项** - **过期策略:** 数据过期后,Memcache不会自动清理,而是等待下次访问时...

    大数据应用案例 大数据培训视频教程-大数据高并发架构实战案例.docx

    本课程主要针对的是Java开发人员,旨在通过实例教学来探讨如何构建高并发、大数据量的网站平台。课程由经验丰富的讲师Tom5授课,涵盖了多种关键技术和实战案例,以帮助学员快速掌握千万级高并发大数据网站的搭建。 ...

    PyPI 官网下载 | nexus-memcache-0.3.6.tar.gz

    在高并发场景下,为了避免竞态条件,通常会采用“写穿透”或者“写绕过”策略,确保数据的一致性。nexus-memcache库的使用可以灵活地调整这些策略,以适应不同的业务需求。 此外,为了提高缓存的可用性,nexus-...

    PHP使用memcache缓存技术提高响应速度的方法

    第二个示例展示了如何使用memcache进行计数器操作,通过获取、递增并设置'pid'键的值,实现了一个简单的计数器。 **四、memcache的优势** 1. **高速度**:由于数据存储在内存中,访问速度极快。 2. **分布式**:...

    阿里云 专有云企业版 V3.9.0 云数据库 Memcache 版 技术白皮书 20191017.pdf

    - **计数器服务**:在高并发环境下,用于统计访问量、点赞数等。 3. **技术特性** - **高可用性**:通过集群化部署,确保服务的稳定性和数据的可靠性。 - **弹性扩展**:根据业务需求,无缝调整内存容量,支持...

    数据库缓存扩展

    总的来说,Memcache.dll 5.3.5是PHP开发者提升网站性能的重要工具,尤其在高并发、大数据量的场景下,它的引入可以显著降低数据库的压力,提升用户体验。正确安装和配置这个扩展,对于任何依赖数据库的PHP应用来说都...

    PHP MemCached 高级缓存应用代码

    其工作原理是将数据存储在内存中,提供快速的数据访问速度,尤其是在高并发场景下,能够显著提升系统的响应能力。 ### PHP Memcached 高级缓存应用代码解析 #### Memcached类方法详解 在PHP中,`Memcache`类提供...

    PHP数据库操作二:memcache用法分析

    在开发高并发的Web应用程序时,数据库的存取效率是性能的关键因素。当访问量过大,数据库成为瓶颈时,可能导致系统崩溃。为了解决这个问题,可以采用缓存技术,比如memcache。memcache是一个高性能的分布式内存对象...

    全面解析PHP操作Memcache基本函数

    5. **Memcache::decrement()**: 减少指定键的数值,通常用于计数器。 6. **Memcache::delete()**: 删除缓存中指定的键,从而移除对应的数据。 7. **Memcache::flush()**: 清空整个缓存,删除所有已存储的键值对。 ...

    Redis和Memcache对比与如何选择

    然而,Memcache 可以利用多个核心,通过一个可执行文件和一个TCP端口实现更高的并发性能。当涉及到大数据值(如100k及以上)时,Memcache 通常表现得更快。尽管 Redis 已经对大数据处理进行了优化,但在这种特定场景...

    no关系型数据库,nosql

    NoSQL,全称为“Not Only SQL”,是一种非关系型数据库技术,主要针对大规模数据分布式存储、高并发读写、实时性需求以及对海量数据高效存储和访问的需求。NoSQL数据库的特点在于它们通常不遵循传统的ACID(原子性、...

    分布式数据库面试专题系列:Memcached+Redis+MongoDB-06.rar

    支持多线程并发访问。 - **应用场景**:适合短期缓存,如会话存储,减少对数据库的频繁读写。 - **面试题**:如何解决Memcached的单点故障问题?Memcached如何进行数据备份? 2. **Redis**: - **简介**:Redis...

    Redis面试知识点.pdf

    - **计数器**:使用原子增减操作实现计数器功能。 - **排行榜**:使用Sorted Set实现排名功能。 #### 37、假如Redis里面有1亿个key,其中有10w个key是以某个固定的已知的前缀开头的,如果将它们全部找出来? 使用`...

    开发文档 memcached的基本命令

    Memcached是一款高性能的分布式内存对象缓存系统,通过减轻数据库负载来加速动态Web应用,提升网站访问速度。本文将深入解析memcached的基本命令,涵盖其安装、配置、启动及数据管理等方面,旨在为用户提供全面的...

Global site tag (gtag.js) - Google Analytics