spring缓存与Redis

数据库配置:

spring.datasource.url=jdbc:mysql://localhost:3306/spring_cache
spring.datasource.username=root
spring.datasource.password=111111

Redis配置:

spring.redis.host=127.0.0.1

Redis的下载安装:

1.官网下载:https://redis.io/download

2.启动redis:进入redis目录下redis-server.exe redis.windows.conf即可。

3.安装RedisDesktopManager,百度找个破解版。

开启缓存(主程序):

@EnableCaching

Mybatis包扫描:

@MapperScan("com.chriswei.cache.mapper")
//在Main类上

Service配置:

//指定缓存块的名字,全局,用在类名
@CacheConfig(cacheNames = "emp")
public class EmployeeService {}
//指定缓存块的名字,用在方法
@Cacheable(cacheNames = "emp")
public Employee getEmployee(Integer id){}
//更新数据库后更新缓存(分先后)
//key还可以用result等,除此之外还有condition跟unless可以用
@CachePut(value = "emp",key = "#employee.id")
public Employee updateEmployee(Employee employee){}
//清除缓存
@CacheEvict(value = "emp",key = "#id")
public String deleteEmployee(Integer id){}

除此之外,Key还可以换成keyGenerator,自己指定一个Key的生成策略。

Mybatis的CRUD:

@Mapper
public interface EmployeeMapper {
    @Select("SELECT * FROM EMPLOYEE WHERE ID = #{ID}")
    public Employee getEmployeeById(Integer id);

    @Update("UPDATE EMPLOYEE SET LASTNAME=#{lastName},EMAIL=#{email},GENDER=#{gender},DID=#{dId} WHERE ID=#{id}")
    public void updateEmployee(Employee employee);

    @Delete("DELETE FROM EMPLOYEE WHERE ID=#{ID}")
    public void deleteEmployeeById(Integer id);

    @Insert("INSERT INTO EMPLOYEE(LASTNAME,EMAIL,GENDER,DID) VALUES(#{lastName},#{email},#{gender},#{dId})")
    public void insertEmployee(Employee employee);
}
//只需要写接口就行了
//特别注意,SQL语句中的实体类属性要区分大小写,#{lastName}不能写成#{LASTNAME}。

pom依赖:(Mybatis都被集成了,主要就是引入Redis的starter)

官网导航:https://docs.spring.io/spring-boot/docs/2.1.1.RELEASE/reference/htmlsingle/#using-boot-starter

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>1.3.2</version>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>

Redis模板操作:

    @Autowired
    StringRedisTemplate stringRedisTemplate;

    @Autowired
    RedisTemplate redisTemplate;

如使用redisTemplate.opsForXXX.XX()来操作。

重点:使用Redis存储数据的转JSON操作。

得写一个独立的CacheManager 来处理,不然存入redis里的是JDBC的格式化数据。

    @Bean
    public CacheManager cacheManager(RedisConnectionFactory factory) {
        RedisSerializer<String> redisSerializer = new StringRedisSerializer();
        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);

        // 配置序列化(解决乱码的问题)
        RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
                .entryTtl(Duration.ofHours(3))
                .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer))
                .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer))
                .disableCachingNullValues();

        RedisCacheManager cacheManager = RedisCacheManager.builder(factory)
                .cacheDefaults(config)
                .build();
        return cacheManager;
    }

特别注意CacheManager的写法,springboot1.5跟2.0是有差别的,上面是2.0的写法。



猜你喜欢

转载自www.cnblogs.com/chrisweiii/p/10144761.html