缓存类java_用Java写一个简单的缓存操作类
前言
使用缓存已经是开发中老生常谈的一件事了,常用专门处理缓存的工具比如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写一个简单的缓存操作类相关推荐
- 复数类 java_用java写一个复数类Complex
由于java库中没有提供复数的操作,应同学的需求,写了一个复数的类.有两个构造方法不带参数和带参数的,不带参数时默认实部虚部都为0.还有这些基本的方法,看名字就知道了. public double g ...
- 用java写一个简单的区块链(下)
用java写一个简单的区块链(下) 2018年03月29日 21:44:35 java派大星 阅读数:725 标签: 区块链java 更多 个人分类: 区块链 版权声明:本文为博主原创文章,转载请标明 ...
- 用java写一个日历_使用JAVA写一个简单的日历
JAVA写一个简单的日历 import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDa ...
- java编写日历思路_使用JAVA写一个简单的日历
JAVA写一个简单的日历import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDat ...
- 使用JAVA写一个简单的日历
JAVA写一个简单的日历 import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDa ...
- 怎样用java写一个简单的文件复制程序
怎样用java写一个简单的文件复制程序 代码来源:https://jingyan.baidu.com/article/c35dbcb0d6f1398916fcbc07.html package Num ...
- 用Java写一个简单的回合制游戏
用Java写一个简单的回合制游戏 创建基本属性,血量,名字,技能,技能伤害. 如下: public class One3 {//创建三个属性private String name;private St ...
- java递归怎么写_什么是递归?用Java写一个简单的递归程序
什么是递归?用Java写一个简单的递归程序 递归的定义 递归(recursion):以此类推是递归的基本思想,将规模大的问题转化为规模小的问题来解决. 递归的要素 自定义递归函数,并确定函数的基本功能 ...
- 无聊的时候怎么办?教你用java写一个简单挂机打金币小游戏吧!
无聊的时候怎么办?教你用java写一个超简单挂机打金币小游戏吧! Java写一个挂机打金币程序 1.Java的面向对象 2.基础打金的分析 3. Robot介绍以及Demo演示 4.挂机打金程序如何去 ...
最新文章
- Windows下利用TortoiseSVN搭建本地SVN服务器
- matlab实现彩色图像灰度化的三种方法
- c++基础知识——算数运算符
- 67.Java垃圾收集机制\对象引用\垃圾对象的判定\垃圾收集算法\标记—清除算法\标记—整理算法\分代收集\垃圾收集器\性能调优
- SE37 test sequence - 在同一个main session内依次执行function module
- 管理沟通中移情的应用_移情在设计中的重要性
- java数组的四个要素_Java零基础系列教程04Java数组
- java struts2国际化代码下载_【Java框架】java struts2框架中页面表示国际化的方法 - 思诚科技...
- Java中的volatile的作用和synchronized作用
- html表白代码大全_100条代码,拿去“表白”
- Flutter系列之改变CupertinoSwitch的大小
- HTML5系列代码:框模型的大小
- 感性和理性,个人的看法
- ethz-asl的catkin simple
- python之getattr()函数
- 真的爱你计算机谱子,真的爱你钢琴简谱-数字双手-Beyond
- openstack九大模块
- 大数据学习:学习大数据需要多少钱
- 百度地图api调用 实现车载导航功能
- swing应用-简单记事本
热门文章
- JDK1.8版本,java并发框架支持锁包括
- ng6 常见错误汇总(持续更新)
- beego2---入门
- 算法系列之选择排序算法
- http://jingyan.baidu.com/article/2009576193ee38cb0721b416.html
- 打包签名时出现Conversion to Dalvik format failed with error 1
- Get 和 Post方法的登录
- 让StringGrid控件显示下拉菜单
- 终端安装解决svn cannot set LC_CTYPE locale的问题
- easyexcel 日期类型 convert_[Oracle 专题] SQL 日期、数字、字符串,运算、转换