接Java整合Redis及序列化(上) RedisConfig.java序列化配置 import com.alibaba.fastjson.support.spring.GenericFastJsonRedisSerializer...redisTemplate; /** * 设置序列化 * key设置String类型序列化 * value设置阿里的FastJson序列化 *...(new GenericFastJsonRedisSerializer()); return redisTemplate; } } 重点!!!...-->里面包含的代码和RedisConfig.java同时存在,Spring将会以RedisConfig.java为高优先级使用过,如果配置了RedisConfig.java,记得在application-redis.xml...中引入,本文在xml文件中最下面,xml中注释可删除的代码可有可无 补充说明 针对SpringBoot项目,如果使用的是SpringBoot项目只需要在RedisConfig.java类的上面加上@Configuration
核心属性如下: // RedisTemplate.java // 艿艿省略了一些不重要的属性。...具体的,可以看看 RedisTemplate#afterPropertiesSet() 方法,在 RedisTemplate 未设置序列化的情况下,使用 JdkSerializationRedisSerializer...,就是使用使用传入对象的 classPropertyTypeName 属性对应的值,作为默认类型(Default Typing)。... 处,如果未传入 classPropertyTypeName 属性,则使用传入对象的类全名,作为默认类型(Default Typing)。...,所以序列化的 JSON 字符串,无需在存储一个 @class 属性,用于存储类型。
背景 实体类UserDto extends BaseEntity,两个类的上方都有标注,Lombok的@Data注解,但是使用时UserDto的实例对象调用toString方法时发现,只打印出来自身子类的属性信息...,并没有打印出来父类的信息。...String email; /** * 排序 */ @TableField("sort") private Integer sort; 解决 在@Data的基础上再加一个...@ToString(callSuper = true)注解,callSuper = true即解决缺少父类属性的问题。...本篇文章如有帮助到您,请给「翎野君」点个赞,感谢您的支持。 首发链接:https://www.cnblogs.com/lingyejun/p/18571209
在 Spring MVC 中集成 Fastjson 如果你使用 Spring MVC 来构建 Web 应用并对性能有较高的要求的话,可以使用 Fastjson 提供的FastJsonHttpMessageConverter...来替换 Spring MVC 默认的 HttpMessageConverter 以提高 @RestController @ResponseBody @RequestBody 注解的 JSON序列化速度...(通常是基于 Spring Boot 项目)配置 RedisTemplate 的话只需在你的配置类(被@Configuration注解修饰的类)中显式创建 RedisTemplate Bean,设置 Serializer...(fastJsonRedisSerializer);//单独设置valueSerializer return redisTemplate; } 通常使用 GenericFastJsonRedisSerializer...即可满足大部分场景,如果你想定义特定类型专用的 RedisTemplate 可以使用 FastJsonRedisSerializer 来代替 GenericFastJsonRedisSerializer
; 并支持使用JCache(JSR-107)注解简化我们开发; 默认使用 ConcurrenMapCacheManager Cache接口为缓存的组件规范定义,包含缓存的各种操作集合; Cache接口下...使用Spring缓存抽象时我们需要关注以下两点; 1、确定方法需要被缓存以及他们的缓存策略 2、从缓存中读取之前缓存存储的数据 三、几个重要概念&缓存注解 四、整合redis实现缓存 创建项目...字段 dID ,编辑器生成的是 getdId() ,而lombok 编译成的是getDId(),这中情况会可能会导致序列化成json时多出一个字段 json串出现 did 和 dId ,出现这种情况时,...RedisTemplate(); template.setConnectionFactory(redisConnectionFactory); GenericFastJsonRedisSerializer...启动类 SpringbootCacheApplication 使用**@EnableCaching**开启缓存 @EnableCaching @SpringBootApplication public
概述 背景 问题描述 报错原因 原因分析 小结 ---- 概述 RedisTemplate的Serializer将不同的数据类型进行序列化时,内置了一套逻辑,譬如Long类型的追回“L”,Byte的追加...对应的数字+1 3、执行incr命令执行结果为1时【当前统计周期内第一次访问】,使用expire命令将key的过期时间设置为统计周期 4、根据incr的结果判断是否超出访问频率 看看上面的线程安全问题...RedisTemplate执行上面的lua脚本是可以的。...4、redisTemplate处理long时为啥加了L? 与redisTemplate使用的Serializer有关。...genericFastJsonRedisSerializer = new GenericFastJsonRedisSerializer(); redisTemplate.setDefaultSerializer
核心属性如下: // RedisTemplate.java // 艿艿省略了一些不重要的属性。...,就是使用使用传入对象的 classPropertyTypeName 属性对应的值,作为默认类型(Default Typing)。... 处,如果未传入 classPropertyTypeName 属性,则使用传入对象的类全名,作为默认类型(Default Typing)。...序列化」 小节中,我们仔细翻看了每个序列化方式,暂时没有一个能够完美的契合我们的需求,所以我们直接使用最简单的 StringRedisSerializer 作为序列化实现类。...如果不传,则使用 RedisTemplate 自己的序列化相关的属性。 5.1.1 源码解读 在看具体的 #executePipelined(RedisCallback<?
; redisTemplate.setConnectionFactory(redisConnectionFactory); //声明 key 和 value 的序列化方式...(keySerializer); redisTemplate.setValueSerializer(valueSerializer); //多种的序列化方式 最好是谁序列化的谁处理...; } } 商品列表 商品列表界面,是比较简单的,设计思路还是基于传统的三层开发 Controller -> servier -> dao这样的分层开发模式 实体类 这里为了方面展示,就展示实体类的属性...100 抢 10 可以发现使用了 事务之后我们解决了超卖的问题 举一反三 那除了事务 还有什么方式可以解决超卖问题呢?...("lua/sekill.lua"))); 设置脚本的位置,之后用之前工具类封装的redis方法将脚本和需要的参数list 传入执行即可 //使用lua 脚本 保证原子性 (分布式锁)
本篇着重介绍一下几种常用的序列化方式 最近在做一个项目,由于并发量大,大量使用到了RedisTemplate来操作Redis。但使用过程中,遇到了不少的坑,各种翻看源码来跟踪,也总结出了不少的经验。...在执行序列化的时候,操作的如果是Bean,必须有默认构造器,否则报错 redis集群问题(关于集群的这几个问题,后续在专门演示和解释) 如果连接的为Redis集群,则不能用管道的方法,除非改写管道的类...下面主要介绍一下,Spring官方现在还存在的6大序列化器: Generic单词意思:一般的; 通用的;类的,属性的; OxmSerializer 以xml格式存储(但还是String类型~)...因此几乎没有人再使用此方式了 JdkSerializationRedisSerializer 从源码里可以看出,这是RestTemplate类默认的序列化方式。...FastJsonRedisSerializer和GenericFastJsonRedisSerializer 和上面一样讲述的一样,FastJsonRedisSerializer需要指定反序列化类型,
父类和子类对象的获取值的方式验证,通过父类属性的方式获取不到值,需要使用get方法 静态属性通过类.属性的方式获取,对象获取使用get方法获取 package com.example.core.mydemo.java...String channelName) { this.channelName = channelName; } /** * partnerName: //通过父类属性的方式获取不到值...,需要使用get方法 * channelName: //通过父类属性的方式获取不到值,需要使用get方法 * partnerName2:合作商名称 * channelName2...* channelName3:渠道商名称 //对象自身的属性值可以获取 * partnerName4:合作商名称 * channelName4:渠道商名称...* MAX=100 静态属性通过类.属性的方式获取,对象获取使用get方法获取 * @param args */ public static void main(String
常用缓存操作流程 整合Spring Cache 在ArticleController类上实现一个简单的例子 更改Redis缓存的序列化方式 详述缓存声明式注解的使用 缓存注解-增删改查 单个对象的查询缓存...redisTemplate操作数据 redis模板封装类 RedisTemplate 的封装使我们能够更方便的进行redis数据操作,比直接使用Jedis或者Lettuce的java SDK要方便很多。...因为RedisTemplate默认使用的是JdkSerializationRedisSerializer,也就是使用Java JDK默认的序列化方式存储数据。...而且是以二进制形式保存,自然人无法理解。 Jackson2JsonRedisSerializer: 使用Jackson库将对象序列化为JSON字符串。...; } //本节的重点配置,让Redis缓存的序列化方式使用redisTemplate.getValueSerializer() //不在使用JDK默认的序列化方式 @Bean
redisTemplate.setConnectionFactory(factory); // 使用 Jackson2JsonRedisSerializer 来序列化和反序列化 redis 的...); // 解决jackson2无法反序列化LocalDateTime的问题 om.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS...我们使用 RedisTemplate 来操作,以下代码为对 Hash 类型数据进行操作的工具类 RedisUtil。...因为文章参数类继承了文章类,因此反射获取属性的时候需要获取父类属性): @Override public boolean saveArticle(String key, ArticlePublishParam...获取父类字段 Class superClazz = clazz.getSuperclass(); if (superClazz !
hset 父key 子key 子value 将父key,增加子键值对,类似属性 hget 父key 子key 获取父key,某个子key的值,获取属性值 hmset 父key 子key1 子val1...批量获取属性 hgetall 父key 批量获取属性及值 hdel 父key 子key 删除子key属性及值 hlen 父key 返回父key中的子key个数,相当于java实体的属性个数 hexists...redisTemplate,存放key和value值时,会自动使用Object类的序列化和反序列化,导致redis中真实存放的数据不是原始值,而是序列化后的值 数据结果: 2.4 自定义redisTemplate...配置类 //Redis自定义配置类,实现一个自定义序列化方式的 redisTemplate,提缓缓掉默认自动配置的 redisTemplate,实现String类型任意类型的value @Configuration...: 2.5 自定义redisUtils工具类 2.5.1 自定义redisUtils工具类 ---> RedisUtil 工具类 2.5.2 使用自定义redisTemplate和redisUtils
// strategy.setSuperControllerClass("你自己的父类控制器,没有就不用设置!")...: -1ms #连接池中的最小空闲连接 min-idle: 0 redisTemplate默认是jdk序列化方式,增加配置类 package com.dsw.kpay.config...* SDR项目操作Redis的话需要使用RedisTemplate对象 * 但是该对象默认使用的数据序列化方法是JDK的,可能会存在特殊字符 * * key和hashKey 我们推荐使用String...引用JSON序列化 jackson2JsonRedisSerializer.setObjectMapper(om); //创建String序列化,我们的key使用String...的序列化方式 redisTemplate.setHashKeySerializer(stringRedisSerializer); // value序列化方式采用JSON
目标是 同时使用redis 和encache 部分缓存使用redis,部分缓存使用encache,可代码自动选择 在pom.xml中增加支持 <!...配置中增加数据源 : 如数据库等 CacheManagerConfig package com.demo.cache; import com.alibaba.fastjson.support.spring.GenericFastJsonRedisSerializer...* @param redisTemplate 通过参数注入,这里没有手动给它做配置。...在引入了redis的jar包,并且往 * application.yml里添加了spring.redis的配置项,springboot的autoconfig会自动生成一个 * redisTemplate...,建议组件相关配置都放在相应的configuration类中 * * @author */ @Configuration @ConditionalOnBean(RedisCacheManager.class
key 的序列化规则。...erializeValuesWith():设置 Redis 的 value 的序列化规则。computePrefixWith():计算 Redis 的 key 前缀。...调用父类的 createRedisCache(name, cacheConfig) 方法来完成缓存写入。...接着我们修改下 CacheConfig 类的 cacheManager 方法用以使用 MyRedisCacheManager 类。...@Cacheable 注解时,在原有 value 属性的 configCache 值后添加 #600,单独标识缓存有效期。
一般来说我们更倾向于在SpringBoot中使用 Spring Data Redis来操作Redis,但是随着而来的则是它的序列化问题,默认使用的是JdkSerializationRedisSerializer...针对这种情况我们可以使用Jackson2JsonRedisSerializer这一序列化方式,不建议使用StringRedisTemplate来替代RedisTemplate,因为它提供的数据类型和操作都有限...定义一个名为RedisConfig的类,该类用于重写RedisTempplate的序列化逻辑,使用Jackson2JsonRedisSerializer取代默认的JdkSerializationRedisSerializer...type: jpg # 验证码格式 timeout: 60 # 验证码过期时间,单位秒 读取配置文件 第七步,新建config包,并在该包内新建一个名为VerifyCodeConfig的属性配置类...,该类用于将用户在application.yml配置文件中定义的配置项与VerifyCodeConfig这一属性POJO类进行映射: @Component @ConfigurationProperties
private RedisTemplate redisTemplate; 执行测试类,并查看Redis中的数据 key与value的序列化方式都是AlphaRedisTemplate设置的String...或者可以使用@Resource注解指定注入实现类。...这种循环依赖属于构造器循环依赖,JVM在实例化类时,需要先实例化构造器中的参数,由于参数无法提前实例化导致报错。...Spring 能解决循环依赖的问题,值得是解决属性依赖的问题,将上面两个类中构造起方法删除,使用@Autowire注解注入属性,改为属性依赖即可。...Spring使用三级缓存策略来解决循环依赖的问题,只能解决单例模式下的循环依赖 一级缓存:用于存放完全初始化好的Bean 二级缓存:存放原始的Bean对象(未填充属性),用于解决循环依赖 三级缓存:存放
当然也可以自己定义序列化方式,使用别的Json工具类,或者别的什么方法来完成序列化方式。 完成RedisTemplate的设置后,再次save一个Post对象来看看在redis里的存储方式。 ?...在上一篇里,还提到了无需配置yml中redis的属性,ip、port之类的,系统会识别默认的。下面来看看如何使用自己的redis配置。...可以用ctrl加左键点击host或者post属性,进入类。 ? 这个就是采用prefix=spring.redis前缀的配置类,我们也可以自定义类似的配置类。...在配置文件里设置了ip和port及pool等属性,然后打开RedisCacheConfig类,来使用yml里的这些redis配置。...JedisConnectionFactory,这里我们使用配置文件定义的属性来创建一个自己的JedisConnectionFactory。
RedisTemplate默认采用的是JDK的序列化策略,保存的key和value都是采用此策略序列化保存的。...序列化方式;此时执行完整个方法后,还需要接着执行setConnectionFactory()方法,然后转向他的父类RedisTemplate中的afterPropertiesSet方法,此时上述四个序列化方式已经设置...RedisTemplate使用的序列类在在操作数据的时候,比如说存入数据会将数据先序列化成字节数组然后在存入Redis数据库,这个时候打开Redis查看的时候,你会看到你的数据不是以可读的形式展现的,...,比如说下面这种形式的数据(StringRedisTemplate) 当Redis当中的数据值是以数组形式显示出来的时候,只能使用RedisTemplate才能获取到里面的数据。...所以当你使用RedisTemplate获取不到数据为NULL时,一般是获取的方式错误。检查一下数据是否可读即可。
领取专属 10元无门槛券
手把手带您无忧上云