企业项目开发--分布式缓存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时代,那些黑客正在如何打磨他们的“利器”?(二)
转载于:https://www.cnblogs.com/163yun/p/10136562.html
企业项目开发--分布式缓存memcached(3)相关推荐
- .NET分布式缓存Memcached测试体验
一直在学习关注大访问量网站的缓存是如何实现,之前看过Memcached的资料,忙于没有时间来真正测试一下,今天测试下分布式缓存Memcached 首先要在缓存服务器上安装安装:memcached(1. ...
- 分布式缓存-Memcached
分布式缓存-Memcached (2012-03-29 17:01:09) 分布式缓存出于如下考虑,首先是缓存本身的水平线性扩展问题,其次是缓存大并发下的本身的性能问题,再次避免缓存的单点故障 ...
- 分布式缓存memcached
Memcached是一款开源.高性能.分布式内存对象缓存系统,可应用各种需要缓存的场景,其主要目的是通过降低对数据库的访问来加速web应用程序.它是一个基于内存的"键值对"存储,用 ...
- ITOO4.1之缓存—分布式缓存Memcached学习(理论篇)
1. 何为缓存? 缓存就是数据交换的缓冲区(称作Cache),当某一硬件要读取数据时,会首先从缓存中查找需要的数据,如果找到了则直接执行,找不到的话则从内存中找.由于缓存的运行速度比内存快 ...
- 企业项目开发--切分配置文件
此文已由作者赵计刚授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 本章内容在第三章<Java框架整合--企业中的项目架构以及多环境分配>的代码上做修改,链接如下: ...
- 第四章 企业项目开发--切分配置文件
本章内容在第三章<Java框架整合--企业中的项目架构以及多环境分配>的代码上做修改,链接如下: http://www.cnblogs.com/java-zhao/p/5115136.ht ...
- 分布式缓存Memcached之Java使用篇
一.Memcache的客户端类型: 1. 官方提供的基于传统阻塞io由Greg Whalin维护的客户端 https://github.com/gwhalin/Memcached-Java-Cli ...
- 设计一个串口服务器设备.《需求分析报告》,《项目开发,分布式多串口交换服务器的设计与实现...
摘要: 随着信息技术和物联网技术的迅猛发展,TCP/IP网络应用呈现白热化趋势,各种以TCP/IP网络为主的通信设备已经成为主流,网络似乎无处不在.这种局面使得传统的以串行通信为主要通信方式的设备逐渐 ...
- 企业项目开发--企业中的项目架构以及多环境分配(2)
此文已由作者赵计刚授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 2.2.2.ssmm0-data pom.xml <?xml version="1.0&qu ...
最新文章
- Java使用Lettuce操作redis
- 印度视觉设计师Rishab平面设计作品,简直太美了!
- linux命令查看几位,Linux每周几个命令(一)--查找篇
- 【图论】【二叉树】以先序字符串方式建立二叉树
- Qt学习笔记之QString
- ADO.net商机题目
- Spring开启注解AOP的支持放置的位置
- jdk1.7的新特性
- Python错误:'tuple' object is not callable
- Scratch可视化的编程工具
- 大数据做基础 构建流动人口健康屏障
- DS1302时钟模块通信原理(SPI总线)
- oracle roseha 配置,RoseHA8.5 for Windows Oracle11g配置文档
- win10显示未插入扬声器或耳机的解决方案
- Windows 7装机必备 - 主流品牌驱动大集合
- STM32标准库与HAL库全系列下载地址
- 基于jsp的实验室预约管理系统的设计与实现
- fatal:unable to create “D:/“ file existsanother git process seems to be running in this repository
- 一个HR工资变化,网友直呼太假了
- AutoCad相关知识:acdb和acge