本文继上文开始讲述了Redis在IDEA中如何应用以及集成进入spring开发环境,以及如何使用Redis客户端。上一个文章:Redis学习篇1:初识Redishttps://blog.csdn.net/jialuosi/article/details/139057088
一、Redis在java中的客户端
二、SpringDataRedis
三、SpringDataRedis快速入门
3.1、使用SpringDataRedis
3.2、序列化与反序列化
3.3、StringRedisTemplate
一、Redis在java中的客户端
-
Jedis和Lettuce:这两个主要是提供了Redis命令对应的API,方便我们操作Redis,而SpringDataRedis又对这两种做了抽象和封装,因此我们后期会直接以SpringDataRedis来学习。
-
Redisson:是在Redis基础上实现了分布式的可伸缩的java数据结构,例如Map.Queue等,而且支持跨进程的同步机制:Lock.Semaphore等待,比较适合用来实现特殊的功能需求。
上述两种是相当于原生的java客户端,在目前大部分都是spring的开发环境下,早已不流行使用,接下来我们着重的讲一下SpringDataRedis。
二、SpringDataRedis
SpringData是Spring中数据操作的模块,包含对各种数据库的集成,其中对Redis的集成模块就叫做SpringDataRedis,官网地址:Spring Data Redis
-
提供了对不同Redis客户端的整合(Lettuce和Jedis)
-
提供了RedisTemplate统一API来操作Redis
-
支持Redis的发布订阅模型
-
支持Redis哨兵和Redis集群
-
支持基于Lettuce的响应式编程
-
支持基于JDK.JSON.字符串.Spring对象的数据序列化及反序列化
-
支持基于Redis的JDKCollection实现
我们在学习篇1中曾经提到过,Redis不同于MySQL,他在不同的环境下查询语句并不相同,之前操作String用set,get等,操作Hash用hset,hget等,但是在SpringDataRedis中提供了RedisTemplate工具类,其中封装了各种对Redis的操作。并且将不同数据类型的操作API封装到了不同的类型中:
关说不练没意义,我们继续往下看如何在项目中集成SpringDataRedis。
三、SpringDataRedis快速入门
3.1、使用SpringDataRedis
想要使用SpringDataRedis非常简单,只需要执行以下三个使用步骤:
-
引入spring-boot-starter-data-redis依赖
-
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency>
-
-
在application.yml配置Redis信息
-
server: port: 8081 spring: redis: host: 127.0.0.1 port: 6379 password: 123456 #没有则不用填 lettuce: pool: max-active: 8 #最大连接 max-idle: 8 #最大空闲连接 min-idle: 0 #最小空闲连接 max-wait: 100ms #连接等待时间
-
-
注入RedisTemplate
-
@SpringBootTest class RedisDemoApplicationTests { @Autowired private RedisTemplate<String, Object> redisTemplate; @Test void testString() { // 写入一条String数据 redisTemplate.opsForValue().set("name", "jialuosi"); // 获取string数据 Object name = redisTemplate.opsForValue().get("name"); System.out.println(name); } }
-
3.2、序列化与反序列化
RedisTemplate可以接收任意Object作为值写入Redis,只不过写入前会把Object序列化为字节形式,默认是采用JDK序列化,得到的结果是这样的:(值就是我们存入的name的value:jialuosi)
这种序列化的方式,其缺点已经非常的明显:可读性非常差,内存占用较大。所以该如何解决呢?
方案一:
自定义RedisTemplate
修改RedisTemplate的序列化器为GenericJackson2JsonRedisSerializer
缺点:为了在反序列化时知道对象的类型,JSON序列化器会将类的class类型写入json结果中,存入Redis,会带来额外的内存开销。
方案二:
使用StringRedisTemplate
写入Redis时,手动把对象序列化为JSON
读取Redis时,手动把读取到的JSON反序列化为对象
因为种种原因,方案一也有很多的问题,所以我们之间讲解方案二、避免白雪。
3.3、StringRedisTemplate
为了减少内存的消耗,我们可以采用手动序列化的方式,换句话说,就是不借助默认的序列化器,而是我们自己来控制序列化的动作,同时,我们只采用String的序列化器,这样,在存储value时,我们就不需要在内存中就不用多存储数据,从而节约我们的内存空间。
这种用法比较普遍,因此SpringDataRedis就提供了RedisTemplate的子类:StringRedisTemplate,它的key和value的序列化方式默认就是String方式。
而关于如何序列化以及反序列化可以看我的这篇文章:JAVA:浅谈JSON与JSON转换https://blog.csdn.net/jialuosi/article/details/139005572
下面是实操代码,其中实体类只赋值了ID以及名字,从 序列化为JSON数据存入Redis 到 从Redis中取出JSON然后反序列化为实体类对象 的过程。