企业项目开发--分布式缓存memcached(3)
此文已由作者赵计刚授权网易云社区发布。
欢迎访问网易云社区,了解更多网易技术产品运营经验。
3.3、ssmm0-data
结构:

3.3.1、pom.xml
1 <?xml version="1.0" encoding="UTF-8"?>
2 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
4
5 <modelVersion>4.0.0</modelVersion>
6
7 <!-- 指定父模块 -->
8 <parent>
9 <groupId>com.xxx</groupId>
10 <artifactId>ssmm0</artifactId>
11 <version>1.0-SNAPSHOT</version>
12 </parent>
13
14 <groupId>com.xxx.ssmm0</groupId>
15 <artifactId>ssmm0-data</artifactId>
16
17 <name>ssmm0-data</name>
18 <packaging>jar</packaging><!-- 只是作为其他模块使用的工具 -->
19
20 <!-- 引入实际依赖 -->
21 <dependencies>
22 <!-- mysql -->
23 <dependency>
24 <groupId>mysql</groupId>
25 <artifactId>mysql-connector-java</artifactId>
26 </dependency>
27 <!-- 数据源 -->
28 <dependency>
29 <groupId>org.apache.tomcat</groupId>
30 <artifactId>tomcat-jdbc</artifactId>
31 </dependency>
32 <!-- mybatis -->
33 <dependency>
34 <groupId>org.mybatis</groupId>
35 <artifactId>mybatis</artifactId>
36 </dependency>
37 <dependency>
38 <groupId>org.mybatis</groupId>
39 <artifactId>mybatis-spring</artifactId>
40 </dependency>
41 <!-- servlet --><!-- 为了会用cookie -->
42 <dependency>
43 <groupId>javax.servlet</groupId>
44 <artifactId>javax.servlet-api</artifactId>
45 </dependency>
46 <!-- bc-加密 -->
47 <dependency>
48 <groupId>org.bouncycastle</groupId>
49 <artifactId>bcprov-jdk15on</artifactId>
50 </dependency>
51 <!-- cc加密 -->
52 <dependency>
53 <groupId>commons-codec</groupId>
54 <artifactId>commons-codec</artifactId>
55 </dependency>
56 <!-- guava cache -->
57 <dependency>
58 <groupId>com.google.guava</groupId>
59 <artifactId>guava</artifactId>
60 <version>14.0.1</version>
61 </dependency>
62 <!-- 引入自定义cache模块 -->
63 <dependency>
64 <groupId>com.xxx.ssmm0</groupId>
65 <artifactId>ssmm0-cache</artifactId>
66 <version>1.0-SNAPSHOT</version>
67 </dependency>
68 </dependencies>
69 </project>
说明:只引入了上边的ssmm0-cache模块。
3.3.2、Admin
1 package com.xxx.model.userManagement;
2
3 import java.io.Serializable;
4
5 import com.alibaba.fastjson.JSON;
6
7 /**
8 * 管理员
9 * 这里序列化,是为了向xmemcached中存储,否则会报异常;
10 * 当然除了用序列化之外,还可以将admin对象转化为json串,然后进行存储
11 */
12 public class Admin implements Serializable{
13
14 private static final long serialVersionUID = 7149009421720474527L;
15
16 private int id;
17 private String username;
18 private String password;
19
20 public int getId() {
21 return id;
22 }
23
24 public void setId(int id) {
25 this.id = id;
26 }
27
28 public String getUsername() {
29 return username;
30 }
31
32 public void setUsername(String username) {
33 this.username = username;
34 }
35
36 public String getPassword() {
37 return password;
38 }
39
40 public void setPassword(String password) {
41 this.password = password;
42 }
43
44 //将json串转为Admin
45 public static Admin parseJsonToAdmin(String jsonStr){
46 try {
47 return JSON.parseObject(jsonStr, Admin.class);
48 } catch (Exception e) {
49 e.printStackTrace();
50 return null;
51 }
52 }
53
54 //将当前实例转化为json串
55 public String toJson(){
56 return JSON.toJSONString(this);
57 }
58 }
说明:这里只添加了让该类实现java.io.Serializable接口,添加了序列号
注意:在实际使用中,把对象存入缓存有两种方式
序列化:使用上述的方式,或者使用其他序列化方式
将对象转化为json串,在该类中,有两个方法:一个将Admin-->Json,一个将Json-->Admin
这两种方式都可以,只是Java默认的序列化效率低且生成的码流大,但是使用方便,当然第二种方式使用也相当简单。
关于各种序列化的方式以及优缺点对比,查看《netty权威指南(第2版)》,或者查看我的"Java高效使用"系列的后续文章
3.3.3、AdminMapper
1 /**************memcached**************/
2
3 @Select("SELECT * FROM userinfo WHERE id = #{id}")
4 @Results(value = {
5 @Result(id = true, column = "id", property = "id"),
6 @Result(column = "username", property = "username"),
7 @Result(column = "password", property = "password") })
8 public Admin selectById(@Param("id") int id);
说明:添加了上述按照ID查找用户的方法。
3.3.4、AdminDao
1 /******************memcached********************/
2 public Admin getUserById(int id){
3 return adminMapper.selectById(id);
4 }
说明:添加了上述方法。
3.3.5、AdminService
1 /*********************memcached********************/
2 public Admin findAdminById(int id) {
3 //从缓存中获取数据
4 Admin admin = (Admin)MemcachedUtil.getCache(CachePrefix.USER_MANAGEMENT, String.valueOf(id));
5 //若缓存中有,直接返回
6 if(admin != null){
7 return admin;
8 }
9 //若缓存中没有,从数据库查询
10 admin = adminDao.getUserById(id);
11 //若查询出的数据不为null
12 if(admin!=null){
13 //将数据存入缓存
14 MemcachedUtil.setCacheWithNoReply(CachePrefix.USER_MANAGEMENT, String.valueOf(id), admin);
15 }
16 //返回从数据库查询的admin(当然也可能数据库中也没有,就是null)
17 return admin;
18 }
说明:添加了上述方法。
注意:
上述方法是缓存使用中最常见的模式,即"从缓存获取-->若没有,从数据库查询,存入缓存-->返回数据",这就是guava cache的get(Object key)使用一个方法完成的原子操作。
3.4、ssmm0-userManagement
在该模块中,只在一个类中添加了一个方法。
AdminController.java
1 /**
2 * 根据id查找Admin
3 */
4 @ResponseBody
5 @RequestMapping("/findAdminById")
6 public Admin findAdminById(@RequestParam(value="id") int id){
7
8 return adminService.findAdminById(id);
9 }
说明:下边这个方法就是该模块中唯一添加的一个方法。
4、测试
在浏览器输入"localhost:8080/ssmm0-userManagement/admin/findAdminById?id=1",这样就可以测试缓存,具体测试方式看《第七章 企业项目开发--本地缓存guava cache》
这里要说明的是两点:
由于在根pom.xml文件中将dev改成了服务器启动后默认使用的环境,所以在之后的测试中,不需要再修改环境了,但是实际上线时,一定要将prod改成默认环境才行
我想在上述URL中不输入项目名ssmm0-userManagement也可以访问相关资源,使用如下方式:run as-->run configurations..-->Context参数改为"/"即可

关于memcached的相关内容和Xmemcached的相关内容,请参看下边链接或者我的"Java缓存相关"的后续文章:
http://code.google.com/p/memcached/wiki/NewStart?tm=6
https://code.google.com/p/xmemcached/wiki/User_Guide_zh
免费领取验证码、内容安全、短信发送、直播点播体验包及云服务器等套餐
更多网易技术、产品、运营经验分享请点击。
相关文章:
【推荐】 知物由学|AI时代,那些黑客正在如何打磨他们的“利器”?(二)
企业项目开发--分布式缓存memcached(3)的更多相关文章
- 第八章 企业项目开发--分布式缓存memcached
		
注意:本节代码基于<第七章 企业项目开发--本地缓存guava cache> 1.本地缓存的问题 本地缓存速度一开始高于分布式缓存,但是随着其缓存数量的增加,所占内存越来越大,系统运行内存 ...
 - 企业项目开发--分布式缓存Redis
		
第九章 企业项目开发--分布式缓存Redis(1) 注意:本章代码将会建立在上一章的代码基础上,上一章链接<第八章 企业项目开发--分布式缓存memcached> 1.为什么用Redis ...
 - 第九章 企业项目开发--分布式缓存Redis(1)
		
注意:本章代码将会建立在上一章的代码基础上,上一章链接<第八章 企业项目开发--分布式缓存memcached> 1.为什么用Redis 1.1.为什么用分布式缓存(或者说本地缓存存在的问题 ...
 - 第十章 企业项目开发--分布式缓存Redis(2)
		
注意:本章代码是在上一章的基础上进行添加修改,上一章链接<第九章 企业项目开发--分布式缓存Redis(1)> 上一章说了ShardedJedisPool的创建过程,以及redis五种数据 ...
 - 第七章 企业项目开发--本地缓存guava cache
		
1.在实际项目开发中,会使用到很多缓存技术,而且数据库的设计一般也会依赖于有缓存的情况下设计. 常用的缓存分两种:本地缓存和分布式缓存. 常用的本地缓存是guava cache,本章主要介绍guava ...
 - 企业项目开发--本地缓存guava cache(1)
		
此文已由作者赵计刚授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 1.在实际项目开发中,会使用到很多缓存技术,而且数据库的设计一般也会依赖于有缓存的情况下设计. 常用的缓存分 ...
 - 企业项目开发--本地缓存guava cache(2)
		
此文已由作者赵计刚授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. AdminCacheKey: package com.xxx.vo.userManagement; /** ...
 - 第十一章 企业项目开发--消息队列activemq
		
注意:本章代码基于 第十章 企业项目开发--分布式缓存Redis(2) 代码的github地址:https://github.com/zhaojigang/ssmm0 消息队列是分布式系统中实现RPC ...
 - CYQ.Data V5 分布式缓存MemCached应用开发介绍
		
前言 今天大伙还在热议关于.NET Core的东西,我只想说一句:在.NET 跨平台叫了这么多年间,其实人们期待的是一个知名的跨平台案例,而不是一堆能跨平台的消息. 好,回头说说框架: 在框架完成数据 ...
 
随机推荐
- 实验1:c++简单程序设计(1)
			
//文中有格式错误请无视 //这个编辑器一言难尽 实验目的 1. 掌握c++中类c部分的编程知识: 数据类型,常量,变量,运算符,表达式,分支结构,循环结构 2. 掌握C++中数据输入和输出的基本方法 ...
 - VK Cup 2016 D. Bear and Two Paths 模拟
			
D. Bear and Two Paths time limit per test 2 seconds memory limit per test 256 megabytes input standa ...
 - efcore 级联删除
			
https://docs.microsoft.com/en-us/ef/core/saving/cascade-delete#required-relationships Optional relat ...
 - 创建 maven  web 项目时 ,更改 为  Dynamic web module 为 3.0 时 项目报错
			
更改 项目 project facets 将 dynamic web module 改为 3.0 ,如果 java 的 版本 为 1.7 以下 ,项目会出现 叉 , 原因是 web 3.0 要和 ...
 - KBMMW 4.6 正式版发布
			
喜大普奔迎新年! Merry Christmas! We are happy to announce the release of kbmMW v. 4.60.00 Professional and ...
 - hdu-1179(匈牙利算法)
			
题目链接: 思路:找n个巫师和m个魔棒匹配的问题,匈牙利算法模板 匈牙利算法:https://blog.csdn.net/sunny_hun/article/details/80627351 #inc ...
 - python编码(七)
			
本文中,以'哈'来解释作示例解释所有的问题,“哈”的各种编码如下: 1. UNICODE (UTF8-16),C854:2. UTF-8,E59388:3. GBK,B9FE. 一.python中的s ...
 - 删除重复的feature vba VS 删除重复的feature python
			
VBA: Sub deleteDuplicatedFeature() Dim app As IApplication Set app = Application Dim pMxDocument As ...
 - SIGPIPE导致cronttab和shell脚本等工作异常
			
cron和sh等可能被某些共享库hook,而这些共享库可能会触发SIGPIPE,导致crontab和shell工作异常,解决办法是程序忽略SIGPIPE或脚本中使用"trap '' SIGP ...
 - 201709019工作日记--sleep、wait、notify的使用详解
			
1. sleep()和wait()的区分 (1)这两个方法来自不同的类分别是,sleep来自Thread类,wait来自Object类. sleep是Thread的静态类方法,谁调用的谁去睡觉,即使在 ...