`
jy03100000
  • 浏览: 34394 次
  • 性别: 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使用Jedis整合redis.zip

    springboot使用Jedis整合redis#SpringBoot笔记(一)SpringBoot基本操作——环境搭建及项目创建(有demo)(二)SpringBoot基本操作——使用IDEA打war包发布及测试(三)SpringBoot基本操作——SpringBoot集成Spring...

    springboot使用Redis模板整合redis.zip

    springboot使用Redis模板整合redis#SpringBoot笔记(一)SpringBoot基本操作——环境搭建及项目创建(有demo)(二)SpringBoot基本操作——使用IDEA打war包发布及测试(三)SpringBoot基本操作——SpringBoot集成...

    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)等技术栈,旨在实现高效、易用的人事管理功能。接下来,我们将深入探讨该...

Global site tag (gtag.js) - Google Analytics