• 企业项目开发--分布式缓存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时代,那些黑客正在如何打磨他们的“利器”?(二)

  • 相关阅读:
    I/O中断处理详细过程
    移动端事件touchstart、touchmove、touchend
    页面刷新整理
    transform:rotate在手机上显示有锯齿的解决方案大全
    CSS3盒模型温故
    CSS3颜色特征温故
    CSS3文本温故
    CSS3背景温故
    怪诞咖啡的简介
    CSS3边框温故
  • 原文地址:https://www.cnblogs.com/163yun/p/10136562.html
Copyright © 2020-2023  润新知