Spring boot(3):Spring boot中Redis 的使用
Spring boot除了常用的数据库支持外,对nosql数据库也进行了封装自动化。
1 Redis介绍
Redis 是目前业界使用最广泛的内存数据存储。相比memcached,
(1)Redis支持更丰富的数据结构,例如hashes,lists,sets等,同时支持数据持久化。
(2)除此之外,Redis还提供一些类数据库的特性,比如事务,HA,主从库。可以说Redis兼具了缓存系统和数据库的一些特性,
因此有着丰富的应用场景。介绍两个Redis在Spring boot项目中的典型应用场景。
1.1 如何使用
1 引入spring-boot-starter-redis
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-redis</artifactId>
</dependency>
2 添加配置文件
# REDIS (RedisProperties)
# Redis数据库索引(默认为0)
spring.redis.database=0
# Redis服务器地址
spring.redis.host=192.168.0.58
# Redis服务器连接端口
spring.redis.port=6379
# Redis服务器连接密码(默认为空)
spring.redis.password=
# 连接池最大连接数(使用负值表示没有限制)
spring.redis.pool.max-active=8
# 连接池最大阻塞等待时间(使用负值表示没有限制)
spring.redis.pool.max-wait=-1
# 连接池中的最大空闲连接
spring.redis.pool.max-idle=8
# 连接池中的最小空闲连接
spring.redis.pool.min-idle=0
# 连接超时时间(毫秒)
spring.redis.timeout=0
3 添加cache的配置类
@Configuration
@EnableCaching
public class RedisConfig extends CachingConfigurerSupport{@Beanpublic KeyGenerator keyGenerator() { return new KeyGenerator() { @Overridepublic 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();}};} @SuppressWarnings("rawtypes") @Beanpublic CacheManager cacheManager(RedisTemplate redisTemplate) {RedisCacheManager rcm = new RedisCacheManager(redisTemplate); //设置缓存过期时间//rcm.setDefaultExpiration(60);//秒return rcm;}@Beanpublic RedisTemplate<String, String> redisTemplate(RedisConnectionFactory factory) {StringRedisTemplate template = new StringRedisTemplate(factory);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);template.setValueSerializer(jackson2JsonRedisSerializer);template.afterPropertiesSet(); return template;}}
4 好了,接下来就可以直接使用了
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(Application.class)
public class TestRedis { @Autowiredprivate StringRedisTemplate stringRedisTemplate;@Autowiredprivate RedisTemplate redisTemplate;@Testpublic void test() throws Exception {stringRedisTemplate.opsForValue().set("aaa", "111");Assert.assertEquals("111", stringRedisTemplate.opsForValue().get("aaa"));} @Testpublic void testObj() throws Exception {User user=new User("aa@126.com", "aa", "aa123456", "aa","123");ValueOperations<String, User> operations=redisTemplate.opsForValue();operations.set("com.neox", user);operations.set("com.neo.f", user,1,TimeUnit.SECONDS);Thread.sleep(1000); //redisTemplate.delete("com.neo.f");boolean exists=redisTemplate.hasKey("com.neo.f");if(exists){System.out.println("exists is true");}else{System.out.println("exists is false");} // Assert.assertEquals("aa", operations.get("com.neo.f").getUserName());}
}
4 好了,接下来就可以直接使用了
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(Application.class)
public class TestRedis { @Autowiredprivate StringRedisTemplate stringRedisTemplate;@Autowiredprivate RedisTemplate redisTemplate;@Testpublic void test() throws Exception {stringRedisTemplate.opsForValue().set("aaa", "111");Assert.assertEquals("111", stringRedisTemplate.opsForValue().get("aaa"));} @Testpublic void testObj() throws Exception {User user=new User("aa@126.com", "aa", "aa123456", "aa","123");ValueOperations<String, User> operations=redisTemplate.opsForValue();operations.set("com.neox", user);operations.set("com.neo.f", user,1,TimeUnit.SECONDS);Thread.sleep(1000); //redisTemplate.delete("com.neo.f");boolean exists=redisTemplate.hasKey("com.neo.f");if(exists){System.out.println("exists is true");}else{System.out.println("exists is false");} // Assert.assertEquals("aa", operations.get("com.neo.f").getUserName());}
}
以上都是手动使用的方式,如何在查找数据库的时候自动使用缓存呢,看下面:
4 自动根据方法生成缓存
@RequestMapping("/getUser")
@Cacheable(value="user-key") //Redis获取key的值
public User getUser() {User user=userRepository.findByUserName("aa");System.out.println("若下面没出现“无缓存的时候调用”字样且能打印出数据表示测试成功"); return user;
}
1.2 共享session-spring-session-data-redis
分布式系统中,session共享有很多的解决方案,其中托管到缓存中应该是最常用的方案之一。
spring session官方说明
spring session provide an API and implementation for managing a user’s session information.
如何使用
1 引入依赖
<dependency><groupId>org.springframework.session</groupId><artifactId>spring-session-data-redis</artifactId>
</dependency>
2 session配置:
@Configuration
@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 86400*30)
public class SessionConfig {
}
maxInactiveIntervalInSeconds :设置session失效时间,使用redis session之后,原boot的sever.session.timeout属性不再生效。
好了,这样就配置好了,测试一下。
3 测试
添加测试方法获取sessionid
@RequestMapping("/uid")
String uid(HttpSession session) {UUID uid = (UUID) session.getAttribute("uid");if (uid == null) {uid = UUID.randomUUID();}session.setAttribute("uid", uid);return session.getId();}
登录redis输入 keys ‘*sessions’
t<spring:session:sessions:db031986-8ecc-48d6-b471-b137a3ed6bc4t(spring:session:expirations:1472976480000
其中 1472976480000为失效时间,意思是这个时间后session失效,db031986-8ecc-48d6-b471-b137a3ed6bc4t 为sessionid,登录http://localhost:8080/uid发现会一致,就说明session 已经在redis里面进行有效的管理了。
如何在两台或者多台中共享session
其实就是按照上面的步骤在另一个项目中再次配置一次,启动后就进行了session共享。本文所有示例:https://github.com/ityouknow/spring-boot-starter
Spring boot(3):Spring boot中Redis 的使用相关推荐
- spring boot 1.5.4 整合redis、拦截器、过滤器、监听器、静态资源配置(十六)
上一篇:spring boot 1.5.4 整合webService(十五) 1 Spring Boot整合redis和缓存 Spring Boot中除了对常用的关系型数据库提供了优秀的自动 ...
- Spring Sercurity在Spring Boot 中的使用
Spring Security 简介 Spring 是非常流行和成功的 Java 应用开发框架,Spring Security正是Spring家族中的成员.Spring Security 基于 Spr ...
- spring boot注释_Spring Boot中的@SpringBootConfiguration注释
spring boot注释 Spring Boot中的 @SpringBootConfiguration注释是一个类级别的注释,它指示此类提供了应用程序配置. 通常,具有main()方法的类最适合此注 ...
- 使用Spring Security在Spring Boot中进行缓存
在这篇文章中,我想分享一下O&B的一个团队的经验教训. 他们正在使用带有Spring Security的Spring Boot. 默认情况下,Spring Security保护的所有内容都将通 ...
- Spring Boot Web应用程序中注册 Servlet 的方法实例
Spring Boot Web应用程序中注册 Servlet 的方法实例 本文实例工程源代码:https://github.com/KotlinSpringBoot/demo1_add_servlet ...
- Spring Boot(四)-- 中的application.properties配置简介 2
根据上文的介绍,我们已经对Spring Boot中的application.properties配置有了一定的了解,下面我们对此进行最后的介绍. 紧接上文的讲解,如下: 普通属性的注入 由 ...
- Spring Boot 引入jar 包中的 controller
[问题] Spring Boot 引入jar 包中的 controller [解决] 默认情况下 Spring Boot 在启动时, 只会扫描启动类对应的包以及子包进行装配, 因此jar包中的cont ...
- 电子商务商城源码 Spring Cloud、Spring Boot、Mybatis、Redis
1. 涉及平台 Spring Cloud.Spring Boot.Mybatis.Redis 2. 核心架构 Spring Cloud.Spring Boot.Mybatis.Redis 3. 前端框 ...
- Spring MVC 到 Spring BOOT 的简化之路
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 来源:juejin.im/post/5aa22d1f5188255 ...
- 基于Spring Boot和Spring Cloud实现微服务架构学习--转
原文地址:http://blog.csdn.net/enweitech/article/details/52582918 看了几周spring相关框架的书籍和官方demo,是时候开始总结下这中间的学习 ...
最新文章
- iOS架构篇-5 CI/CD(持续集成、持续交付、持续部署)
- 报错:该字符串未被识别为有效的DateTime
- 性能测试分享:系统架构
- 谁最终需要Java模块?
- k8s核心技术-Controller(Deployment)_发布应用---K8S_Google工作笔记0029
- 数据结构:五岔路口交通管理红绿灯设计
- 八个常用的数据分析方法论
- 《缠中说禅108课》15:没有趋势,没有背驰
- pancakeswap 开盘抢跑机器人 (附代码)
- tga格式转化为jpg格式
- primeng的Tree初始化选中,实现联动效果
- c# websocket 心跳重连_初探和实现websocket心跳重连(npm: websocket-heartbeat-js) - 子慕大诗人 - 博客园...
- 机器人技术(3)机器人操作系统ROS简单教程
- 单、多分支结构的应用(有点复杂)
- Java-Mybatis(二): Mybatis配置解析、resultMap结果集映射、日志、分页、注解开发、Mybatis执行流程分析
- 根据图片名字在drawable中得到图片
- HZAU新版正方教务系统一键教学评价
- 常用触摸屏驱动 android
- 工业产品类计算机绘图师,全国计算机绘图师考试试题汇总.pdf
- 100以内能被7和3整除的数的和