`
desert3
  • 浏览: 2158628 次
  • 性别: Icon_minigender_1
  • 来自: 合肥
社区版块
存档分类
最新评论

Play framework 1.2.3 使用缓存、Memcached集成

 
阅读更多
play框架包含一个缓存lib,这个lib是用来和Memcached集成做分布式缓存用的。

如果不配置Memcached,play框架将会使用单独的缓存(EhCache),其数据存储在JVM的堆中。把数据存储在JVM的堆中违反了play框架“不共享任何东西”的原则,这也导致了你不能把应用程序同时部署到多个机器,即不能在多个机器上负载均衡以保证应用的可用性、高性能(即使在多个机器部署了相同的应用,但是由于不同机器的JVM是相互独立的,会导致不同机器的缓存数据不同,即不同机器对同一请求的响应可能不同!不一致性!)

理解缓存的应用环境是很重要的:当你把数据放到缓存中,你不能期望数据在缓存中一直存在。实际上,你不应该这样想。缓存中存取数据很快,但是缓存是有有效期的、并且缓存数据是存放在内存中(并没有做持久化备份)。

因此最佳使用缓存的方式是当发现缓存的数据不存在时,直接从数据源重新抓取。
public static void allProducts() {
    List<Product> products = Cache.get("products", List.class);
    if(products == null) {
        products = Product.findAll();
        Cache.set("products", products, "30mn");
    }
    render(products);
}

缓存API:
play框架中的缓存类play.cache.Cache,其包含了从缓存中取值,设值,替换值的方法。
例子:
public static void showProduct(String id) {
    Product product = Cache.get("product_" + id, Product.class);
    if(product == null) {
        product = Product.findById(id);
        Cache.set("product_" + id, product, "30mn");
    }
    render(product);
}
 
public static void addProduct(String name, int price) {
    Product product = new Product(name, price);
    product.save();
    showProduct(product.id);
}
 
public static void editProduct(String id, String name, int price) {
    Product product = Product.findById(id);
    product.name = name;
    product.price = price;
    Cache.set("product_" + id, product, "30mn");
    showProduct(id);
}
 
public static void deleteProduct(String id) {
    Product product = Product.findById(id);
    product.delete();
    Cache.delete("product_" + id);
    allProducts();
}

上面的delete, set等标准方法都是非阻塞的。也就是说,当你调用
Cache.delete("product_" + id);

时,delete方法不等缓存对象真的被删除就直接返回。所以,如果在删除缓存对象时发生错误(譬如IO错误),那么缓存对象是仍然存在的。
sateDelete方法:阻塞的,在缓存对象真的被删除后,方法才会返回,方法有bool型的返回值来表明操作是否成功。

注意:
  • 由于是阻塞方法,使用safe前缀的方法会降低应用的响应速度。因此,只在需要时才那么使用。
  • 当指定参数expiration == "0s"(0秒)时,缓存实际的失效时间可能由于不同的缓存实现相差很大。

不要把Session当缓存使用!
当你用过基于内存Session实现的框架的话、如Servlet中的HTTP  Session(play框架中的session是以Cookie形式存储在客户端的),你可能会对play框架中只允许在session中以String的形式存储少量数据感到不习惯。在play框架中,session并不是你存储应用数据的地方。

基于内存的Session,使用例子:
httpServletRequest.getSession().put("userProducts", products);
...
// and then in subsequent requests
products = (List<Product>)httpServletRequest.getSession().get("use
rProducts");

play框架等效实现:
Cache.set(session.getId(), products);
...
// and then in subsequent requests
List<Product> products = Cache.get(session.getId(), List.class)

这里我们使用唯一的UUID来作为每个用户缓存的key。注意:和session不同的是,缓存并不会绑定到任何一个用户中,缓存在整个应用中是共享的

集成Memcached缓存配置(application.conf文件)
memcached:时候启用Memcached缓存,如果不配置,那么play默认使用单独的缓存EhCache,其数据存储在JVM的堆中。可能值:disabled(默认),enabled

memcached.host:启用Memcached时,指定memcached host地址,默认值:127.0.0.1:11211。
memcached.host=127.0.0.1:11211
多个host做分布式缓存时,如下配置:
memcached.1.host=127.0.0.1:11211
memcached.2.host=127.0.0.1:11212

参考:Use a cache
分享到:
评论

相关推荐

    playFramework1.2.3

    5. **内置数据库支持**:Play Framework集成了JPA(Java Persistence API),并默认支持H2内存数据库,使得开发者可以快速进行原型开发。同时,它也支持其他关系型数据库,如MySQL、PostgreSQL等,通过简单的配置...

    Beini-1.2.3_集成700W密码增强版.zip

    Beini-1.2.3_集成700W密码增强版.zip

    robotframework-ride-1.2.3.win-amd64

    标题 "robotframework-ride-1.2.3.win-amd64" 提供的信息表明,这是一个与 Robot Framework 相关的软件包,具体是 RIDE(Robot Framework IDE)的1.2.3版本,适用于Windows操作系统,且是针对AMD64架构的。...

    Python库 | dead_simple_framework-1.2.3-py3-none-any.whl

    在Python中,`dead_simple_framework-1.2.3-py3-none-any.whl`是一个特定版本的Python库文件,它代表了一个名为`dead_simple_framework`的框架,版本号为1.2.3。这种文件格式被称为wheel文件,是Python的二进制分发...

    play-1.2.4.zip

    7. **测试支持**:Play框架提供了集成的测试工具,包括单元测试和集成测试,方便开发者编写和执行测试用例。 8. **国际化**:Play 1.2.4支持多语言,可以通过配置文件轻松切换不同语言的显示内容。 9. **插件系统*...

    Cache Killer1.2.3清除浏览器缓存

    Cache Killer 是一个针对Chrome的缓存清理插件,它的特点是不用您专门清理,只要按下刷新按钮即可自动清理chrome缓存,非常的方便

    Beini 1.2.3

    3 Beini 1.2.3 集成minidwep gtk 30513

    SteamVR1.2.3.zip

    【SteamVR 1.2.3 - 全面解析虚拟现实技术的新篇章】 在虚拟现实(VR)领域,SteamVR是不可或缺的一部分,它为开发者和用户提供了一个强大的平台,用于体验和创建各种VR内容。SteamVR 1.2.3版本的发布,标志着这一平台...

    mybatipse1.2.3 eclipse离线插件

    Eclipse MyBatisipse 1.2.3 是针对 Eclipse 集成开发环境的一个离线插件,适用于那些无法或不便连接到互联网的开发者。这个插件提供了以下功能和知识点: 1. **代码生成器**:能够自动生成 MyBatis 的 Mapper 接口...

    NPOI 1.2.3 编译版

    总的来说,NPOI 1.2.3编译版为.NET开发者提供了一种强大且易于使用的工具,以处理Excel文件。无论是创建新的工作簿,还是读取和编辑现有文件,NPOI都提供了一套完善的API,使得这些任务变得简单且高效。对于那些在C#...

    logback-classic-1.2.3-API文档-中英对照版.zip

    赠送jar包:logback-classic-1.2.3.jar; 赠送原API文档:logback-classic-1.2.3-javadoc.jar; 赠送源代码:logback-classic-1.2.3-sources.jar; 包含翻译后的API文档:logback-classic-1.2.3-javadoc-API文档-...

    搭建linux+php+memcached架构的网站.zip

    "memcached在gcc 3.3.4下的安装和使用_lj_gcc调用memcached实现缓存MySQL的查询结果.txt"详细阐述了在特定版本的GCC下安装和使用Memcached,以及如何将Memcached用于缓存MySQL查询结果。 "libmemcached.so.2 cannot...

    xdoclet-bin-1.2.3

    结合Apache Ant的使用,可以无缝集成到Java项目的构建过程中,提升开发效率。然而,随着Java注解处理机制的发展,如Java的APT(Annotation Processing Tool)和现代构建工具Maven、Gradle的普及,XDoclet的使用逐渐...

    orabbix-1.2.3.zip

    本文将深入探讨Orabbix 1.2.3的核心功能、优势以及如何在不同版本的Zabbix中进行集成和应用。 首先,Orabbix的核心功能在于它提供了一个用户友好的界面,使得对Zabbix的管理和监控变得更加直观和高效。它简化了配置...

    SteamVR.Plugin v1.2.3

    在Unity中,开发者可以借助各种插件来简化VR应用的创建,其中“SteamVR.Plugin v1.2.3”就是一个关键工具,它专为与SteamVR平台集成而设计。 SteamVR.Plugin v1.2.3是针对Unity的特定版本,它是1.2.x系列的最终更新...

    SteamVR_1.2.3.rar

    在这个上下文中,它可能是为开发者准备的,包含与SteamVR 1.2.3集成所需的所有组件、脚本和设置,使得开发者能够在Unity环境中轻松地构建支持SteamVR的游戏或应用。 使用这个Unity包,开发者可以快速接入SteamVR的...

    shiro 1.2.3 jar包

    在本篇文章中,我们将深入探讨Shiro的核心概念、主要功能以及如何在项目中使用1.2.3版本。 **核心概念** 1. **身份认证(Authentication)**:Shiro帮助验证用户的身份。它支持多种认证方式,如基于用户名和密码的...

    MybatisPlus-1.2.3.zip

    在本项目中,我们关注的是"MybatisPlus-1.2.3.zip",这是一份针对IDEA(IntelliJ IDEA)的插件,用于帮助开发者更方便地集成MybatisPlus,并且能够自动引用DAO层的方法以及与mapper.xml文件无缝配合。 MybatisPlus...

Global site tag (gtag.js) - Google Analytics