SpringBoot 2.x 集成 Redis

windows上搭建redis环境

添加依赖

此处redis客户端使用jedis。

<!-- redis -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId><exclusions><exclusion><groupId>redis.clients</groupId><artifactId>jedis</artifactId></exclusion><exclusion><groupId>io.lettuce</groupId><artifactId>lettuce-core</artifactId></exclusion></exclusions>
</dependency>
<!-- redis 客户端使用jedis -->
<dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId>
</dependency>
  • Jedis

    直接连接 redis server。在多线程环境下是非线程安全的,需要使用连接池,为每个Jedis实例增加物理连接。

  • Lettuce

    连接基于Netty,连接实例可以在多个线程间并发访问。因为连接实例是线程安全的,所以一个连接实例就可以满足多线程环境下的并发访问。

添加配置

2.0 版本之前的一些配置已被移除。使用jedis就配置jedis(如下配置),使用lettuce换下名称即可。

# REDIS (RedisProperties)
# Redis数据库索引(默认为0)
spring.redis.database=0
# Redis服务器地址
spring.redis.host=127.0.0.1
# Redis服务器连接端口
spring.redis.port=6379
# Redis服务器连接密码(默认为空)
spring.redis.password=
# 连接超时时间(毫秒)
spring.redis.timeout=0ms
# 连接池最大连接数(使用负值表示没有限制)
spring.redis.jedis.pool.max-active=8
# 连接池最大阻塞等待时间(使用负值表示没有限制)
spring.redis.jedis.pool.max-wait=-1ms
# 连接池中的最大空闲连接
spring.redis.jedis.pool.max-idle=8
# 连接池中的最小空闲连接
spring.redis.jedis.pool.min-idle=0

添加redis配置类

  • SpringBoot1.5x之前,Redis配置类如下:

      @Configuration@EnableCachingpublic 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();}};}@Beanpublic CacheManager cacheManager(RedisTemplate redisTemplate) {RedisCacheManager redisCacheManager = new RedisCacheManager(redisTemplate);return redisCacheManager;}}
  • SpringBoot2.0 Redis配置类如下(普遍使用了build模式),

      @Configuration@EnableCachingpublic class RedisConfig extends CachingConfigurerSupport {@Beanpublic CacheManager cacheManager(RedisConnectionFactory connectionFactory) {RedisCacheManager redisCacheManager = RedisCacheManager.builder(connectionFactory).build();return redisCacheManager;}@Beanpublic RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();redisTemplate.setConnectionFactory(redisConnectionFactory);// key序列化redisTemplate.setKeySerializer(new StringRedisSerializer());// value序列化redisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer(Object.class));  redisTemplate.afterPropertiesSet();return redisTemplate;}}

    缓存管理器

    • RedisCacheManager
    • SimpleCacheManager
    • NoOpCacheManager
    • ConcurrentMapCacheManager
    • CompositeCacheManager
    • EhCacheCacheManager

    序列化器

    • GenericToStringSerializer:使用Spring转换服务进行序列化;
    • JacksonJsonRedisSerializer:使用Jackson 1,将对象序列化为JSON;
    • Jackson2JsonRedisSerializer:使用Jackson 2,将对象序列化为JSON;
    • JdkSerializationRedisSerializer:使用Java序列化;
    • OxmSerializer:使用Spring O/X映射的编排器和解排器(marshaler和unmarshaler)实现序列化,用于XML序列化;
    • StringRedisSerializer:序列化String类型的key和value。

redis使用

  • 自动根据方法生成缓存

    访问/api/user/{id}接口,会将结果缓存。代码如下:

      @RestController@RequestMapping(value = "/api")public class StudentController {@AutowiredOmsUserRepository omsUserRepository;@GetMapping(value = "/user")public List<OmsUser> getAllUser() {return this.omsUserRepository.findAll();}@GetMapping(value = "/user/{id}")@Cacheable(value = "user-key")public OmsUser getUserById(@PathVariable("id") String id) {return omsUserRepository.findById(id).get();}}
    • @Cacheable

      表明spring在调用方法之前,首先应该在缓存中查找方法的返回值。如果这个值能够找到,就会返回缓存的值。否则的话,这个方法就会被调用,返回值会放到缓存之中。

    • @CachePut

      表明spring应该将方法的返回值放到缓存中。在方法的调用前不会检查缓存,方法始终都会被调用。

    • @CacheEvict

      表明spring应该在缓存中清除一个或多个条目

    • @Caching

      这是一个分组的注解,能够同时应用多个其它的缓存注解。

    自定义key

    @Cacheable@CachePut都有一个名为key属性,可使用spel表达式获取值。

    • #root.args:传递给缓存方法的参数,形式为数组
    • #root.caches:该方法执行时所对应的缓存,形式为数组
    • #root.target:目标对象
    • #root.targetClass:目标对象的类,等同#root.target.class
    • #root.method:缓存方法
    • #root.methodName:缓存方法的名字,等同root.method.name
    • #result:方法调用的返回值,不能用在@Cacheable注解上
    • #Argument:任意的方法参数名(如#argName)或参数索引(如#a0#p0)

    条件化缓存

    @Cacheable@CachePut提供了两个属性用以实现条件化缓存:unlesscondition,这两个属性都接受一个SpEL表达式。

    • unless

      仅阻止将对象放进缓存,在这个方法被调用的时候,依然会去缓存中进行查找,如果找到了匹配的值,就会返回找到的值。

    • condition

      如果表达式计算结果为false,那么在这个方法调用的过程中,缓存是被禁用的。即在这个方法被调用的时候,不会去缓存进行查找,同时返回值也不会放进缓存中。

  • 使用 Template(模版)

    模版种类:

    • StringRedisTemplate
    • RedisTemplate

    测试代码:

      @RunWith(SpringRunner.class)@SpringBootTestpublic class TestRedis {@Autowiredprivate StringRedisTemplate stringRedisTemplate;@Autowiredprivate RedisTemplate redisTemplate;@Testpublic void test() throws Exception {// setstringRedisTemplate.opsForValue().set("key", "value");// getString value = stringRedisTemplate.opsForValue().get("key");Assert.assertEquals("value", value);}@Testpublic void testObj() throws Exception {User user = new User("king", "boy", 18);ValueOperations<String, User> operations = redisTemplate.opsForValue();// setoperations.set("obj.user.key", user);// getUser user2 = operations.get("obj.user.key");Assert.assertEquals(user.getName(), user2.getName());Assert.assertEquals(user.getSex(), user2.getSex());Assert.assertEquals(user.getAge(), user2.getAge());}}

    测试代码中User user2 = operations.get("obj.user.key")会报错java.util.LinkedHashMap cannot be cast to User。修改redis配置类,如下:

      @Configuration@EnableCachingpublic class RedisConfig extends CachingConfigurerSupport {@Beanpublic CacheManager cacheManager(RedisConnectionFactory connectionFactory) {RedisCacheManager redisCacheManager = RedisCacheManager.builder(connectionFactory).build();return redisCacheManager;}@Beanpublic RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();redisTemplate.setConnectionFactory(redisConnectionFactory);// key序列化redisTemplate.setKeySerializer(new StringRedisSerializer());// value序列化// 使用Jackson ,将对象序列化为JSONJackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);//json 转对象类,不设置默认的会将json转成hashmapObjectMapper om = new ObjectMapper();om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);jackson2JsonRedisSerializer.setObjectMapper(om);redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);redisTemplate.afterPropertiesSet();return redisTemplate;}}
  • 共享 session

    • 添加依赖

        <dependency><groupId>org.springframework.session</groupId><artifactId>spring-session-data-redis</artifactId></dependency>
    • session配置

        @Configuration@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 86400*30)public class SessionConfig {}
    • 测试

        @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();}

      第一次访问后生成session,第二次及以后访问获取到session值相同。redis存储session形式如下图:

转载于:https://www.cnblogs.com/wscy/p/9241747.html

SpringBoot 2.x 集成 Redis相关推荐

  1. SpringBoot 2.x 集成Redis

    SpringBoot 2.x 使用 Lettuce 操作 Redis,Lettuce 使用 Netty 连接 Redis Server,多线程间共享实例,线程安全. 在之前文章SpringBoot项目 ...

  2. springboot集成redis集群实现集群拓扑动态刷新

    一个redis-cluster的三主三从集群,在其中一个master节点挂了之后,springboot集成redis集群配置信息没有及时刷新,出现读取操作报错.下面聊聊如何实现springboot集成 ...

  3. redis 依赖_springboot|springboot集成redis缓存

    javaDEMO 本网站记录了最全的各种JavaDEMO ,保证下载,复制就是可用的,包括基础的, 集合的, spring的, Mybatis的等等各种,助力你从菜鸟到大牛,记得收藏哦~~https: ...

  4. springboot mybatis ehcache_SpringBoot入门建站全系列(十四)集成Redis缓存

    SpringBoot入门建站全系列(十四)集成Redis缓存 一.概述 本地缓存,就是使用应用内使用本地内存将数据暂缓存储,一般数据库的查询如果不怎么改动,可以用本地缓存暂存. 远程缓存,比如redi ...

  5. SpringBoot集成Redis用法笔记

    今天给大家整理一下SpringBoot集成Redis用法笔记,希望对大家能有所帮助! 一.Redis优点介绍 1.速度快 不需要等待磁盘的IO,在内存之间进行的数据存储和查询,速度非常快.当然,缓存的 ...

  6. springboot集成redis使用redis作为session报错ClassNotFoundException类RememberMeServices

    springboot 集成redis使用redis作为缓存,会报错的问题. 错误信息: java.lang.IllegalStateException: Error processing condit ...

  7. SpringBoot集成Redis缓存

    SpringBoot集成Redis缓存 前言 本系列文章将简单的学习SpringCloud微服务相关知识,其实也是因为时间的原因,一直拖到现在,遂打算趁着假期,决定记录下来. 从天气预报微服务系统的单 ...

  8. 关于springboot集成redis及关于redis的Key 乱码问题

    一.在pom文件中引入redis <dependency><groupId>org.springframework.boot</groupId><artifa ...

  9. SpringBoot中集成Redis实现对redis中数据的解析和存储

    场景 SpringBoot中操作spring redis的工具类: SpringBoot中操作spring redis的工具类_霸道流氓气质的博客-CSDN博客 上面讲的操作redis的工具类,但是对 ...

最新文章

  1. 异步化,高并发大杀器
  2. 上银伺服驱动器接线图_伺服驱动器实际接线方法详解
  3. 网站SEO优化中长尾关键词的特征有哪些?
  4. php文件引用问题,Php引用文件引起的空白行问题(UTF-8)
  5. Java 反射 set get
  6. 子慕谈设计模式系列(二)——设计模式六大原则
  7. linux如何找大文件夹,Linux系统中如何查找大文件或目录文件夹的方法
  8. 【Python】statsmodels.formula.api模块中ols参数的解释
  9. 一条查询SQL的执行流程
  10. linux鼠标手势,Linux 系统中全能的鼠标手势——Easystroke.docx
  11. java怎么遵循ws规范,WS-BPEL语言基础
  12. Linux服务器下搭建SFTP服务
  13. Arduino基础语法
  14. Philo和潘多拉提供了一个打折的,但暂时的,3个月的电视和音乐捆绑
  15. 一个完整的URL地址包含什么
  16. 图像处理(4) : 图像颜色
  17. 实验课题——最全手机通信录实现版本(【含注释】848行代码)!!!(包括模糊查询、分类查找、模拟拨号、qsort函数实现排序、文件存储、防误触等功能)
  18. python2.4无线模块_用Python实现喇叭天线设计小工具(二)
  19. android canvas光晕绘制_Android 绘制发光效果
  20. 纯享三代HiFi reads,至美细菌完成图,加送质粒基因组!

热门文章

  1. SAP UI5应用中的component-preload.js在Netweaver上的存储
  2. SAP CRM BOL attribute_ref的merge逻辑调试
  3. Fiori Launchpad Tile点击后跳转的调试技巧
  4. PHP解压与配置的图片,PHP完善压缩处理类(支持主流的图像类型(jpg、png、gif)...
  5. cnsul linux环境后台启动_Redis安装和配置(Windows和Linux)
  6. videocapture.read()解决内存泄露_只需4个步骤,分析解决在生产环境下JVM内存泄露问题...
  7. 安装python3.7.0的步骤_CentOS7下简单安装python3.7.0步骤
  8. pc端汽车obd软件下载?_【软件】PandaOCR:PC端图片转文字识别软件
  9. 有序链表转换二叉搜索树Python解法
  10. python学习-综合练习二(整数和浮点数判断奇偶、质数判断)