项目集成Redis
redis的Java客户端类型有很多,常见的有jedis, redission,lettuce等
| redis客户端 | 使用场景 | 线程安全 |
|---|---|---|
| lettuce | 在需要异步处理、线程安全以及支持哨兵和集群模式的场景 | 线程安全 |
| jedis | 简单的同步操作以及在不需要哨兵和集群模式的场景 | 线程不安全 |
第一步:Maven依赖
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-redis</artifactId>
<version>2.1.4.RELEASE</version>
</dependency>
Spring Boot 2.x及以后的版本,默认使用lettuce客户端(其中缺少连接池依赖commons-pool2),若想使用jedis客户端,依赖中可排除并引用jedis依赖
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<exclusions>
<exclusion>
<groupId>io.lettuce</groupId>
<artifactId>lettuce-core</artifactId>
</exclusion>
</exclusions>
</dependency>
第二步:配置文件
<!-- redis连接池配置-->
<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig" >
<!--最大空闲数-->
<property name="maxIdle" value="${redis.maxIdle}" />
<!--连接池的最大数据库连接数 -->
<property name="maxTotal" value="${redis.maxTotal}" />
<!--最大建立连接等待时间-->
<property name="maxWaitMillis" value="${redis.maxWaitMillis}" />
<!--逐出连接的最小空闲时间 默认1800000毫秒(30分钟)-->
<property name="minEvictableIdleTimeMillis" value="${redis.minEvictableIdleTimeMillis}" />
<!--每次逐出检查时 逐出的最大数目 如果为负数就是 : 1/abs(n), 默认3-->
<property name="numTestsPerEvictionRun" value="${redis.numTestsPerEvictionRun}" />
<!--逐出扫描的时间间隔(毫秒) 如果为负数,则不运行逐出线程, 默认-1-->
<property name="timeBetweenEvictionRunsMillis" value="${redis.timeBetweenEvictionRunsMillis}" />
<!--是否在从池中取出连接前进行检验,如果检验失败,则从池中去除连接并尝试取出另一个-->
<property name="testOnBorrow" value="${redis.testOnBorrow}" />
<property name="testOnReturn" value="${redis.testOnReturn}" />
<!--在空闲时检查有效性, 默认false -->
<property name="testWhileIdle" value="${redis.testWhileIdle}" />
</bean >
<!--redis连接工厂 -->
<bean id="jedisConnectionFactory"
class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"
destroy-method="destroy"
p:hostName="${redis.hostName}"
p:port="${redis.port}"
p:password="${redis.password}"
p:database="${redis.database}"
p:timeout="${redis.timeout}"
p:poolConfig-ref="jedisPoolConfig"/>
<!-- redis操作模板,使用该对象可以操作redis -->
<bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
<property name="connectionFactory" ref="jedisConnectionFactory" />
<!-- 如果不配置Serializer,那么存储的时候只能使用String,如果用对象类型存储,那么会提示错误 can't cast to String!!! -->
<property name="keySerializer">
<bean class="org.springframework.data.redis.serializer.StringRedisSerializer" />
</property>
<property name="hashKeySerializer">
<bean class="org.springframework.data.redis.serializer.StringRedisSerializer" />
</property>
<property name="valueSerializer">
<bean class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer" />
</property>
<!-- 需自定义Serializer,方便在客户端中查看对象值(使用JdkSerializationRedisSerializer,对象值是乱码)-->
<property name="hashValueSerializer">
<bean class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer" />
</property>
</bean>
spring:
reids:
host: 127.0.0.1
port: 6379
password:
timeout: 2000
database: 0
cluster:
nodes: 127.0.0.1:7001,127.0.0.1:7002,127.0.0.1:7003,127.0.0.1:7004,127.0.0.1:7005
max-redirects: 3
lettuce:
pool:
max-idle:
max-active:
min-idle:
第三步:使用
private RedisTemplate<String, Object> redisTemplate;
redisTemplate.hasKey(key);
redisTemplate.opsForValue().get(key);
...
封装为RedisUtil工具类使用
Redis中有string, list, hash,set, zset五种数据格式,这五种数据格式的常用操作,都在RedisTemplate封装了常用的操作(opsForValue,listOps,setOps...)
深入扩展-序列化器
Redis本身提供了以下几种序列化器
GenericToStringSerializer: 泛化为字符串并序列化
JacksonJsonRedisSerializer: 序列化为json字符串
Jackson2JsonRedisSerializer: 类同JacksonJsonRedisSerializer
JdkSerializationRedisSerializer: 序列化为java对象
StringRedisSerializer: 简单的字符串序列化
存储String类型数据时,默认使用StringRedisSerializer; 存储对象类型数据时,默认使用JdkSerializationRedisSerializer。(底层以ObjectOutputStream和ObjectInputStream对象输入输出流实现)
即默认的序列化器存储对象后,通过Redis客户端无法直观的看到对象的具体值,不方便项目跟踪排查问题。
针对对象类型序列化解决方案:通过配置类中创建RedisTemplate,并指定对应的序列化器(Jackson2JsonRedisSerializer)