SSH:利用Struts2+Hibernate4+Spring4+SQLServer框架,搭建一个前后端web网站(3)

释放双眼,带上耳机,听听看~!

为你推荐(模仿cache调度算法)


  • 网站有为你推荐模块,我是模仿计算机组成原理中的cache的调度算法。简单介绍:网站通过将所有的信息和标签挂钩。我给每个用户20条的“存储标签”的空间。其中10条为被标记成old的标签,10条为被标记成new标签(这样的目的是既采用了用户最进做多浏览偏好,又结合了用户历史浏览偏好)。其中的标签存贮方式如下:

假设用户浏览一条信息后有如下
标签和次数和标签关系(其中标签有被标记成new和old2个选项,代表这个标签式最近存储还是之前存储)
历史— 1次 —- new
科技 — 2次 —- new
C — 2次 —- new
……
U —-10——old(第20条)


10条被标记成new的标签,也就是说最开始的时候前10条标签设置为new,如果有新的插入(11条了),就将被标记成new中访问次数最少的标签降级为old(标记成old), 将新标签标记成new,次数0,插入数据库。
如果到了有10条被标记成new,10条被标记成old的标签,又有一个新标签插入,就将被标记成old的标签中访问次数最少的删除,将被标记成new的标签中访问次数最少的降级,将新的重新插入
如果一条标签已经被存储到数据库中了,再次被访问,那么标签被访问量count +1,同时如过这条被标记成old,将这条数据标记称new,找出被标记成new的标签中被访问次数最少的,降级成old(标记成old)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
1//进行用户cache保存
2    void saveCacheTag(String tagId){
3        //tagId 每一篇文章的id 如  3/4/12
4        String []tempTagId = tagId.split("/");
5
6        String name = (String)ServletActionContext.getRequest().getSession().getAttribute("name");
7        if(name == null) return;
8        User user = userService.getUserByName(name);
9        //得到原有的这个作者的cacheTag
10        List<CacheTag> cacheTagList = cacheTagService.getUserCacheTagList(user.getId());
11
12        /*new 5条  old 5条
13         * 会有这样的情况:1.new没有满 old也必定没有满  直接插入  2.new满了 old没满  需要将一条new 变成old 再插入数据
14         *            3.new满了old也满了  将一条old信息   去掉(即update)成新的这条
15         * 计数相加原则:如果已经存在这条信息  1.再new中 --->count加一   2.在old中--->flag变成new count不加一 查看是不是需要去掉old降级一个new等等
16         */
17
18        //是否已经存在map<tagid,new/old>
19        Map<Integer, CacheTag> mapNew = new HashMap<Integer, CacheTag>();
20        Map<Integer, CacheTag> mapOld = new HashMap<Integer, CacheTag>();
21
22        for(CacheTag var : cacheTagList) {
23            if(var.getFlag().equals("new")) {
24                mapNew.put(var.getTagId(), var);
25            }else {
26                mapOld.put(var.getTagId(), var);
27            }
28        }
29
30        for(int i = 0; i < tempTagId.length; i++) {
31
32            Integer tag_id = Integer.parseInt(tempTagId[i]);
33
34            if(mapNew.containsKey(tag_id)) {
35                CacheTag tempCacheTag = mapNew.get(tag_id);
36                tempCacheTag.setCount(tempCacheTag.getCount() + 1);
37                cacheTagService.save(tempCacheTag);
38            }else if(mapOld.containsKey(Integer.parseInt(tempTagId[i]))) {
39                //有这条记录 不过是old 需要变成new
40                CacheTag tempCacheTag = mapOld.get(tag_id);
41                tempCacheTag.setFlag("new");
42
43                if(mapNew.size() < 5){ //直接从old 变成  new(条数max-5)
44                    mapNew.put(tag_id, tempCacheTag);
45                    mapOld.remove(tag_id);
46                    cacheTagService.save(tempCacheTag);
47                } else {//需要从new中找到一条降级为old
48                    int count = Integer.MAX_VALUE;
49                    CacheTag minCacheTag = new CacheTag();
50                    for(Integer var : mapNew.keySet()) {
51                        if(mapNew.get(var).getCount() <= count) {
52                            minCacheTag = mapNew.get(var);  //需腰降级的new
53                        }
54                    }
55                    if(mapOld.size() < 5){ //将直接降级bian old
56                        minCacheTag.setFlag("old");
57                        cacheTagService.save(minCacheTag);//保存降级的new
58                        cacheTagService.save(tempCacheTag);//保存升级的old
59                        mapOld.put(minCacheTag.getTagId(), minCacheTag);
60                        mapNew.remove(minCacheTag.getId());
61                        mapNew.put(tag_id, tempCacheTag);
62                        mapOld.remove(tag_id);
63                    }else {
64                        //升级的old和降级的new互相换就可以(old 满了)
65
66                        mapNew.remove(minCacheTag.getTagId());
67                        mapOld.remove(tag_id);//移除升级的old 的ID
68
69                        minCacheTag.setFlag("old");
70                        cacheTagService.save(minCacheTag);//保存降级的new
71
72                        cacheTagService.save(tempCacheTag);//保存升级的old
73
74                        mapOld.put(minCacheTag.getTagId(), minCacheTag);
75                        mapNew.put(tag_id, tempCacheTag);
76                    }
77                }
78
79            }else {
80                //如果之前不存在这个tag
81                //new 是否满了
82                if(mapNew.size() < 5) {
83                    CacheTag tempCacheTag = new CacheTag(tag_id, user.getId(), 0, "new");
84                    mapNew.put(tag_id, tempCacheTag);
85                    cacheTagService.save(tempCacheTag);
86                }else {
87                    //将new中的一个转变成old
88                    //找到点击量最小的new变成old
89                    int count = Integer.MAX_VALUE;
90                    CacheTag minCacheTag = new CacheTag();
91                    for(Integer var : mapNew.keySet()) {
92                        if(mapNew.get(var).getCount() <= count) {
93                            minCacheTag = mapNew.get(var);//需要降级的new
94                        }
95                    }
96
97                     if((mapOld.size()) < 5){
98                        //保存新的这个new  如果old 没满
99                         CacheTag tempCacheTag = new CacheTag(tag_id, user.getId(), 0, "new");
100
101                         mapNew.put(tag_id, tempCacheTag);
102                         mapNew.remove(minCacheTag.getTagId());
103                         mapOld.put(minCacheTag.getTagId(), minCacheTag);
104                         minCacheTag.setFlag("old");
105
106                         cacheTagService.save(minCacheTag);//保存降级的new
107
108                         cacheTagService.save(tempCacheTag);//保存新的new
109                     }else {
110                         //找到需要去掉的这个old (内容替换成 新的这个new)
111                            count = Integer.MAX_VALUE;
112                            CacheTag minCacheTag2 = new CacheTag();
113                            for(Integer var : mapOld.keySet()) {
114                                if(mapOld.get(var).getCount() <= count) {
115                                    minCacheTag2 = mapOld.get(var);//找到需要淘汰的old
116                                }
117                            }
118
119                            mapOld.remove(minCacheTag2.getTagId());
120
121                            minCacheTag2.setFlag("new");
122                            minCacheTag2.setCount(0);
123                            minCacheTag2.setTagId(tag_id);
124
125                            cacheTagService.save(minCacheTag2);//保存新的这个new
126                            minCacheTag.setFlag("old");
127
128                            cacheTagService.save(minCacheTag);//需要降级的new
129
130                            mapNew.remove(minCacheTag.getTagId());
131                            mapNew.put(tag_id, minCacheTag2);
132                            mapOld.put(minCacheTag.getTagId(), minCacheTag);
133                     }
134
135                }
136
137            }
138        }
139
140    }
141

源码或运行文件及数据库

SSH:利用Struts2+Hibernate4+Spring4+SQLServer框架,搭建一个前后端web网站(1)

SSH:利用Struts2+Hibernate4+Spring4+SQLServer框架,搭建一个前后端web网站(2)

SSH:利用Struts2+Hibernate4+Spring4+SQLServer框架,搭建一个前后端web网站(4)

SSH:利用Struts2+Hibernate4+Spring4+SQLServer框架,搭建一个前后端web网站(5)

给TA打赏
共{{data.count}}人
人已打赏
安全技术

C++调用Python

2022-1-11 12:36:11

安全运维

redis的线程模型

2021-12-11 11:36:11

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索