前言

使用缓存已经是开发中老生常谈的一件事了,常用专门处理缓存的工具比如Redis、MemCache等,但是有些时候可能需要一些简单的缓存处理,没必要用上这种专门的缓存工具,那么自己写一个缓存类最合适不过了。

一、分析

首先分析一下缓存类该如何设计,这里我以一种非常简单的方式来实现一个缓存类,这也是我一直以来使用的设计方案。

为了明确功能,首先定义一个接口类CacheInt,然后是缓存实现的工具类CacheUtil。然后再看其中的功能,为了存取方便,缓存应是以键值对的形式存取,为了适应更多的场景,所以在存取的时候可以加一个缓存过期时间,然后再加上其他常见的添加、获取、删除、缓存大小、是否存在key、清理过期缓存等方法,整个缓存工具的方法差不多就是这些。

缓存类需要注意的问题:

缓存对象应该是唯一的,也就是单例的;

缓存的操作方法要同步,在多线程并发条件下防止出错;

缓存的容器应该具有较高的并发性能,ConcurrentHashMap是一个不错的选择。

二、具体实现

1. CacheInt接口的定义

CacheInt接口的定义如下:

2. CacheUtil的具体实现

缓存实现的核心就是CacheUtil,下面结合注释进行说明,为了避免文章篇幅冗杂,以下截图就是完整源码截图,并且保持先后顺序。

首先是类定义和其属性定义,其中本类实例对象用volatile进行修饰提高可见性,初始化缓存容量用于初始化ConcurrentHashMap缓存容器的大小,此大小根据实际应用场景进行优化。

然后是内部类Entry的定义,该类是用来存储实际数据的,为了方便处理过期时间,添加初始化时间戳、过期时间等属性。

然后是使用双检锁单例方式获取本类实例对象,因为单例只能存在唯一的特点,所以注意构造函数需要设为private

接下来是存入缓存数据put()方法,这里的clearExpiredCache()是清理过期缓存,后面会看到方法体,因为在我项目中存入缓存的情况较少,所以这里我固定了每次存之前先清理一次过期时间缓存,这里可以根据自己项目实际情况进行优化。

然后是获取缓存get()方法,因为获取数据的时间较为多数,所以这里我设定了三分之一的概率清理过期缓存,适当地释放堆内存,并且在获取时检测是否过期,如果已过期然而还获取到了,就删除并返回空。

然后就是比较常规的一些方法,具体可以看代码

最后一个方法就是清理过期缓存,这里你可以选择启动一个监听线程实时地清理缓存,也可以选择在适当时机进行一次清理,比如我这里就是在存在put和get操作时固定或概率地清理缓存。

三、并发测试

普通的实现测试这里就不展示了,肯定是没问题的,读者简单写一些测试样例即可,这里主要展示一下并发测试,因为在实际情况中存在并发处理缓存情况,为了确保其正确性,所以并发测试是必须要做的,下面放出我的测试样例。

最后测试的表现是很好,没有出现不正确的情况,部分测试结果截图如下:

四、拓展

该类只是简单的实现了缓存的过程,但是在实际应用中不见得能很好地表现,首先它的容量肯定有限,不能存太多缓存,因为使用的是JVM堆内的内存,其次其功能也较为简单,比如不支持LRU淘汰等,这个可以用双链表+Map或者是LinkedHashMap去实现,更多功能都可以拓展。

1

END

1

缓存类java_用Java写一个简单的缓存操作类相关推荐

  1. 复数类 java_用java写一个复数类Complex

    由于java库中没有提供复数的操作,应同学的需求,写了一个复数的类.有两个构造方法不带参数和带参数的,不带参数时默认实部虚部都为0.还有这些基本的方法,看名字就知道了. public double g ...

  2. 用java写一个简单的区块链(下)

    用java写一个简单的区块链(下) 2018年03月29日 21:44:35 java派大星 阅读数:725 标签: 区块链java 更多 个人分类: 区块链 版权声明:本文为博主原创文章,转载请标明 ...

  3. 用java写一个日历_使用JAVA写一个简单的日历

    JAVA写一个简单的日历 import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDa ...

  4. java编写日历思路_使用JAVA写一个简单的日历

    JAVA写一个简单的日历import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDat ...

  5. 使用JAVA写一个简单的日历

    JAVA写一个简单的日历 import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDa ...

  6. 怎样用java写一个简单的文件复制程序

    怎样用java写一个简单的文件复制程序 代码来源:https://jingyan.baidu.com/article/c35dbcb0d6f1398916fcbc07.html package Num ...

  7. 用Java写一个简单的回合制游戏

    用Java写一个简单的回合制游戏 创建基本属性,血量,名字,技能,技能伤害. 如下: public class One3 {//创建三个属性private String name;private St ...

  8. java递归怎么写_什么是递归?用Java写一个简单的递归程序

    什么是递归?用Java写一个简单的递归程序 递归的定义 递归(recursion):以此类推是递归的基本思想,将规模大的问题转化为规模小的问题来解决. 递归的要素 自定义递归函数,并确定函数的基本功能 ...

  9. 无聊的时候怎么办?教你用java写一个简单挂机打金币小游戏吧!

    无聊的时候怎么办?教你用java写一个超简单挂机打金币小游戏吧! Java写一个挂机打金币程序 1.Java的面向对象 2.基础打金的分析 3. Robot介绍以及Demo演示 4.挂机打金程序如何去 ...

最新文章

  1. Windows下利用TortoiseSVN搭建本地SVN服务器
  2. matlab实现彩色图像灰度化的三种方法
  3. c++基础知识——算数运算符
  4. 67.Java垃圾收集机制\对象引用\垃圾对象的判定\垃圾收集算法\标记—清除算法\标记—整理算法\分代收集\垃圾收集器\性能调优
  5. SE37 test sequence - 在同一个main session内依次执行function module
  6. 管理沟通中移情的应用_移情在设计中的重要性
  7. java数组的四个要素_Java零基础系列教程04Java数组
  8. java struts2国际化代码下载_【Java框架】java struts2框架中页面表示国际化的方法 - 思诚科技...
  9. Java中的volatile的作用和synchronized作用
  10. html表白代码大全_100条代码,拿去“表白”
  11. Flutter系列之改变CupertinoSwitch的大小
  12. HTML5系列代码:框模型的大小
  13. 感性和理性,个人的看法
  14. ethz-asl的catkin simple
  15. python之getattr()函数
  16. 真的爱你计算机谱子,真的爱你钢琴简谱-数字双手-Beyond
  17. openstack九大模块
  18. 大数据学习:学习大数据需要多少钱
  19. 百度地图api调用 实现车载导航功能
  20. swing应用-简单记事本

热门文章

  1. JDK1.8版本,java并发框架支持锁包括
  2. ng6 常见错误汇总(持续更新)
  3. beego2---入门
  4. 算法系列之选择排序算法
  5. http://jingyan.baidu.com/article/2009576193ee38cb0721b416.html
  6. 打包签名时出现Conversion to Dalvik format failed with error 1
  7. Get 和 Post方法的登录
  8. 让StringGrid控件显示下拉菜单
  9. 终端安装解决svn cannot set LC_CTYPE locale的问题
  10. easyexcel 日期类型 convert_[Oracle 专题] SQL 日期、数字、字符串,运算、转换