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 的使用相关推荐

  1. spring boot 1.5.4 整合redis、拦截器、过滤器、监听器、静态资源配置(十六)

    上一篇:spring boot 1.5.4 整合webService(十五) 1      Spring Boot整合redis和缓存 Spring Boot中除了对常用的关系型数据库提供了优秀的自动 ...

  2. Spring Sercurity在Spring Boot 中的使用

    Spring Security 简介 Spring 是非常流行和成功的 Java 应用开发框架,Spring Security正是Spring家族中的成员.Spring Security 基于 Spr ...

  3. spring boot注释_Spring Boot中的@SpringBootConfiguration注释

    spring boot注释 Spring Boot中的 @SpringBootConfiguration注释是一个类级别的注释,它指示此类提供了应用程序配置. 通常,具有main()方法的类最适合此注 ...

  4. 使用Spring Security在Spring Boot中进行缓存

    在这篇文章中,我想分享一下O&B的一个团队的经验教训. 他们正在使用带有Spring Security的Spring Boot. 默认情况下,Spring Security保护的所有内容都将通 ...

  5. Spring Boot Web应用程序中注册 Servlet 的方法实例

    Spring Boot Web应用程序中注册 Servlet 的方法实例 本文实例工程源代码:https://github.com/KotlinSpringBoot/demo1_add_servlet ...

  6. Spring Boot(四)-- 中的application.properties配置简介 2

      根据上文的介绍,我们已经对Spring Boot中的application.properties配置有了一定的了解,下面我们对此进行最后的介绍.   紧接上文的讲解,如下: 普通属性的注入   由 ...

  7. Spring Boot 引入jar 包中的 controller

    [问题] Spring Boot 引入jar 包中的 controller [解决] 默认情况下 Spring Boot 在启动时, 只会扫描启动类对应的包以及子包进行装配, 因此jar包中的cont ...

  8. 电子商务商城源码 Spring Cloud、Spring Boot、Mybatis、Redis

    1. 涉及平台 Spring Cloud.Spring Boot.Mybatis.Redis 2. 核心架构 Spring Cloud.Spring Boot.Mybatis.Redis 3. 前端框 ...

  9. Spring MVC 到 Spring BOOT 的简化之路

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 来源:juejin.im/post/5aa22d1f5188255 ...

  10. 基于Spring Boot和Spring Cloud实现微服务架构学习--转

    原文地址:http://blog.csdn.net/enweitech/article/details/52582918 看了几周spring相关框架的书籍和官方demo,是时候开始总结下这中间的学习 ...

最新文章

  1. iOS架构篇-5 CI/CD(持续集成、持续交付、持续部署)
  2. 报错:该字符串未被识别为有效的DateTime
  3. 性能测试分享:系统架构
  4. 谁最终需要Java模块?
  5. k8s核心技术-Controller(Deployment)_发布应用---K8S_Google工作笔记0029
  6. 数据结构:五岔路口交通管理红绿灯设计
  7. 八个常用的数据分析方法论
  8. 《缠中说禅108课》15:没有趋势,没有背驰
  9. pancakeswap 开盘抢跑机器人 (附代码)
  10. tga格式转化为jpg格式
  11. primeng的Tree初始化选中,实现联动效果
  12. c# websocket 心跳重连_初探和实现websocket心跳重连(npm: websocket-heartbeat-js) - 子慕大诗人 - 博客园...
  13. 机器人技术(3)机器人操作系统ROS简单教程
  14. 单、多分支结构的应用(有点复杂)
  15. Java-Mybatis(二): Mybatis配置解析、resultMap结果集映射、日志、分页、注解开发、Mybatis执行流程分析
  16. 根据图片名字在drawable中得到图片
  17. HZAU新版正方教务系统一键教学评价
  18. 常用触摸屏驱动 android
  19. 工业产品类计算机绘图师,全国计算机绘图师考试试题汇总.pdf
  20. 100以内能被7和3整除的数的和

热门文章

  1. Acwing 135 最大子序和
  2. P1742 最小圆覆盖
  3. 牛客题霸 [寻找第K大] C++题解/答案
  4. 不止代码:乘法游戏 题解(区间dp)
  5. AT4505-[AGC029F]Construction of a tree【构造题,hall定理,网络流】
  6. nssl1296-猫咪的进化【dp】
  7. 【树链剖分】LCA(P4211)
  8. 1、play编程基础
  9. Java web文件下载断点续传
  10. 10 道关于 Java 泛型的面试题