`
jy03100000
  • 浏览: 34239 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Springboot整合(8)——Redis

 
阅读更多

Springboot整合(8)——Redis

0. 搭建redis环境,可参考我之前的文章:用docker搭建redis

1. pom中增加redis依赖

        <!-- redis -->

        <dependency>

            <groupId>org.springframework.boot</groupId>

            <artifactId>spring-boot-starter-data-redis</artifactId>

        </dependency>

2. application.ymlspring的节点下(跟datasource同一层)增加redis配置

  #Redis配置

  redis:

    database: 0

    host: 192.168.59.103

    port: 6379

    pool:

      max-idle: 8

      min-idle: 0

      max-active: 8

      max-wait: -1

3. 编写redis序列化对象类

import org.springframework.core.convert.converter.Converter;

import org.springframework.core.serializer.support.DeserializingConverter;

import org.springframework.core.serializer.support.SerializingConverter;

import org.springframework.data.redis.serializer.RedisSerializer;

import org.springframework.data.redis.serializer.SerializationException;

 

/**

 * redis序列化对象

 */

publicclass RedisObjectSerializer implements RedisSerializer<Object> {

    private Converter<Object, byte[]> serializer = new SerializingConverter();

    private Converter<byte[], Object> deserializer = new DeserializingConverter();

    staticfinalbyte[] EMPTY_ARRAY = newbyte[0];

 

    public Object deserialize(byte[] bytes) {

        if (isEmpty(bytes)) {

            returnnull;

        }

        try {

            returndeserializer.convert(bytes);

        } catch (Exception ex) {

            thrownew SerializationException("Cannot deserialize", ex);

        }

    }

 

    publicbyte[] serialize(Object object) {

        if (object == null) {

            returnEMPTY_ARRAY;

        }

        try {

            returnserializer.convert(object);

        } catch (Exception ex) {

            returnEMPTY_ARRAY;

        }

    }

 

    privateboolean isEmpty(byte[] data) {

        return (data == null || data.length == 0);

    }

}

 

4. 编写redis配置类RedisCacheConfig

/**

 * Redis缓存配置类

 */

@Configuration

@EnableCaching

publicclass RedisCacheConfig extends CachingConfigurerSupport {

 

    // 自定义缓存key生成策略

    @Bean

    public KeyGenerator keyGenerator() {

        returnnew KeyGenerator() {

            @Override

            public Object generate(Object target, java.lang.reflect.Method method, Object... params) {

                StringBuffer sb = new StringBuffer();

                sb.append(target.getClass().getName());

                sb.append(method.getName());

                for (Object obj : params) {

                    if (obj == null) {

                        continue;

                    }

                    sb.append(obj.toString());

                }

                returnsb.toString();

            }

        };

    }

 

    // 缓存管理器

    @Bean

    public CacheManager cacheManager(@SuppressWarnings("rawtypes") RedisTemplate redisTemplate) {

        RedisCacheManager cacheManager = new RedisCacheManager(redisTemplate);

        // 设置缓存过期时间

        cacheManager.setDefaultExpiration(1800);

        returncacheManager;

    }

 

    @Bean

    public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory factory) {

        RedisTemplate<Object, Object> template = new RedisTemplate<Object, Object>();

        template.setConnectionFactory(factory);

        template.setKeySerializer(new StringRedisSerializer());

        template.setValueSerializer(new RedisObjectSerializer ());

        returntemplate;

    }

 

}

 

5. 使用缓存有2种方法,一种是直接在Controller里使用注解的方式,另一种是自已手动读取写入缓存,前者更加方便,后者更加灵活,根据实际需求选择具体使用哪种,下面将2中方法分别说明

5.1 Controller中使用注解方式使用缓存

@Cacheable 从缓存读取数据

@CacheEvict 清除缓存

示例:


访问http://localhost:8088/KnowledgeIsland/user/cacheList,首次后台会打印sql,再次访问就不会打印sql,从redis里读取

进入http://localhost:8088/KnowledgeIsland/user/add,添加一个user,查看redis,会看到redisuser的缓存已经被清除,再次访问http://localhost:8088/KnowledgeIsland/user/cacheList,又会去数据库查询

 

5.2 自己编码实现读取写入缓存

编写操作缓存的工具类

/**

 * Cache工具类

 */

publicclass CacheUtil {

 

    privatestatic Logger logger = LoggerFactory.getLogger(CacheUtil.class);

    privatestatic CacheManager cacheManager = SpringUtil.getBean(CacheManager.class);

    //是否开启缓存

    privatestaticbooleanenableCache = true;

 

    /**

     * 获取缓存

     *

     * @param cacheName

     * @param key

     * @return

     */

    publicstatic Object get(String cacheName, String key) {

        if (!enableCache) {

            returnnull;

        }

        ValueWrapper valueWrapper = getCache(cacheName).get(key);

        if (valueWrapper == null) {

            returnnull;

        }

        return getCache(cacheName).get(key).get();

    }

 

    /**

     * 获取缓存

     *

     * @param cacheName

     * @param key

     * @param defaultValue

     * @return

     */

    publicstatic Object get(String cacheName, String key, Object defaultValue) {

        if (!enableCache) {

            returndefaultValue;

        }

        Object value = get(cacheName, key);

        returnvalue != null ? value : defaultValue;

    }

 

    /**

     * 写入缓存

     *

     * @param cacheName

     * @param key

     * @param value

     */

    publicstaticvoid put(String cacheName, String key, Object value) {

        if (!enableCache) {

            return;

        }

        getCache(cacheName).put(key, value);

    }

 

    /**

     * 从缓存中移除

     *

     * @param cacheName

     * @param key

     */

    publicstaticvoid remove(String cacheName, String key) {

        if (!enableCache) {

            return;

        }

        getCache(cacheName).evict(key);

    }

 

    /**

     * 从缓存中移除所有

     *

     * @param cacheName

     */

    publicstaticvoid removeAll(String cacheName) {

        if (!enableCache) {

            return;

        }

        getCache(cacheName).clear();

        logger.info("清理缓存: {} => {}", cacheName);

    }

 

    /**

     * 获得一个Cache,没有则显示日志。

     *

     * @param cacheName

     * @return

     */

    privatestatic Cache getCache(String cacheName) {

        Cache cache = cacheManager.getCache(cacheName);

        if (cache == null) {

            thrownew RuntimeException("当前系统中没有定义“" + cacheName + "”这个缓存。");

        }

        returncache;

    }

 

}

 

注:该类引用了一个SpringUtil类,该类的作用是可以让那些没有注册为spring component的普通类调用spring bean,代码如下:

import org.springframework.beans.BeansException;

import org.springframework.context.ApplicationContext;

import org.springframework.context.ApplicationContextAware;

import org.springframework.stereotype.Component;

 

/**

 * 普通类调用Spring bean对象:说明: 1、此类需要放到App.java同包或者子包下才能被扫描,否则失效。

*/

@Component

publicclass SpringUtil implements ApplicationContextAware {

    privatestatic ApplicationContext applicationContext = null;

 

    @Override

    publicvoid setApplicationContext(ApplicationContext applicationContext) throws BeansException {

        if (SpringUtil.applicationContext == null) {

            SpringUtil.applicationContext = applicationContext;

        }

        System.out.println("---------------------------------------------------------------------");

        System.out.println("---------------------------------------------------------------------");

        System.out.println(

                "---------------com.kfit.base.util.SpringUtil------------------------------------------------------");

        System.out.println(

                "========ApplicationContext配置成功,在普通类可以通过调用SpringUtils.getAppContext()获取applicationContext对象,applicationContext="

                        + SpringUtil.applicationContext + "========");

        System.out.println("---------------------------------------------------------------------");

    }

 

    // 获取applicationContext

    publicstatic ApplicationContext getApplicationContext() {

        returnapplicationContext;

    }

 

    // 通过name获取 Bean.

    publicstatic Object getBean(String name) {

        return getApplicationContext().getBean(name);

    }

 

    // 通过class获取Bean.

    publicstatic <T> T getBean(Class<T> clazz) {

        return getApplicationContext().getBean(clazz);

    }

 

    // 通过name,以及Clazz返回指定的Bean

    publicstatic <T> T getBean(String name, Class<T> clazz) {

        return getApplicationContext().getBean(name, clazz);

    }

}

 

调用工具类操作缓存,操作逻辑可放在任何地方,本文示例放在UserService里。putremoveclear,完全自由控制(本处只示例getput

 

controller层调用代码不变


③访问http://localhost:8088/KnowledgeIsland/user/list测试

6. 特别注意的地方,所有放入redis的对象,需要实现Serializable接口。将对象类型数据放入redis,本文采用的方法是将对象序列化之后放入。另一种方法是,将对象全部转为json字符串,然后再放入,拿出来的时候再转回来。

  • 大小: 17.9 KB
  • 大小: 18.1 KB
  • 大小: 10.6 KB
分享到:
评论

相关推荐

    Springboot+Redis整合(越过雷区)——redis在linux安装,redis可视化–2020年2月17日

    诗曰:高山仰止,景行行止 环境:Mac +linux(centos7) 首先呢,现在linux中查看一下防火墙的状态 systemctl status ...那下面开始安装redis,本次所安装redis-4.0.6.tar.gz 命令wget yum install wget安装以后

    redis学习笔记+练习springboot-redisdemo

    本资源包包含了关于Redis的学习笔记以及一个基于SpringBoot整合Redis的实战项目——"springboot-redisdemo",旨在帮助你深入理解和应用Redis。 首先,让我们详细探讨Redis的核心知识点: 1. **Redis的数据类型**:...

    SpringBoot+Mybatis整合完整源码

    【Spring Boot + Mybatis 整合详解】 Spring Boot 和 Mybatis 的整合是现代 Java 开发中的常见实践,它...在实际项目中,你可以根据需求进一步扩展,如集成 Swagger 进行 API 文档管理,或者引入 Redis 做缓存优化等。

    springboot资源整合.zip

    在"springboot资源整合.zip"这个压缩包中,包含了SpringBoot与四大重要技术——Kafka、Nginx、Redis和MySQL的整合示例,旨在帮助开发者快速理解和实践这些技术在实际项目中的应用。 1. **Kafka**:Apache Kafka是一...

    SpringCloud案例(集成了Eureka、Ribbon、Feign)

    这个案例的意义在于,通过整合Eureka、Ribbon和Feign,我们可以快速构建出一个具备服务发现、负载均衡能力的微服务架构。这使得服务间的通信更加高效和可靠,同时降低了开发和维护的复杂度。 总结来说,Spring ...

    基于SpringBoot + Vue + Mybatis-Plus + Redis + Mysql 等技术栈的外卖点餐系统源码

    这是一个全面的外卖点餐系统开发项目,采用了当前流行的Java后端技术栈——SpringBoot、Mybatis-Plus,以及前端的Vue框架,同时结合了Redis内存数据库和Mysql关系型数据库来提升性能和用户体验。下面将详细阐述这些...

    springboot搭建

    SpringBoot 搭建——整合 Redis 与 MyBatis 的实战指南 在现代的 Java 开发中,Spring Boot 已经成为了快速构建应用的首选框架,它极大地简化了 Spring 应用的初始设置和配置。本教程将详细介绍如何使用 Spring ...

    Redis免安装版本,嘎嘎好使!推荐新手使用,下载

    对于新手来说,了解这些基本概念后,可以着手进行Springboot整合Redis的学习。Springboot是Java微服务开发的常用框架,整合Redis能轻松实现缓存管理和消息队列功能。 **Springboot整合Redis的步骤**: 1. **添加...

    程序员5个刷题网站-tlmall-springboot-ii:Java企业级电商项目演进——Tomcat集群和Redis分布式

    Java企业级电商项目演进——Tomcat集群和Redis分布式 在基础上进行演进,主要涉及到Tomcat集群和Redis分布式锁,项目来自,课程主要不同点: 使用Spring Boot整合代替SSM整合 注解式开发,包括注解式项目配置以及...

    springboot美妆商城(源码+数据库)031836

    《SpringBoot美妆商城系统详解——基于Java Vue IDEA Redis MyBatis技术栈》 SpringBoot美妆商城项目是一款典型的电商系统,采用先进的技术栈构建,旨在提供一个功能完善的在线购物平台。项目涉及的技术包括...

    springboot-shiro:纯净版,需开启本地redis服务

    《SpringBoot整合Shiro实现细粒度动态权限管理——基于Redis的实战解析》 在现代Web开发中,权限管理是不可或缺的一部分,它涉及到用户角色、权限分配、会话管理等多个方面。SpringBoot作为轻量级的Java开发框架,...

    个人博客系统(SpringBoot+Mybatis).zip

    三、SpringBoot整合Mybatis 整合SpringBoot和Mybatis,我们可以充分利用两者的优势,创建一个高效且易于维护的博客系统。主要步骤包括: 1. 添加依赖:在pom.xml中引入SpringBoot的starter-web和Mybatis的相关依赖...

    基于springboot图书管理系统.zip

    SSM是Java企业级开发中常用的三大框架——Spring、SpringMVC和MyBatis的组合。Spring负责依赖注入和事务管理,SpringMVC处理HTTP请求,MyBatis则作为持久层框架,实现数据库操作与Java对象的映射。 3. SpringBoot...

    Springboot+vue的员工绩效考核管理系统(有报告),Javaee项目,springboot vue前后端分离项目

    本系统——"SpringBoot+Vue的员工绩效考核管理系统",就是针对这一需求而设计的一套完善的解决方案。该系统采用了JavaEE架构,利用SpringBoot后端框架与Vue.js前端框架实现了前后端分离,使得系统的开发、维护和扩展...

    基于springboot普拉提会馆管理系统的论文和ppt.zip

    1. SpringBoot整合MyBatis:使用MyBatis作为持久层框架,通过Mapper接口进行数据库操作,简化SQL的编写。 2. JWT(JSON Web Tokens)身份验证:实现用户登录验证,提供安全的身份认证机制。 3. Docker容器化部署:...

    基于springboot的火车票订票系统源码数据库.zip

    本项目——“基于SpringBoot的火车票订票系统”是一个典型的Java Web应用实例,它整合了SpringBoot、SSM(Spring、SpringMVC、MyBatis)以及JSP技术,旨在为用户提供便捷的在线火车票预订服务。接下来,我们将深入...

    基于springboot家乡特色推荐系统.zip

    本项目——“基于SpringBoot的家乡特色推荐系统”,旨在利用现代Web技术,为用户提供关于家乡特色的个性化推荐服务。这个系统采用Java语言进行开发,并结合了SpringBoot、SSM(Spring、SpringMVC、MyBatis)等框架,...

    基于springboot人事管理系统.zip

    本项目——“基于SpringBoot的人事管理系统”是一个典型的企业级应用实例,它整合了Java、微信小程序、SSM(Spring、SpringMVC、MyBatis)等技术栈,旨在实现高效、易用的人事管理功能。接下来,我们将深入探讨该...

    springboot406美术馆管理系统--论文pf.zip

    《SpringBoot406美术馆管理系统——论文解析》 在当今数字化时代,美术馆管理系统的构建对于艺术文化的传播与保护起着至关重要的作用。本系统基于SpringBoot框架,旨在提供一个高效、便捷的艺术品管理平台,以满足...

    HIS医院信息管理系统(SpringBoot + SSM).zip

    《HIS医院信息管理系统——基于SpringBoot与SSM框架的实现》 医院信息管理系统(Hospital Information System,简称HIS)是医疗机构信息化建设的核心部分,它整合了医疗业务流程,实现了患者信息、医疗记录、药品...

Global site tag (gtag.js) - Google Analytics