自己用HashMap来模拟一个Session缓存(简易版)

Posted 长河落日圆

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了自己用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;
    }
}

以上是关于自己用HashMap来模拟一个Session缓存(简易版)的主要内容,如果未能解决你的问题,请参考以下文章

Memcache+cookie实现模拟session

MyBatis中关于session以及cache的管理

分析下为什么spring 整合mybatis后为啥用不上session缓存

算法 哈希表 自己模拟hashMap

Mybatis缓存

Tomcat实现session会话保持