Java学习之ConcurrentHashMap实现一个本地缓存

  ConcurrentHashMap融合了Hashtable和HashMap二者的优势。

  Hashtable是做了线程同步,HashMap未考虑同步。所以HashMap在单线程下效率较高,Hashtable在多线程下同步操作能保证程序的正确性。  但是Hashtable每次执行同步操作都需要锁住整个结构。

  

  ConcurrentHashMap的出现就是为了解决Hashtable同步lock整个数据结构的问题。ConcurrentHashMap锁的方式是细颗粒度。

  ConcurrentHashMap将Hash表分为16个桶(默认值),诸如get/put/remove操作只需要锁着需要的单个桶即可。

    ConcurrentHashMap只有在size等操作的时候才会锁住整个Hash表。

  下面是自己实现的一个ConcurrentHashMap的本地缓存的例子:ConcurrentHashMap 和Guava cache相比,需要自己显示的删除缓存

import java.util.concurrent.ConcurrentHashMap;

public class ConcurrentHashMapTest {

    private static ConcurrentHashMap<String, String> cacheMap = new ConcurrentHashMap<>();

    /**
     * 获取缓存的对象
     *
     * @param account
     * @return
     */
    public static String getCache(String account) {

        account = getCacheKey(account);
        // 如果缓冲中有该账号,则返回value
        if (cacheMap.containsKey(account)) {
            return cacheMap.get(account);
        }
        // 如果缓存中没有该账号,把该帐号对象缓存到concurrentHashMap中
        initCache(account);
        return cacheMap.get(account);
    }

    /**
     * 初始化缓存
     *
     * @param account
     */
    private static void initCache(String account) {
        // 一般是进行数据库查询,将查询的结果进行缓存
        cacheMap.put(account, "18013093863");
    }

    /**
     * 拼接一个缓存key
     *
     * @param account
     * @return
     */
    private static String getCacheKey(String account) {
        return Thread.currentThread().getId() + "-" + account;
    }

    /**
     * 移除缓存信息
     *
     * @param account
     */
    public static void removeCache(String account) {
        cacheMap.remove(getCacheKey(account));
    }
}

  

时间: 2024-11-03 00:22:00

Java学习之ConcurrentHashMap实现一个本地缓存的相关文章

使用ThreadLocal来实现一个本地缓存

大家应该知道,用户从发起请求,到服务器响应的这个过程中,在服务器中是在一个线程中的.如果我们吧查询出来的对象放到这个线程自己的缓存中,到用户请求结束时,把这些东西清理掉,应该是一个不错的cache方案. import java.util.HashMap; import java.util.Map; /** * ThreadLocalCache * */ public class ThreadLocalCache { /** * 实例字段,每个线程一个store,每个线程生产一个{@code Th

Java学习 1.4——第一个Java程序:Hello World!

这一篇一起来写第一个Java程序,同时也了解一下IDEA的使用: 打开IDEA,新建项目: 选择Java,右边project SDK是选择Java版本,上一篇我们自己安装了JDK1.8,IDEA自带一个JDK11: 写一个小程序,选择什么JDK都没影响,不过既然已经安装了JDK1.8,就用吧. 就写一个hello world程序也不需要加什么框架,next: 这一步会让选择是否创建一个模板,无关紧要,下一步: 输入项目名称,选择路径,我一般是创建一个当天日期的文件夹来存放当天学习的内容,也是记录

JAVA学习--多态使用的一个例子

1 public class TestAnimal { 2 public static void main(String[] args) { 3 TestAnimal t = new TestAnimal(); 4 t.func(new Animal()); 5 t.func(new Dog()); 6 7 t.func(new Cat()); 8 9 } 10 public void func(Animal a){//Animal a = new Dog(); 11 a.eat(); 12 a

设计一个移动应用的本地缓存机制

在手机应用程序开发中,为了降低与服务端的交互次数,加快用户的响应速度,一般都会在iOS设备中加一个缓存的机制,前面一篇文章介绍了iOS设备的内存缓存.这篇文章将设计一个本地缓存的机制. 功能需求 这个缓存机制满足以下这些功能. 1.能够将数据缓存到本地磁盘. 2.能够推断一个资源是否已经被缓存.假设已经被缓存.在请求同样的资源.先到本地磁盘搜索. 3.能够推断文件缓存什么时候过期.这里为了简单起见这里,我们在请求url资源的时候.给每次请求的文件设定一个过期的时间. 4.能够实现:假设文件已经被

Java8简单的本地缓存实现

译文出处: 踏雁寻花   原文出处:lukaseder 这里我将会给大家演示用ConcurrentHashMap类和lambda表达式实现一个本地缓存.因为Map有一个新的方法,在key为Null的时候自动计算一个新的value值.非常适合实现cache.来看下代码: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 public static void main(String[] args) {     for (int i = 0; i < 10; i++)   

故障排除 Mybatis ORA-01000 和 本地缓存问题

※异常信息 环境 MyBatis Oracle11.2c Terasoluna BatchCaused by: org.springframework.jdbc.UncategorizedSQLException: ### Error updating database. Cause: java.sql.SQLException: ORA-00604: 再帰SQLレベル1でエラーが発生しました.ORA-01000: 最大オープン?カーソル数を超えました.ORA-00604: 再帰SQLレベル1で

C#本地缓存的使用方法

学习了一下C#的本地缓存,今天将它分享出来,也记录自己的学习历程. 首先在我们Cache当中,它是存在于System.Web.Caching;命名空间下的 最常用的方法有:Add用于创建缓存对象,Remove删除缓存对象,Insert类似于Add方法但是也可以用它来修改我们已经存在的缓存对象, Get方法,因为我们Cache是一种键值对的方式,所以此方法可以根据我么的键来找到我们的缓存对象. 不多说,直接上代码 在我们的webform中我们可以这么写 而在我们的mvc中写法则是要改变一些,但是方

基于guava实现本地缓存

今天一个接口响应超时,然后我优化,用到了本地缓存. maven 依赖 <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>27.1-jre</version> </dependency> LocalCache 本地缓存工具类 package com.itbac.common.cache;

Java学习笔记之RMI远程方法调用

RMI 应用通常有两个分开的程序组成,一个服务端程序和一个客户端程序.一个典型的服务端程序创建一些远程对象,使得对这些远程对象的引用可以被访问,等待客户端调用这些远程对象提供的方法.一个典型的客户端程序获取远程引用,指向一个或者多个服务端上的远程对象,然后调用这些远程对象所提供的方法.通常我们称这为分布式对象应用程序. 3.1 RMI的工作方式 分布式对象应用程序需要做的事情: l 查找(定位)远程对象. 应用程序可以使用各种不同的机制取得远程对象的引用.比如应用程序可以通过 RMI 提供的简单