zoukankan      html  css  js  c++  java
  • 自己用HashMap来模拟一个Session缓存(简易版)

    本文记录:Hibernate中一级缓存的特点。

    一级缓存的细节什么操作会向一

    1.级缓存放入数据

    save,update,saveOrUpdate,load,get,list,iterate,lock

    2.什么操作会从一级缓存取数据。
    get / load / list

    get / load 会首先从一级缓存中取,如没有,再有不同的操作[get 会立即向数据库发请求,而load 会返回一个代理对象,直到用户真的去使用数据,才会向数据库发请求。
    ?list 会不会从session缓存取数据?

    3.一级缓存不需要配置,就可以使用,它本身没有保护机制,所以我们程序员要考虑这个问题,我们可以同 evict 或者 clear来清除session缓存中对象。

    evict 是清除一个对象,clear是清除所有的sesion缓存对象

    4.session级缓存中对象的生命周期, 当session关闭后,就自动销毁.

    5.自己用HashMap来模拟一个Session缓存,加深对缓存的深入。

    package dome;
    
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    public class MyCache {
        // 使用map来模拟缓存
        static Map<Integer, Student> maps = new HashMap<Integer, Student>();
        public static void main(String[] args) {
            // TODO Auto-generated method stub
    
            getStudent(1);
            getStudent(1);
            getStudent(1);
            getStudent(1);
            getStudent(3);
            getStudent(3);
    
        }
    
        public static Student getStudent(Integer id) { // s.get()
    
            // 先到缓存去
            if (maps.containsKey(id)) {
                // 在缓存有
                System.out.println("从缓存取出");
                return maps.get(id);
            } else {
                System.out.println("从数据库中取");
                // 到数据库取
                Student stu = MyDB.getStudentFromDB(id);
                // 放入缓存
                maps.put(id, stu);
                return stu;
            }
    
        }
    
    }
    
    // 我的数据库
    class MyDB {
    
        static List<Student> lists = new ArrayList<Student>();
    
        // 初始化数据库,假设有三个学生
        static {
            Student s1 = new Student();
            s1.setId(1);
            s1.setName("aaa");
            Student s2 = new Student();
            s2.setId(2);
            s2.setName("bbb");
            Student s3 = new Student();
            s3.setId(3);
            s3.setName("ccc");
            lists.add(s1);
            lists.add(s2);
            lists.add(s3);
    
        }
    
        public static Student getStudentFromDB(Integer id) {
            for (Student s : lists) {
                if (s.getId().equals(id)) {
                    return s;
                }
            }
            return null;// 在数据库中没有.
    
        }
    }
    
    class Student {
        private Integer id;
        private String name;
    
        public Integer getId() {
            return id;
        }
    
        public void setId(Integer id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    }

  • 相关阅读:
    WinForm里保存TreeView状态
    动态规划 回溯和较难题
    go 基本链表操作
    leetcode 42接雨水
    leetcode 旋转数组搜索
    leetcode 牛客编程 子序列 树 数组(积累)
    剑指offer(积累)
    go快排计算最小k个数和第k大的数
    leetcode 打家劫舍
    leetcode 字符串相关问题
  • 原文地址:https://www.cnblogs.com/1693977889zz/p/8848806.html
Copyright © 2011-2022 走看看