SpringBoot+SSM+Redis 实现缓存

搭建环境:
IDEA,jdk1.8,springboot1.5.3

新建springboot项目  依赖选择如下


springboot的推荐项目结构如下

其中
  • root package结构:com.example.myproject
  • 应用主类Application.java置于root package下,通常我们会在应用主类中做一些框架配置扫描等配置, 我们放在root package下可以帮助程序减少手工配置来加载到我们希望被Spring加载的内容
  • 实体(Entity)与数据访问层(Repository)置于com.example.myproject.domain包下
  • 逻辑层(Service)置于com.example.myproject.service包下
  • Web层(web)置于com.example.myproject.web包下
搭建完的项目结构如下

本文采用mybatis-generator自动生成mapper,dao,entity,具体操作步骤见
https://blog.csdn.net/sinat_29774479/article/details/78542626  Intellji IDE使用mybatis-generator自动生成mybatis相关文件

删除application.properties  新建application.yml,
server:
    port: 8080

spring:
    datasource:
        name: test
        url: jdbc:mysql://127.0.0.1:3306/world
        username: root
        password: 1234
        # 使用 druid 数据源
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.jdbc.Driver
        filters: stat
        maxActive: 20
        initialSize: 1
        maxWait: 60000
        minIdle: 1
        timeBetweenEvictionRunsMillis: 60000
        minEvictableIdleTimeMillis: 300000
        validationQuery: select 'x'
        testWhileIdle: true
        testOnBorrow: false
        testOnReturn: false
        poolPreparedStatements: true
        maxOpenPreparedStatements: 20

redis:
    host: 171.188.96.88
    port: 6379
    password: root
mybatis:
    mapper-locations: classpath:mapper/*.xml
    type-aliases-package: com.redis.domain

#pagehelper 分页插件
pagehelper:
    helperDialect: mysql
    reasonable: true
    supportMethodsArguments: true
    params: count=countSql

添加redis的配置类,继承CachingConfigurerSupport根据自己需要重写方法
package com.redis.config;

import com.fasterxml.jackson.annotation. JsonAutoDetect ;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.cache.annotation. EnableCaching ;
import org.springframework.cache.interceptor.KeyGenerator;
import org.springframework.context.annotation. Bean ;
import org.springframework.context.annotation. Configuration ;
import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;

import java.lang.reflect.Method;


/**
* Redis 缓存配置类
*
* @author wl
*/
@Configuration
@EnableCaching
public class RedisConfig extends CachingConfigurerSupport {
/* 定义缓存数据 key 生成策略的 bean
包名 + 类名 + 方法名 + 所有参数
*/
@Bean
public KeyGenerator wiselyKeyGenerator() {
return new KeyGenerator() {
@Override
public Object generate(Object target, Method method, Object... params) {
StringBuilder sb = new StringBuilder();
sb.append(target.getClass().getName());
sb.append(method.getName());
for (Object obj : params) {
sb.append(obj.toString());
}
return sb.toString();
}
};

}

/* 要启用 spring 缓存支持 , 需创建一个 CacheManager bean CacheManager 接口有很多实现,这里 Redis 的集成,用 RedisCacheManager 这个实现类
Redis 不是应用的共享内存,它只是一个内存服务器,就像 MySql 似的,
我们需要将应用连接到它并使用某种 语言 进行交互,因此我们还需要一个连接工厂以及一个 Spring Redis 对话要用的 RedisTemplate
这些都是 Redis 缓存所必需的配置,把它们都放在自定义的 CachingConfigurerSupport
*/
@Bean
public CacheManager cacheManager(
@SuppressWarnings ( "rawtypes" ) RedisTemplate redisTemplate) {
RedisCacheManager cacheManager = new RedisCacheManager(redisTemplate);
// cacheManager.setDefaultExpiration(60);// 设置缓存保留时间( seconds
return cacheManager;
}

//1. 项目启动时此方法先被注册成 bean spring 管理
@Bean
public RedisTemplate<String, String> redisTemplate(
RedisConnectionFactory factory) {
StringRedisTemplate template = new StringRedisTemplate(factory);
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object. class );
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor. ALL , JsonAutoDetect .Visibility. ANY );
om.enableDefaultTyping(ObjectMapper.DefaultTyping. NON_FINAL );
jackson2JsonRedisSerializer.setObjectMapper(om);
template.setValueSerializer(jackson2JsonRedisSerializer);
template.afterPropertiesSet();
return template;
}
}

新建controller
package com.redis.controller;

import com.redis.service.CityService;
import org.springframework.beans.factory.annotation. Autowired ;
import org.springframework.boot.autoconfigure. EnableAutoConfiguration ;
import org.springframework.web.bind.annotation. RequestMapping ;
import org.springframework.web.bind.annotation. ResponseBody ;
import org.springframework.web.bind.annotation. RestController ;

@RestController
@EnableAutoConfiguration
@RequestMapping ( "/query" )
public class CityController {

@Autowired
private CityService cityService ;

@ResponseBody
@RequestMapping ( "/findAll" )
public Object findAll() {
return cityService .selectAllCity();
}
}

在CityMapper.xml中加入
< select id ="selectAllCity" resultMap ="BaseResultMap" >
select
< include refid ="Base_Column_List" />
from city
</ select >
新建service
package com.redis.service;

import com.redis.domain.City;

import java.util.List;

public interface CityService {
List<City> selectAllCity();
}
实现service接口
package com.redis.service;

import com.redis.dao.CityMapper;
import com.redis.domain.City;
import org.springframework.beans.factory.annotation. Autowired ;
import org.springframework.cache.annotation. Cacheable ;
import org.springframework.stereotype. Service ;

import java.util.List;

@Service (value = "cityService" )
public class CityServiceImpl implements CityService {
@Autowired
private CityMapper cityMapper ;

@Override
@Cacheable (value = "all" , keyGenerator = "wiselyKeyGenerator" )
public List<City> selectAllCity() {
return cityMapper .selectAllCity();
}

}
查看redis数据库,发现第二次查询时间大幅减少,且出现配置中的缓存

猜你喜欢

转载自blog.csdn.net/sinat_29774479/article/details/80108534