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.yml中spring的节点下(跟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,会看到redis里user的缓存已经被清除,再次访问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里。put,remove,clear,完全自由控制(本处只示例get和put)
controller层调用代码不变
③访问http://localhost:8088/KnowledgeIsland/user/list测试
6. 特别注意的地方,所有放入redis的对象,需要实现Serializable接口。将对象类型数据放入redis,本文采用的方法是将对象序列化之后放入。另一种方法是,将对象全部转为json字符串,然后再放入,拿出来的时候再转回来。
相关推荐
springboot使用Jedis整合redis#SpringBoot笔记(一)SpringBoot基本操作——环境搭建及项目创建(有demo)(二)SpringBoot基本操作——使用IDEA打war包发布及测试(三)SpringBoot基本操作——SpringBoot集成Spring...
springboot使用Redis模板整合redis#SpringBoot笔记(一)SpringBoot基本操作——环境搭建及项目创建(有demo)(二)SpringBoot基本操作——使用IDEA打war包发布及测试(三)SpringBoot基本操作——SpringBoot集成...
诗曰:高山仰止,景行行止 环境:Mac +linux(centos7) 首先呢,现在linux中查看一下防火墙的状态 systemctl status ...那下面开始安装redis,本次所安装redis-4.0.6.tar.gz 命令wget yum install wget安装以后
本资源包包含了关于Redis的学习笔记以及一个基于SpringBoot整合Redis的实战项目——"springboot-redisdemo",旨在帮助你深入理解和应用Redis。 首先,让我们详细探讨Redis的核心知识点: 1. **Redis的数据类型**:...
【Spring Boot + Mybatis 整合详解】 Spring Boot 和 Mybatis 的整合是现代 Java 开发中的常见实践,它...在实际项目中,你可以根据需求进一步扩展,如集成 Swagger 进行 API 文档管理,或者引入 Redis 做缓存优化等。
在"springboot资源整合.zip"这个压缩包中,包含了SpringBoot与四大重要技术——Kafka、Nginx、Redis和MySQL的整合示例,旨在帮助开发者快速理解和实践这些技术在实际项目中的应用。 1. **Kafka**:Apache Kafka是一...
这个案例的意义在于,通过整合Eureka、Ribbon和Feign,我们可以快速构建出一个具备服务发现、负载均衡能力的微服务架构。这使得服务间的通信更加高效和可靠,同时降低了开发和维护的复杂度。 总结来说,Spring ...
这是一个全面的外卖点餐系统开发项目,采用了当前流行的Java后端技术栈——SpringBoot、Mybatis-Plus,以及前端的Vue框架,同时结合了Redis内存数据库和Mysql关系型数据库来提升性能和用户体验。下面将详细阐述这些...
SpringBoot 搭建——整合 Redis 与 MyBatis 的实战指南 在现代的 Java 开发中,Spring Boot 已经成为了快速构建应用的首选框架,它极大地简化了 Spring 应用的初始设置和配置。本教程将详细介绍如何使用 Spring ...
对于新手来说,了解这些基本概念后,可以着手进行Springboot整合Redis的学习。Springboot是Java微服务开发的常用框架,整合Redis能轻松实现缓存管理和消息队列功能。 **Springboot整合Redis的步骤**: 1. **添加...
Java企业级电商项目演进——Tomcat集群和Redis分布式 在基础上进行演进,主要涉及到Tomcat集群和Redis分布式锁,项目来自,课程主要不同点: 使用Spring Boot整合代替SSM整合 注解式开发,包括注解式项目配置以及...
《SpringBoot美妆商城系统详解——基于Java Vue IDEA Redis MyBatis技术栈》 SpringBoot美妆商城项目是一款典型的电商系统,采用先进的技术栈构建,旨在提供一个功能完善的在线购物平台。项目涉及的技术包括...
《SpringBoot整合Shiro实现细粒度动态权限管理——基于Redis的实战解析》 在现代Web开发中,权限管理是不可或缺的一部分,它涉及到用户角色、权限分配、会话管理等多个方面。SpringBoot作为轻量级的Java开发框架,...
三、SpringBoot整合Mybatis 整合SpringBoot和Mybatis,我们可以充分利用两者的优势,创建一个高效且易于维护的博客系统。主要步骤包括: 1. 添加依赖:在pom.xml中引入SpringBoot的starter-web和Mybatis的相关依赖...
SSM是Java企业级开发中常用的三大框架——Spring、SpringMVC和MyBatis的组合。Spring负责依赖注入和事务管理,SpringMVC处理HTTP请求,MyBatis则作为持久层框架,实现数据库操作与Java对象的映射。 3. SpringBoot...
本系统——"SpringBoot+Vue的员工绩效考核管理系统",就是针对这一需求而设计的一套完善的解决方案。该系统采用了JavaEE架构,利用SpringBoot后端框架与Vue.js前端框架实现了前后端分离,使得系统的开发、维护和扩展...
1. SpringBoot整合MyBatis:使用MyBatis作为持久层框架,通过Mapper接口进行数据库操作,简化SQL的编写。 2. JWT(JSON Web Tokens)身份验证:实现用户登录验证,提供安全的身份认证机制。 3. Docker容器化部署:...
本项目——“基于SpringBoot的火车票订票系统”是一个典型的Java Web应用实例,它整合了SpringBoot、SSM(Spring、SpringMVC、MyBatis)以及JSP技术,旨在为用户提供便捷的在线火车票预订服务。接下来,我们将深入...
本项目——“基于SpringBoot的家乡特色推荐系统”,旨在利用现代Web技术,为用户提供关于家乡特色的个性化推荐服务。这个系统采用Java语言进行开发,并结合了SpringBoot、SSM(Spring、SpringMVC、MyBatis)等框架,...
本项目——“基于SpringBoot的人事管理系统”是一个典型的企业级应用实例,它整合了Java、微信小程序、SSM(Spring、SpringMVC、MyBatis)等技术栈,旨在实现高效、易用的人事管理功能。接下来,我们将深入探讨该...