dubbo2.5-spring4-mybastis3.2-springmvc4-mongodb3.4-redis3.2整合(六)Spring中Redis的缓存的使用

简介: 版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010046908/article/details/54174622

前面已经写了四篇关于dubbo2.5-spring4-mybastis3.2-springmvc4-mongodb3.4-redis3.2整合的文章:

  1. dubbo2.5-spring4-mybastis3.2-springmvc4-mongodb3.4-redis3.2整合(一)Dubbo的使用
  2. dubbo2.5-spring4-mybastis3.2-springmvc4-mongodb3.4-redis3.2整合(二)之 JDBC连接池、监控组件 Druid
  3. dubbo2.5-spring4-mybastis3.2-springmvc4-mongodb3.4-redis3.2整合(三)使用Spring AOP实现mysql的读写分离
  4. dubbo2.5-spring4-mybastis3.2-springmvc4-mongodb3.4-redis3.2整合(四)Spring AOP中使用log4j实现http请求日志入mongodb
  5. dubbo2.5-spring4-mybastis3.2-springmvc4-mongodb3.4-redis3.2整合(五)Spring中spring-data-redis的使用

    接着上一篇文章,今天来写一篇关于Spring-data-redis在Spring中的缓存的使用

缓存(Caching)可以存储经常会用到的信息,这样每次需要的时候,这些信息都可以立即可用的。尽管Spring自身并没有实现缓存的解决方案,但是他对缓存功能提供了声明式的支持,能够与各种流行的缓存进行集成。几天主要介绍的是redis的缓存的支持。

1. Spring中启用对缓存管理的支持

Spring中对缓存管理器的支持有两种方式:

  • 注解驱动的缓存
  • XML声明的缓存

1.1 注解驱动的缓存

使用Spring的缓存抽象时,最为通用的方式就是在方法上添加@Cacheable和@CacheEvict注解。

在往bean添加缓存注解之前,必须要启用Spring对注解驱动的支持。如果我们使用java配置的话,那么可以在其中一个配置上添加@EnableCaching,这样的话就能启动注解驱动的缓存。

package com.lidong.util;


import java.lang.reflect.Method;

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.core.RedisTemplate;

@Configuration
@EnableCaching
public class CachingConfig extends CachingConfigurerSupport{

    @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(); 
            }  

        };  

    }  


    /**
     * 声明缓存管理器
     * @param redisTemplate
     * @return
     */
    @Bean
    public CacheManager cacheManager(RedisTemplate<String, Object> redisTemplate) {
        return new RedisCacheManager(redisTemplate);
    }
}
1.2 XML声明的缓存

如果以XML的方式配置应用的话,那么可以是使用Spring cache命名空间的

<cache:annotation-driven/>

元素来启动注解驱动的缓存。

<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://www.springframework.org/schema/beans" xmlns:cache="http://www.springframework.org/schema/cache" xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans  http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
       http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache-4.0.xsd">
    <!--启用缓存-->
    <cache:annotation-driven/>  
     <!--声明缓存管理器-->
    <bean    id="org.springframework.data.redis.cache.RedisCacheManager"/> 

  </beans>

2. Spring中配置缓存管理器

Spring 3.1内置了五个缓存管理器

  • SimpleCacheManager
  • NoOpCacheManager
  • ConcrrentMapCacheManager
  • CompositeCacheManager
  • EhCacheCacheManager

Spring 3.2引入了另外的一个缓存管理器,这个缓存管理器可以在基于JCache(JSR-107)的缓存提供商之中。除了核心的Spring框架,Spring data又提供了两个缓存管理器。
- RedisCacheManager 来自于Spring-data-redis项目
- GemfireCacheManager 来自于Spring-data-GemFire项目

所以我们选择缓存管理器时候,取决于使用底层缓存供应商。

3. Spring中配置Redis缓存管理器

缓存的条目不过就是一个键值对(key-vlaue),其中key描述了产生value的操作和参数。因此你,Redis作为key-value存储,非常适合于做缓存。
Redis可以用来为spring缓存抽象机制存储缓存条目,Spring-data-redis提供了RedisCacheManager,这是CacheManager的一个实现。RedisCacheManager 会与一个Redis服务器协作,并且通过RedisTemplate将缓存条目存储到Redis中。

@Configuration
@EnableCaching
public class RedisCachingConfig extends CachingConfigurerSupport{

    @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(); 
            }  

        };  

    }  


    /**
     * 声明缓存管理器RedisCacheManager
     * @param redisTemplate
     * @return
     */
    @Bean
    public CacheManager cacheManager(RedisTemplate<String, Object> redisTemplate) {
        return new RedisCacheManager(redisTemplate);
    }
}

4. 为方法添加注解以支持缓存

Spring 的缓存抽象在很大程度上是围绕切面的构建的。在Spring中启用缓存时,会创建一个切面,它触发一个或更多的Spring的缓存注解。

Spring中提供了四个注解来声明缓存规则

  • @Cacheable 声明Spring在调用方法之前,首先应该在缓存中查找方法的返回值。如果这个值能够找到,就会返回存储的值,否则的话,这个方法就会被调用,返回值会放在缓存之中。
  • @CachePut 表明Spring应该将方法的返回值放到缓存中,在方法的调用前并不会检查缓存,方法始终都会被调用
  • @CacheEvict表明Spring应该在缓存中清除一个或多个条目
  • @Caching 这是一个分组的注解,能够同时应用多个其他的缓存注解

在Service层缓存数据的数据

package com.lidong.core.user.service;

import java.util.List;

import javax.annotation.Resource;

import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;

import com.lidong.api.service.user.IUserService;
import com.lidong.core.user.dao.IUserDao;
import com.lidong.model.user.User;
@Service("userService")
public class UserServiceImp implements IUserService {

    @Resource
    IUserDao mIUserDao;

    @Override
    public String sayHello(String name) {
          return "Hello " + name;  
    }
    @Cacheable(value={"getUserById"})
    @Override
    public User getUserById(int userId) {
        return mIUserDao.selectByPrimaryKey(userId);
    }

    @Override
    public User getUserByUsername(String username) {
        return mIUserDao.selectByPrimaryUsername(username);
    }

    @CacheEvict(value={"getAllUser"},allEntries=true)
    @Override
    public void addUser(User user) {
        mIUserDao.insert(user);
    }

    @Cacheable(value={"getAllUser"})
    @Override
    public List<User> getAllUser() {
        return mIUserDao.selectAllUsers();
    }

    @CacheEvict(value={"getAllUser","getUserById"},allEntries=true)
    @Override
    public int delUserById(Integer userId) {
        return mIUserDao.deleteByPrimaryKey(userId);
    }

    @CacheEvict(value={"getAllUser","getUserById"},allEntries=true)
    @Override
    public int updateUser(User user) {
        return mIUserDao.updateByPrimaryKey(user);
    }

}

数据缓存成功

这里写图片描述

再次获取用户列表的时候;直接从缓存中读取用户的列表。

注意:缓存java对象时必须实现Serilaizable接口,因为Spring会将对象先序列化之后再存入到Redis中。

代码地址

相关文章
|
9月前
|
前端开发 Java 微服务
《深入理解Spring》:Spring、Spring MVC与Spring Boot的深度解析
Spring Framework是Java生态的基石,提供IoC、AOP等核心功能;Spring MVC基于其构建,实现Web层MVC架构;Spring Boot则通过自动配置和内嵌服务器,极大简化了开发与部署。三者层层演进,Spring Boot并非替代,而是对前者的高效封装与增强,适用于微服务与快速开发,而深入理解Spring Framework有助于更好驾驭整体技术栈。
|
9月前
|
缓存 负载均衡 监控
135_负载均衡:Redis缓存 - 提高缓存命中率的配置与最佳实践
在现代大型语言模型(LLM)部署架构中,缓存系统扮演着至关重要的角色。随着LLM应用规模的不断扩大和用户需求的持续增长,如何构建高效、可靠的缓存架构成为系统性能优化的核心挑战。Redis作为业界领先的内存数据库,因其高性能、丰富的数据结构和灵活的配置选项,已成为LLM部署中首选的缓存解决方案。
900 25
|
9月前
|
缓存 运维 监控
Redis 7.0 高性能缓存架构设计与优化
🌟蒋星熠Jaxonic,技术宇宙中的星际旅人。深耕Redis 7.0高性能缓存架构,探索函数化编程、多层缓存、集群优化与分片消息系统,用代码在二进制星河中谱写极客诗篇。
1790 3
|
10月前
|
存储 缓存 NoSQL
Redis专题-实战篇二-商户查询缓存
本文介绍了缓存的基本概念、应用场景及实现方式,涵盖Redis缓存设计、缓存更新策略、缓存穿透问题及其解决方案。重点讲解了缓存空对象与布隆过滤器的使用,并通过代码示例演示了商铺查询的缓存优化实践。
403 1
Redis专题-实战篇二-商户查询缓存
|
10月前
|
缓存 NoSQL 关系型数据库
Redis缓存和分布式锁
Redis 是一种高性能的键值存储系统,广泛用于缓存、消息队列和内存数据库。其典型应用包括缓解关系型数据库压力,通过缓存热点数据提高查询效率,支持高并发访问。此外,Redis 还可用于实现分布式锁,解决分布式系统中的资源竞争问题。文章还探讨了缓存的更新策略、缓存穿透与雪崩的解决方案,以及 Redlock 算法等关键技术。
|
10月前
|
缓存 Java 应用服务中间件
Spring Boot配置优化:Tomcat+数据库+缓存+日志,全场景教程
本文详解Spring Boot十大核心配置优化技巧,涵盖Tomcat连接池、数据库连接池、Jackson时区、日志管理、缓存策略、异步线程池等关键配置,结合代码示例与通俗解释,助你轻松掌握高并发场景下的性能调优方法,适用于实际项目落地。
1801 5
|
10月前
|
存储 缓存 Java
Spring中@Cacheable、@CacheEvict以及其他缓存相关注解的实用介绍
缓存是提升应用性能的重要技术,Spring框架提供了丰富的缓存注解,如`@Cacheable`、`@CacheEvict`等,帮助开发者简化缓存管理。本文介绍了如何在Spring中配置缓存管理器,使用缓存注解优化数据访问,并探讨了缓存的最佳实践,以提升系统响应速度与可扩展性。
451 0
Spring中@Cacheable、@CacheEvict以及其他缓存相关注解的实用介绍
|
SQL Java 数据库连接
Spring、SpringMVC 与 MyBatis 核心知识点解析
我梳理的这些内容,涵盖了 Spring、SpringMVC 和 MyBatis 的核心知识点。 在 Spring 中,我了解到 IOC 是控制反转,把对象控制权交容器;DI 是依赖注入,有三种实现方式。Bean 有五种作用域,单例 bean 的线程安全问题及自动装配方式也清晰了。事务基于数据库和 AOP,有失效场景和七种传播行为。AOP 是面向切面编程,动态代理有 JDK 和 CGLIB 两种。 SpringMVC 的 11 步执行流程我烂熟于心,还有那些常用注解的用法。 MyBatis 里,#{} 和 ${} 的区别很关键,获取主键、处理字段与属性名不匹配的方法也掌握了。多表查询、动态
376 0
|
存储 缓存 NoSQL
Spring Cache缓存框架
Spring Cache是Spring体系下的标准化缓存框架,支持多种缓存(如Redis、EhCache、Caffeine),可独立或组合使用。其优势包括平滑迁移、注解与编程两种使用方式,以及高度解耦和灵活管理。通过动态代理实现缓存操作,适用于不同业务场景。
819 0
|
缓存 NoSQL 关系型数据库
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?