Play框架源码浅析之缓存

本文探讨了Play框架的两种缓存方式:JVM内存缓存(基于Ehcache)和使用Memcached。针对每种方式,分析了其实现原理、优缺点。JVM缓存虽然线程安全但需要外层处理超时和并发问题;而Memcached利用spyMemcached,存取速度快但初始化较复杂,提供了丰富的操作接口。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Play 框架初探之缓存

 

  Play 提供两种缓存方式:

  1. JVM 内存缓存

  2. 使用Memcached 缓存

      PlayCacheImpl 接口( 不知道为什么如此命名) 中提供了safeDeletesafeAddincr,decr 等高级操作接口,但是两种机制内部实现却大有区别。

      方式一基于JVM 内存的缓存方案通过重度封装Ehcache 来做内存缓存,Ehcache 的优点之一是引用非常简单。尽管Cache 是线程安全的,但是是对于setget 操作没有内置的timeout 接口,对于incrdecr 操作需要手动处理并发,总的来说还是需要外层封装代码做不少工作。

 

    // 实现increase需要手动处理并发
    public synchronized long incr(String key, int by) {
        Element e = cache.get(key);
        if (e == null) {
            return -1;
        }
        long newValue = ((Number) e.getValue()).longValue() + by;
        Element newE = new Element(key, newValue);
        newE.setTimeToLive(e.getTimeToLive());
        cache.put(newE);
        return newValue;
    }

 

方式二使用Memcached 作为缓存实现,轻度封装了spyMemcached 来连接Memcached,spyMemcached 的初始化比较繁琐,但是其使用nioconcurrent 包的一些机制,存取速度比同类的客户端要快。最重要的一点是spyMemcached 提供了丰富的操作接口,Play 不需要做额外的并发控制处理。

 

    // 客户端提供了increase接口 
    public long incr(String key, int by) {
        return client.incr(key, by, 0);
    }

    // 异步的safeAdd
    public boolean safeAdd(String key, Object value, int expiration) {
        Future<Boolean> future = client.add(key, expiration, value, tc);
        try {
            return future.get(1, TimeUnit.SECONDS);
        } catch (Exception e) {
            future.cancel(false);
        }
        return false;
    }

        

            总的来说,Play的缓存机制非常简单,选用了存取速度快但是稳定性欠妥的spyMemcached作为Memcached客户端,所以轻量、敏捷是Play所注重的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值