缓存系统的实现原理

来源:互联网 发布:怎么破解软件密码 编辑:程序博客网 时间:2024/05/21 20:24

今天给大家分享一个小知识,那就是如何实现一个简单的缓存系统。

先把代码贴上

import java.util.HashMap;import java.util.Map;public class CacheSystem {private Map<String, Object> cache=new HashMap<>();public static void main(String[] args) {// TODO Auto-generated method stub}public synchronized Object getData(String key){//从缓存中查询数据Object result=cache.get(key);//缓存中没有则从数据库中查询if (result==null) {result=queryFromDB();//查询出的数据也要存入缓存if (result!=null) {cache.put(key, result);}}//返回查询的数据return result;}private Object queryFromDB() {// TODO Auto-generated method stub//此处代码不作实现return null;}}
由于是演示,此处并没有给出从数据库中查询部分的代码。在上述代码中,因为方法getData()加了synchronized关键字,导致当前的的查询线程会阻塞其余查询线程的执行,因此有必要加上读写锁来提高查询性能。

优化后的代码如下:

import java.util.HashMap;import java.util.Map;import java.util.concurrent.locks.ReadWriteLock;import java.util.concurrent.locks.ReentrantReadWriteLock;public class CacheSystem {private Map<String, Object> cache=new HashMap<>();//添加读写锁private ReadWriteLock lock=new ReentrantReadWriteLock();public static void main(String[] args) {// TODO Auto-generated method stub}public Object getData(String key){lock.readLock().lock();Object result=null;try {//从缓存中查询数据result=cache.get(key);//缓存中没有则从数据库中查询if (result==null) {result=queryFromDB();//查询出的数据写入缓存,因此清读写,加写锁lock.readLock().unlock();lock.writeLock().lock();try {//若存在多个写锁,只写一次即可if (cache.get(key)==null) {if (result!=null) {cache.put(key, result);}}} finally {// TODO: handle finally clauselock.writeLock().unlock();}//写操作完成,恢复读锁lock.readLock().lock();}} catch(Exception e){e.printStackTrace();System.out.println("异常发生");}finally {// TODO: handle finally clauselock.readLock().unlock();}//返回查询的数据return result;}private Object queryFromDB() {// TODO Auto-generated method stub//此处代码不作实现return null;}}
本人水平有限,如有错误,欢迎大家批评指正,本人将十分感激。

原创粉丝点击