博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
缓存(本地缓存)
阅读量:4588 次
发布时间:2019-06-09

本文共 24387 字,大约阅读时间需要 81 分钟。

在实际项目开发中,会使用到很多缓存技术,而且数据库的设计一般也会依赖于有缓存的情况下设计。

  • 常用的缓存分两种:本地缓存和分布式缓存。
  • 常用的本地缓存是guava cache,本文主要介绍guava cache在项目中的使用,首先来了解下为什么使用缓存,以数据库(如MYSQL)、本地缓存(如guava cache)及分布式缓存(如redis)的区别来讲:

一、数据库、本地缓存及分布式缓存的区别

1、存储位置:

  • 数据库:任何机器硬盘,开关机时,数据不丢失
  • 本地缓存:本机内存,一旦关机,之前的数据丢失
  • 分布式缓存(如redis):存在redis所在机器的内存,一旦redis所在机器关机,数据丢失

2、持久化:

  • 数据库:可以持久化
  • 本地缓存:不可以持久化
  • 分布式缓存(如redis):不可以持久化

3、访问速度:

  • 数据库:慢
  • 本地缓存:最快
  • 分布式缓存:快

4、扩展性:

  • 数据库:可扩展,可存在其他机器的硬盘
  • 本地缓存:不可扩展,只能存在本机内存
  • 分布式缓存:可扩展,可存在其他机器的内存

5、使用场景:

  • 数据库:需要实现持久化保存
  • 本地缓存:需要快速访问,但需要考虑内存大小
  • 分布式缓存:1)需要快速访问,不需要考虑内存大小

                         2)需要实现持久化,但会丢失一些数据

                         3)需要让缓存集中在一起,访问任一机器上内存中的数据都可以从缓存中得到

二、实例

     基于SSMM框架整合步骤,连接()的flowershop项目。

1、启动MYSQL

2、创建mvn项目

  • 配置pom.xml文件(这里直接给出已经配置好的)
  • 1 
    2
    4 5
    4.0.0
    6 7
    com.wn
    8
    flowershop
    9
    1.0-SNAPSHOT
    10
    flowershop
    11
    war
    12
    13
    1.8
    14
    UTF-8
    15
    UTF-8
    16
    4.2.4.RELEASE
    17
    3.2.8
    18
    1.2.2
    19
    2.6.4
    20
    3.1.0
    21
    22
    23
    24
    25
    javax.servlet
    26
    javax.servlet-api
    27
    ${servlet-api.version}
    28
    provided
    29
    30
    31
    32
    org.springframework
    33
    spring-core
    34
    ${spring.version}
    35
    36
    37
    org.springframework
    38
    spring-beans
    39
    ${spring.version}
    40
    41
    42
    org.springframework
    43
    spring-context
    44
    ${spring.version}
    45
    46
    47
    48
    org.springframework
    49
    spring-web
    50
    ${spring.version}
    51
    52
    53
    org.springframework
    54
    spring-webmvc
    55
    ${spring.version}
    56
    57
    58
    59
    org.springframework
    60
    spring-jdbc
    61
    ${spring.version}
    62
    63
    64
    65
    mysql
    66
    mysql-connector-java
    67
    5.1.27
    68
    runtime
    69
    70
    71
    72
    org.apache.tomcat
    73
    tomcat-jdbc
    74
    7.0.47
    75
    76
    77
    78
    org.mybatis
    79
    mybatis
    80
    ${mybatis.version}
    81
    82
    83
    84
    org.mybatis
    85
    mybatis-spring
    86
    ${mybatis-spring.version}
    87
    88
    89
    90
    com.fasterxml.jackson.core
    91
    jackson-annotations
    92
    ${jackson.version}
    93
    94
    95
    com.fasterxml.jackson.core
    96
    jackson-core
    97
    ${jackson.version}
    98
    99
    100
    com.fasterxml.jackson.core
    101
    jackson-databind
    102
    ${jackson.version}
    103
    104
    105
    106
    com.google.guava
    107
    guava
    108
    14.0.1
    109
    110
    111
    112
    113
    114
    org.apache.maven.plugins
    115
    maven-compiler-plugin
    116
    117
    1.8118
    1.8
    119
    utf-8
    120
    121
    122
    123
    124
    View Code

    这里用到guava cache,所以别忘了引入依赖guava cache

  • 1               
    2
    3
    com.google.guava
    4
    guava
    5
    14.0.1
    6
  •  引入mysql库配置(src/main/resources)

    jdbc.properties

1 jdbc.driverClassName = com.mysql.jdbc.Driver2 jdbc.url = jdbc:mysql://localhost:3306/wn3 jdbc.username = root4 jdbc.password = 123456
  • 引入spring配置文件(src/main/resources)

        spring.xml

  • 1 
    2
    10 11
    12
    13
    14
    15
    16
    17 18
    19
    21
    22
    23
    24
    25
    26 27
    28
    29
    30
    31
    32
    classpath*:mapper/*Mapper.xml
    33
    34
    35
    36
    37
    38
    39
    40
    View Code
  • 创建基本包(package)结构(controller、service、dao、mapper、model)

  • 创建src/main/resources/mapper的folder包,用于放置*Mapper.xml
  • 配置web.xml,使spring生效

  • 1 
    2
    5
    6
    dispatcherServlet
    7
    org.springframework.web.servlet.DispatcherServlet
    8
    9
    contextConfigLocation
    10
    classpath*:spring*.xml
    11
    12
    1
    13
    14
    15
    dispatcherServlet
    16
    /
    17
    18 19
    20
    encodingFilter
    21
    org.springframework.web.filter.CharacterEncodingFilter
    22
    23
    encoding
    24
    UTF-8
    25
    26
    27
    forceEncoding
    28
    true
    29
    30
    31
    32
    encodingFilter
    33
    /*
    34
    35
    View Code

3使用mybatis-generator创建mybatis的xml文件、mapper层接口、model层

  • 将生成的类、接口、xml拷贝到项目中
  • FlowerMapper.xml
  • 1 
    2 3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13 id, type, colour, number, price, florescence 14
    15
    22
    29
    30
    54
    61
    62 delete from 63 t_flower 64 where id = #{id,jdbcType=INTEGER} 65
    66
    67 insert into t_flower (id, 68 type, colour, 69 number, price, florescence 70 ) 71 values 72 (#{id,jdbcType=INTEGER}, #{type,jdbcType=VARCHAR}, 73 #{colour,jdbcType=VARCHAR}, 74 #{number,jdbcType=INTEGER}, 75 #{price,jdbcType=DECIMAL}, #{florescence,jdbcType=INTEGER} 76 ) 77
    78
    79 insert into t_flower 80
    81
    82 id, 83
    84
    85 type, 86
    87
    88 colour, 89
    90
    91 number, 92
    93
    94 price, 95
    96
    97 florescence, 98
    99
    100
    101
    102 #{id,jdbcType=INTEGER},103
    104
    105 #{type,jdbcType=VARCHAR},106
    107
    108 #{colour,jdbcType=VARCHAR},109
    110
    111 #{number,jdbcType=INTEGER},112
    113
    114 #{price,jdbcType=DECIMAL},115
    116
    117 #{florescence,jdbcType=INTEGER},118
    119
    120
    121
    122 update t_flower123
    124
    125 type = #{type,jdbcType=VARCHAR},126
    127
    128 colour = #{colour,jdbcType=VARCHAR},129
    130
    131 number = #{number,jdbcType=INTEGER},132
    133
    134 price = #{price,jdbcType=DECIMAL},135
    136
    137 florescence = #{florescence,jdbcType=INTEGER},138
    139
    140 where id = #{id,jdbcType=INTEGER}141
    142
    143 update t_flower144 set type = #{type,jdbcType=VARCHAR},145 colour =146 #{colour,jdbcType=VARCHAR},147 number = #{number,jdbcType=INTEGER},148 price =149 #{price,jdbcType=DECIMAL},150 florescence =151 #{florescence,jdbcType=INTEGER}152 where id = #{id,jdbcType=INTEGER}153
    154
    View Code
  • Flower
  • 1 package com.wn.model; 2  3 public class Flower { 4     private Integer id; 5  6     private String type; 7  8     private String colour; 9 10     private Integer number;11 12     private Long price;13 14     private Integer florescence;15 16     public Integer getId() {17         return id;18     }19 20     public void setId(Integer id) {21         this.id = id;22     }23 24     public String getType() {25         return type;26     }27 28     public void setType(String type) {29         this.type = type == null ? null : type.trim();30     }31 32     public String getColour() {33         return colour;34     }35 36     public void setColour(String colour) {37         this.colour = colour == null ? null : colour.trim();38     }39 40     public Integer getNumber() {41         return number;42     }43 44     public void setNumber(Integer number) {45         this.number = number;46     }47 48     public Long getPrice() {49         return price;50     }51 52     public void setPrice(Long price) {53         this.price = price;54     }55 56     public Integer getFlorescence() {57         return florescence;58     }59 60     public void setFlorescence(Integer florescence) {61         this.florescence = florescence;62     }63 }
    View Code
  • FlowerMapper.java
  • 1 package com.wn.mapper; 2  3 import java.util.List; 4  5 import org.apache.ibatis.annotations.Param; 6  7 import com.wn.model.Flower; 8  9 public interface FlowerMapper {10     int deleteByPrimaryKey(Integer id);11 12     int insert(Flower record);13 14     int insertSelective(Flower record);15 16     Flower selectByPrimaryKey(Integer id);17 18     List
    selectByCondition(Flower record);19 20 List
    selectLimit(@Param("start") int start, @Param("size") int size);21 22 int updateByPrimaryKeySelective(Flower record);23 24 int updateByPrimaryKey(Flower record);25 26 List
    selectByColour(String colour);27 }
    View Code

4、编写dao、service、controller

  • FlowerDao
  • 1 package com.wn.dao; 2  3 import java.util.List; 4  5 import org.springframework.beans.factory.annotation.Autowired; 6 import org.springframework.stereotype.Repository; 7  8 import com.wn.mapper.FlowerMapper; 9 import com.wn.model.Flower;10 11 @Repository12 public class FlowerDao {13     @Autowired14     private FlowerMapper flowerMapper;15 16     public boolean add(Flower flower) {17         return flowerMapper.insert(flower) == 1 ? true : false;18     }19 20     public Flower getById(Integer id) {21         return flowerMapper.selectByPrimaryKey(id);22     }23 24     public boolean deleteById(Integer id) {25         return flowerMapper.deleteByPrimaryKey(id) == 1 ? true : false;26     }27 28     public boolean update(Flower flower) {29         return flowerMapper.updateByPrimaryKey(flower) == 1 ? true : false;30     }31 32     public boolean update2(Flower flower) {33         return flowerMapper.updateByPrimaryKeySelective(flower) == 1 ? true : false;34     }35 36     /*37      * 实现条件不定查询38      */39     public List
    getByCondition(Flower flower) {40 return flowerMapper.selectByCondition(flower);41 }42 43 /*44 * 传入开始显示记录的索引,即显示记录的条数,实现分页显示功能45 */46 public List
    selectLimit(int start, int size) {47 return flowerMapper.selectLimit(start, size);48 }49 50 public List
    selectByColour(String colour) {51 return flowerMapper.selectByColour(colour);52 }53 }
    View Code
  • FlowerService
  • 1 package com.wn.service; 2  3 import java.util.List; 4 import java.util.concurrent.ExecutionException; 5 import java.util.concurrent.TimeUnit; 6  7 import org.springframework.beans.factory.annotation.Autowired; 8 import org.springframework.stereotype.Service; 9 10 import com.google.common.cache.CacheBuilder;11 import com.google.common.cache.CacheLoader;12 import com.google.common.cache.LoadingCache;13 import com.wn.dao.FlowerDao;14 import com.wn.model.Flower;15 16 @Service17 public class FlowerService {18     @Autowired19     private FlowerDao flowerDao;20 21     public boolean addFlower(String type, String colour, Integer number, long price, Integer florescence) {22         Flower flower = new Flower();23         flower.setType(type);24         flower.setColour(colour);25         flower.setNumber(number);26         flower.setPrice(price);27         flower.setFlorescence(florescence);28         return flowerDao.add(flower);29     }30 31     public Flower getFlower(Integer id) {32         return flowerDao.getById(id);33     }34 35     public boolean deleteFlower(Integer id) {36         return flowerDao.deleteById(id);37     }38 39     public boolean updateFlower(Integer id, String type, String colour, Integer number, Long price,40             Integer florescence) {41         Flower flower = flowerDao.getById(id);42         flower.setType(type);43         flower.setColour(colour);44         flower.setNumber(number);45         flower.setPrice(price);46         flower.setFlorescence(florescence);47         return flowerDao.update(flower);48     }49 50     public boolean updateFlower2(Integer id, String type, String colour, Integer number, Long price,51             Integer florescence) {52         Flower flower = flowerDao.getById(id);53         flower.setType(type);54         flower.setColour(colour);55         flower.setNumber(number);56         flower.setPrice(price);57         flower.setFlorescence(florescence);58         return flowerDao.update2(flower);59     }60 61     public List
    getFlowerByCondition(String type, String colour, Integer number, Long price,62 Integer florescence) {63 Flower flower = new Flower();64 flower.setColour(colour);65 flower.setType(type);66 flower.setNumber(number);67 flower.setPrice(price);68 flower.setFlorescence(florescence);69 return flowerDao.getByCondition(flower);70 }71 72 public List
    selectLimit(Integer start, Integer size) {73 return flowerDao.selectLimit(start, size);74 }75 76 /**本地缓存-guava cache的流程:77 * 1、从guava cache中获取 -- flowerCache.get(colour) 78 * 2、如果存在,直接返回数据给controller79 * 3、如果不存在,调用load方法(先从mysql获取,再存入guava cache,最后从guava80 * cache读出该数据,返回给controller)81 */82 public List
    getFlowerWithCache(String colour) {83 List
    flowerList = null;84 try {85 flowerList = flowerCache.get(colour);86 } catch (ExecutionException e) {87 e.printStackTrace();88 }89 return flowerList;90 }91 LoadingCache
    > flowerCache = CacheBuilder.newBuilder().expireAfterWrite(2, TimeUnit.MINUTES)92 .maximumSize(200).build(new CacheLoader
    >() {93 public List
    load(String colour) {94 System.out.println("从数据库查");95 return flowerDao.selectByColour(colour);96 }97 });98 }
    View Code
     
  • FlowerController
  • 1 package com.wn.controller; 2  3 import java.util.List; 4  5 import org.springframework.beans.factory.annotation.Autowired; 6 import org.springframework.web.bind.annotation.PathVariable; 7 import org.springframework.web.bind.annotation.RequestMapping; 8 import org.springframework.web.bind.annotation.RequestMethod; 9 import org.springframework.web.bind.annotation.RequestParam;10 import org.springframework.web.bind.annotation.RestController;11 12 import com.wn.model.Flower;13 import com.wn.service.FlowerService;14 15 @RestController16 @RequestMapping("/flower")17 public class FlowerController {18     @Autowired19     private FlowerService flowerService;20 21     @RequestMapping(value = "/add", method = RequestMethod.POST)22     public boolean addFlower(@RequestParam("type") String type, @RequestParam("colour") String colour,23             @RequestParam("number") Integer number, @RequestParam("price") Long price,24             @RequestParam("florescence") Integer florescence) {25         return flowerService.addFlower(type, colour, number, price, florescence);26     }27 28     @RequestMapping(value = "/get", method = RequestMethod.GET)29     public Flower getFlower(Integer id) {30         return flowerService.getFlower(id);31     }32 33     @RequestMapping(value = "/delete/{id}", method = RequestMethod.DELETE)34     public boolean deleteFlower(@PathVariable("id") Integer id) {35         return flowerService.deleteFlower(id);36     }37 38     @RequestMapping(value = "/update", method = RequestMethod.PUT)39     public boolean updateFlower(@RequestParam(value = "id") Integer id,40             @RequestParam(value = "type", required = false) String type,41             @RequestParam(value = "colour", required = false) String colour,42             @RequestParam(value = "number", required = false) Integer number,43             @RequestParam(value = "price", required = false) Long price,44             @RequestParam(value = "florescence", required = false) Integer florescence) {45 46         return flowerService.updateFlower(id, type, colour, number, price, florescence);47     }48 49     @RequestMapping(value = "/update2", method = RequestMethod.PUT)50     public boolean updateFlower2(@RequestParam(value = "id") Integer id,51             @RequestParam(value = "type", required = false) String type,52             @RequestParam(value = "colour", required = false) String colour,53             @RequestParam(value = "number", required = false) Integer number, @RequestParam(value = "price") Long price,54             @RequestParam(value = "florescence", required = false) Integer florescence) {55         return flowerService.updateFlower2(id, type, colour, number, price, florescence);56     }57 58     @RequestMapping(value = "/getFlowerByConditon", method = RequestMethod.GET)59     public List
    getFlowerByCondition(@RequestParam(value = "type", required = false) String type,60 @RequestParam(value = "colour", required = false) String colour,61 @RequestParam(value = "number", required = false) Integer number,62 @RequestParam(value = "price", required = false) Long price,63 @RequestParam(value = "florescence", required = false) Integer florescence) {64 return flowerService.getFlowerByCondition(type, colour, number, price, florescence);65 }66 67 @RequestMapping(value = "/getFlowerByLimit", method = RequestMethod.GET)68 public List
    getFlowerByLimit(@RequestParam("start") Integer start, @RequestParam("size") Integer size) {69 return flowerService.selectLimit(start, size);70 }71 72 // 从本地缓存获取数据,若本地缓存没有,再从数据库获取73 @RequestMapping(value = "/getWithCache", method = RequestMethod.GET)74 public List
    getWithCache(@RequestParam("colour") String colour) {75 return flowerService.getFlowerWithCache(colour);76 }77 }
    View Code

     

转载于:https://www.cnblogs.com/wangna----558169/p/6081683.html

你可能感兴趣的文章
android用户界面之Gallery3D学习资料汇总
查看>>
[编写高质量代码:改善java程序的151个建议]建议62 警惕数组的浅拷贝
查看>>
h5移动端适配iOS遇到的问题
查看>>
20. 最长公共子串(ToDo)[LCS]
查看>>
浮动:图解两栏布局
查看>>
CSS3 box-sizing 属性
查看>>
expect用法
查看>>
JavaScript [ 转 ] —— 面向对象编程(二):构造函数的继承
查看>>
$百度应用引擎BAE的使用与应用部署
查看>>
Keras入门——(6)长短期记忆网络LSTM(三)
查看>>
高效算法的常用技术(算法导论)
查看>>
TCP、UDP套接字网络协议
查看>>
STDIN_FILENO与stdin区别(转)
查看>>
页面操作postback后保持滚动条位置
查看>>
nginx动静分离小示例
查看>>
nginx socket转发设置
查看>>
centos samba搭建
查看>>
Android Studio 错误: 非法字符: '\ufeff'
查看>>
并发编程--一堆锁,GIL,同步异步,Event事件
查看>>
svn配置
查看>>