`

在项目中memcache服务之间缓存同步时出现阻塞的原因

 
阅读更多
public boolean delete(String key, Integer hashCode, Date expiry,boolean isReply) {

        if (key == null) {
            log.error("null value for key passed to delete()");
            return false;
        }

        try {
            key = sanitizeKey(key);
        } catch (UnsupportedEncodingException e) {

            // if we have an errorHandler, use its hook
            if (errorHandler != null)
                errorHandler.handleErrorOnDelete(this, e, key);

            log.error("failed to sanitize your key!", e);
            return false;
        }

        // get SockIO obj from hash or from key
        SchoonerSockIO sock = pool.getSock(key, hashCode);

        // return false if unable to get SockIO obj
        if (sock == null) {
            if (errorHandler != null)
                errorHandler.handleErrorOnDelete(this, new IOException("no socket to server available"), key);
            return false;
        }

        // build command
        StringBuilder command = new StringBuilder("delete ").append(key);
        if (expiry != null)
            command.append(" " + expiry.getTime() / 1000);
       
        /**如果不要需要用到服务器返回的结果最好是加上noreply
         * 这样服务器之间同步缓存的时候就不会出现线程阻塞的情况**/
        if(!isReply){
            command.append(" noreply");
        }
        command.append("\r\n");

        try {
            sock.write(command.toString().getBytes());
           
            //判断是否需要服务器返回结果
            if(!isReply){
                return true;
            }
           
            // if we get appropriate response back, then we return true
            // get result code
            String line = new SockInputStream(sock, Integer.MAX_VALUE).getLine();
            if (DELETED.equals(line)) { // successful
                if (log.isDebugEnabled())
                    log.debug(new StringBuffer().append("++++ deletion of key: ").append(key)
                            .append(" from cache was a success").toString());
                return true;
            } else if (NOTFOUND.equals(line)) { // key not found
                if (log.isDebugEnabled())
                    log.debug(new StringBuffer().append("++++ deletion of key: ").append(key)
                            .append(" from cache failed as the key was not found").toString());
            } else { // other error information
                log.error(new StringBuffer().append("++++ error deleting key: ").append(key).toString());
                log.error(new StringBuffer().append("++++ server response: ").append(line).toString());
            }
        } catch (IOException e) {

            // if we have an errorHandler, use its hook
            if (errorHandler != null)
                errorHandler.handleErrorOnDelete(this, e, key);

            // exception thrown
            log.error("++++ exception thrown while writing bytes to server on delete");
            log.error(e.getMessage(), e);

            try {
                sock.sockets.invalidateObject(sock);
            } catch (Exception e1) {
                log.error("++++ failed to close socket : " + sock.toString());
            }

            sock = null;
        } finally {
            if (sock != null) {
                sock.close();
                sock = null;
            }
        }

        return false;
    }
分享到:
评论

相关推荐

    memcache.spymemcached,和xmemcached 三种缓存实例

    Memcached是广泛应用的分布式内存对象缓存系统,它能够减轻数据库的负载,通过将数据存储在内存中来快速服务请求。本文将深入探讨memcache的三种常见Java客户端实现:spymemcached、xmemcached和原生的memcache接口...

    选redis还是memcache

    在互联网分层架构中,Memcached(简称Memcache)和Redis是最常用的键值(Key-Value, KV)缓存系统。两者各有特色,如何根据业务需求和技术背景做出合理的选择成为了一个重要的问题。本文将深入分析这两种缓存技术的...

    Memcache技术笔记

    通过将数据缓存在内存中,Memcached可以显著降低对数据库的查询次数,从而提高整体性能。 ##### 存储类型 Memcached能够存储各种格式的数据,包括但不限于图像、视频、文件及数据库查询结果等。它通过维护一个巨大...

    Redis day01.pdf

    在缓存系统中,除了Redis,Memcache也是一个常见选择。Memcache使用多线程异步IO模型,结构简单,通常用于存放简单的K-V(键值)数据。不过,它也有一些限制,例如最大键值大小有限制,且不支持过期时间设置和复杂的...

    Dubbo服务框架面试题及答案.pdf

    在面试中,关于Dubbo的考察往往是考察应聘者对于分布式服务架构的理解。接下来,我们将根据文档提供的内容,详细阐述Dubbo相关的知识点。 首先,Dubbo支持多种协议,每种协议都适用于不同的应用场景,并且具有各自...

    memcached java client

    Memcached是一种高性能、分布式内存对象缓存系统,用于在分布式计算环境中缓解数据库负载,提高应用程序的性能。在Java开发中,有多个客户端库可供选择来与Memcached进行交互。本篇文章将详细介绍两个常用的Java ...

    libevent-1.4.9-stable.tar.gz

    1. 在多线程环境中使用libevent时,需要正确管理线程同步,避免数据竞争。 2. 跟踪libevent的更新,因为安全漏洞和性能优化可能会在新版本中修复和提升。 3. 适当配置libevent的事件调度策略,以适应应用的特定需求...

    Java面试宝典(数据库篇).docx

    Java面试中的数据库篇通常会涉及NoSQL数据库,特别是Redis,因为它在现代Web应用中的使用非常广泛,主要作为缓存和高速数据访问的解决方案。以下是对Redis相关知识点的详细阐述: 1. **Redis的优势:** - **速度**...

    Dubbo面试.pdf

    1. dubbo协议:使用单一长连接和NIO异步通讯模型,适合高并发且数据量小的服务调用,尤其在消费者数量远大于提供者时更为适用。它采用TCP传输协议,异步通信方式,利用Hessian序列化机制。这种协议的优点是性能好,...

    Dubbo面试及答案(上

    - **memcache和redis协议**:分别基于memcached和redis实现的RPC协议,用于缓存服务。 2. **Dubbo超时时间设置**: - 服务提供者端设置,推荐由服务提供者根据服务特性来设定。 - 服务消费者端设置,优先级更高...

    JAVA面试_Dubbo常问面试题30个.pdf

    【Dubbo协议详解】 在Java面试中,Dubbo作为一个高性能的RPC(远程过程调用)框架,其协议选择是面试中的常见话题。...这些内容对于理解Dubbo如何在分布式环境中工作,以及如何优化服务治理至关重要。

    Dubbo面试及答案(上).pdf111

    在Java面试中,Dubbo的相关问题常常被问到,因为它在现代微服务架构中扮演着重要角色。下面将详细解析Dubbo的一些关键知识点。 **1. Dubbo支持的协议及其应用场景和优缺点** - **dubbo协议**:基于单一长连接和NIO...

    Dubbo面试及答案(上).pdf

    6. **memcache**:基于memcached的RPC协议,适用于缓存相关的服务交互。 7. **redis**:基于redis的RPC协议,适合需要快速读写操作的场景。 【Dubbo超时时间设置】 Dubbo允许在服务提供者和服务消费者两端设置...

    高并发高可用的可伸缩的架构设计的原则

    - **多级缓存**:利用多级缓存机制,如客户端页面缓存、反向代理缓存、应用端缓存(Memcache)、内存数据库等,来减轻后端服务器的压力,提升访问速度。 - **空间换时间**:通过预先计算和存储结果的方式减少实时...

    2021Java字节跳动面试题——面向字节_Dubbo(上).pdf

    - **应用场景**:适用于常规的远程服务调用和RMI互操作,尤其是在依赖低版本的Common-Collections包时,需要注意Java序列化存在的安全漏洞。 - **优点**:支持文件传输。 - **缺点**:序列化机制可能存在安全问题;...

    Redis面试知识点.pdf

    全量复制发生在新加入的从节点或主节点重启时,增量复制则是在全量复制完成后发生的更新同步。 #### 24、Redis集群最大节点个数是多少? Redis集群的最大节点数为16384个,每个哈希槽对应一个节点。 #### 25、...

    【白雪红叶】JAVA学习技术栈梳理思维导图.xmind

    同步阻塞 同步非阻塞 基于信号 多路复用 异步IO 类加载机制 双亲委派 OSGI 算法 搜索 二分 排序 选择 冒泡 插入 快速 归并 堆 桶 基数 常用算法 贪婪 回溯 剪枝 动态规划 数据挖掘算法 ...

    JS+WCF实现进度条实时监测数据加载量的方法详解

    在项目中,可能需要将大量数据导入内存缓存系统,如Memcache。在这个例子中,有11万条数据需要通过WCF服务获取,由于涉及多级联查询和排序,这会耗费大约1分钟的时间。此外,还需要对这些数据进行处理和合并,生成2...

    java高级工程师面试题

    1. **死锁问题**: 发生在多个线程相互等待对方持有的资源时,导致所有线程都处于阻塞状态。 - **解决方法**: 调整JVM参数(如-Xms和-Xmx),优化资源分配策略,避免循环等待。 2. **Redis与Memcache对比**: - **...

Global site tag (gtag.js) - Google Analytics