Jedis是一个Java版本Redis客户端,提供了比较全面的Redis命令支持,而且很容易使用。Jedis基于阻塞式IO,方法调用都是同步的,不支持异步调用。
Jedis实例是非线程安全的,一个Jedis实例只能供一个线程使用,不能被多个线程共用。如果有多个线程都需要使用Jedis实例,可以使用线程池的方式,一次多创建一些Jedis的实例,需要的线程去Jedis线程池获取即可。
Spring Boot 1.X 版本默认使用Jedis作为连接Redis的客户端,2.X版本默认使用Lettuce作为连接Redis的客户端。
下面看一下怎么在Spring Boot中使用Jedis。
1. 导入Jedis的Jar包。
Spring Boot 1.X 在pom文件中这么写。
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency>
Spring Boot 2.X 在pom文件中这么写,先排除默认的Lettuce的客户端,再导入Jedis客户端。
<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><dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId></dependency>
2. 导入jar包之后,先创建一个JedisConnectionFactory对象。
@BeanJedisConnectionFactory connectionFactory() {return new JedisConnectionFactory();}
3. 配置完连接后,就可以使用redis进行简单的存取了。
如果存取的key,value都是String的,可以使用RedisTemplate<String, String>对象,该对象由spring boot自动扫描生成,在需要的地方可以直接注入。如果只是进行简单的存储,还可以生成ValueOperations对象来方便操作。
@BeanValueOperations<String, String> strOperations(RedisTemplate<String, String> redisTemplate) {return redisTemplate.opsForValue();}
4. 如果想要存取其他类型的对象,例如存取key为string,value为Integer类型的对象,可以new这个对象,然后配置连接即可使用
@BeanRedisTemplate<String, Integer> intRedisTemplate(JedisConnectionFactory connectionFactory) {RedisTemplate<String, Integer> redisTemplate = new RedisTemplate<>();redisTemplate.setConnectionFactory(connectionFactory);return redisTemplate;}@BeanValueOperations<String, Integer> intOperations(RedisTemplate<String, Integer> redisTemplate) {return redisTemplate.opsForValue();}
5. RedisTemplate对象默认使用jdkSerializer实现序列化,如果想要更换序列化的实现方式,例如使用json实现value的序列化,可以进行如下配置。
@BeanJackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer(ObjectMapper objectMapper) {Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<Object>(Object.class);jackson2JsonRedisSerializer.setObjectMapper(objectMapper);return jackson2JsonRedisSerializer;}@BeanRedisTemplate<String, Object> objRedisTemplate(JedisConnectionFactory connectionFactory,Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer) {RedisTemplate<String, Object> redisTemplate = new RedisTemplate<String, Object>();redisTemplate.setConnectionFactory(connectionFactory);redisTemplate.setDefaultSerializer(jackson2JsonRedisSerializer);StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();redisTemplate.setKeySerializer(stringRedisSerializer);redisTemplate.setHashKeySerializer(stringRedisSerializer);return redisTemplate;}@BeanValueOperations<String, Object> objOperations(RedisTemplate<String, Object> redisTemplate) {return redisTemplate.opsForValue();}
6. 创建完了需要的对象之后,可以新建一个JedisHelper类,把对Redis的操作都封装一下,在需要的地方直接调用JedisHelper对象即可。
@Componentpublic class JedisHelper {@Autowiredprivate ValueOperations<String, String> strOperations;@Autowiredprivate ValueOperations<String, Integer> intOperations;@Autowiredprivate ValueOperations<String, Object> objOperations;@Autowiredprivate RedisTemplate<String, Integer> redisTemplate;//操作的业务逻辑...}
参考文档:
1.http://docs.spring.io/spring-data/redis/docs/current/reference/html/
2.http://docs.spring.io/spring-framework/docs/4.0.4.RELEASE/javadoc-api/org/springframework/context/annotation/Configuration.html
3.http://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/context/annotation/Bean.html




