您的位置 首页 > 娱乐休闲

java 缓存的简单实现

实现一个简单的缓存,具有缓存添加,获取,删除,过期自动删除等,主要存储方式为Map

首先建一个缓存数据实体类,用到了lombok消除get set 和全参构造函数

[java] view plain copy

  1. import lombok.AllArgsConstructor;
  2. import lombok.Getter;
  3. import lombok.Setter;
  4. @Getter
  5. @Setter
  6. @AllArgsConstructor
  7. public class CacheEntity {
  8. /**
  9. * 数据主体
  10. */
  11. private Object data;
  12. /**
  13. * 超时时长,0永不超时
  14. */
  15. private Long timeout;
  16. /**
  17. * 缓存设置初始时间
  18. */
  19. private Long initialTime;
  20. }

再建一个缓存具体操作接口,支持对缓存的各种操作

[java] view plain copy

  1. import java.u;
  2. import java.u;
  3. public interface CacheManager {
  4. /**
  5. * 存入缓存
  6. * @param key
  7. * @param data
  8. */
  9. void put(String key, CacheEntity cacheData);
  10. /**
  11. * 存入缓存
  12. * @param key
  13. * @param data
  14. * @param timeout
  15. */
  16. void put(String key, Object data, Long timeout);
  17. /**
  18. * 获取缓存
  19. * @param key
  20. * @return
  21. */
  22. CacheEntity getCacheByKey(String key);
  23. /**
  24. * 获取所有缓存
  25. * @return
  26. */
  27. Map<String, CacheEntity> getCacheAll();
  28. /**
  29. * 判断缓存是否存在
  30. * @param key
  31. * @return
  32. */
  33. boolean isExist(String key);
  34. /**
  35. * 清除所有缓存
  36. */
  37. void clearAll();
  38. /**
  39. * 清除对应缓存
  40. * @param key
  41. */
  42. void clearByKey(String key);
  43. /**
  44. * 缓存是否失效
  45. * @param key
  46. * @return
  47. */
  48. boolean isTimeOut(String key);
  49. /**
  50. * 获取所有key
  51. * @return
  52. */
  53. Set<String> getKeys();
  54. }

对缓存接口实现,主要运用ConcurrentHashMap来保证多线程读写

[java] view plain copy

  1. import java.u;
  2. import java.u;
  3. import java.u;
  4. public class CacheManagerImpl implements CacheManager{
  5. private static Map<String, CacheEntity> caches = new ConcurrentHashMap<>();
  6. @Override
  7. public void put(String key, CacheEntity cacheData) {
  8. cac(key, cacheData);
  9. }
  10. @Override
  11. public void put(String key, Object data, Long timeout) {
  12. timeout = timeout > 0? timeout : 0L;
  13. put(key, new CacheEntity(data, timeout, Sy()));
  14. }
  15. @Override
  16. public CacheEntity getCacheByKey(String key) {
  17. i(key))
  18. return cac(key);
  19. return null;
  20. }
  21. @Override
  22. public Map<String, CacheEntity> getCacheAll() {
  23. return caches;
  24. }
  25. @Override
  26. public boolean isExist(String key) {
  27. return cac(key);
  28. }
  29. @Override
  30. public void clearAll() {
  31. cac();
  32. }
  33. @Override
  34. public void clearByKey(String key) {
  35. if (key)) {
  36. cac(key);
  37. }
  38. }
  39. @Override
  40. public boolean isTimeOut(String key) {
  41. if (!(key)) {
  42. return true;
  43. }
  44. CacheEntity cacheEntity = cac(key);
  45. Long timeOut = cac();
  46. Long initialTime = cac();
  47. if (timeOut == 0 || Sy() - initialTime < timeOut) {
  48. return false;
  49. }
  50. return true;
  51. }
  52. @Override
  53. public Set<String> getKeys() {
  54. return cac();
  55. }
  56. }

然后再新建一个线程对该缓存进行监听,来处理过期数据

[java] view plain copy

  1. import java.u;
  2. public class CacheListener {
  3. private CacheManager cacheManager;
  4. public CacheListener(CacheManager cacheManager) {
  5. = cacheManager;
  6. }
  7. public void startListen() {
  8. new Thread(new Runnable() {
  9. @Override
  10. public void run() {
  11. while(true) {
  12. Set<String> keys = cac();
  13. for (String key : keys) {
  14. i(key)) {
  15. cac(key);
  16. Sy(key + " 被清除了");
  17. }
  18. }
  19. try {
  20. T(5000);
  21. Sy("休息5s再检查");
  22. } catch (InterruptedException e) {
  23. // TODO Auto-generated catch block
  24. e.printStackTrace();
  25. }
  26. }
  27. }
  28. }).start();
  29. }
  30. }

最后测试类如下

[java] view plain copy

  1. import java.u;
  2. import java.u;
  3. public class TestCache {
  4. public static void main(String[] args) {
  5. CacheManager cacheManager = new CacheManagerImpl();
  6. cac("testtimeout", "kkkkkkkkk", 20 * 1000L);
  7. cac("test1", "111111111", 0L);
  8. cac("test2", "222222222222222", 100 * 1000L);
  9. cac("test3", "33333333333333", 0L);
  10. CacheListener cacheListener = new CacheListener(cacheManager);
  11. cac();
  12. Sy("getCacheAll : " + Arrays.asLi()));
  13. Sy("getCacheKeyAll : " + Arrays.asList(cac()));
  14. Sy("getKey : " + Arrays.asLi("test1")));
  15. Sy("isExist false: " + Arrays.asLi("test")));
  16. Sy("isExist true: " + Arrays.asLi("test1")));
  17. Sy("istimeOut false: " + Arrays.asLi("test1")));
  18. try {
  19. TimeUnit.SECONDS.sleep(30);
  20. } catch (InterruptedException e) {
  21. // TODO Auto-generated catch block
  22. e.printStackTrace();
  23. }
  24. Sy("isExist : " + Arrays.asLi("testtimeout")));
  25. }
  26. }

运行结果:

责任编辑: 鲁达

1.内容基于多重复合算法人工智能语言模型创作,旨在以深度学习研究为目的传播信息知识,内容观点与本网站无关,反馈举报请
2.仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证;
3.本站属于非营利性站点无毒无广告,请读者放心使用!

“如何实现缓存,如何实现缓存一致性,如何实现缓存和数据库的一致性,如何实现分布式缓存”边界阅读