暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

在Spring Boot中使用Jedis

码上记录 2021-09-08
3214

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对象。


         @Bean
        JedisConnectionFactory connectionFactory() {
        return new JedisConnectionFactory();
        }


        3. 配置完连接后,就可以使用redis进行简单的存取了。


        如果存取的key,value都是String的,可以使用RedisTemplate<String, String>对象,该对象由spring boot自动扫描生成,在需要的地方可以直接注入。如果只是进行简单的存储,还可以生成ValueOperations对象来方便操作。


            @Bean
          ValueOperations<String, String> strOperations(RedisTemplate<String, String> redisTemplate) {
          return redisTemplate.opsForValue();
          }


           4. 如果想要存取其他类型的对象,例如存取key为string,value为Integer类型的对象,可以new这个对象,然后配置连接即可使用


               @Bean
            RedisTemplate<String, Integer> intRedisTemplate(JedisConnectionFactory connectionFactory) {
            RedisTemplate<String, Integer> redisTemplate = new RedisTemplate<>();
            redisTemplate.setConnectionFactory(connectionFactory);
            return redisTemplate;
            }


            @Bean
            ValueOperations<String, Integer> intOperations(RedisTemplate<String, Integer> redisTemplate) {
            return redisTemplate.opsForValue();
            }


            5. RedisTemplate对象默认使用jdkSerializer实现序列化,如果想要更换序列化的实现方式,例如使用json实现value的序列化,可以进行如下配置。


              @Bean
              Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer(ObjectMapper objectMapper) {
              Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<Object>(
              Object.class);
              jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
              return jackson2JsonRedisSerializer;
              }


              @Bean
              RedisTemplate<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;
              }


              @Bean
              ValueOperations<String, Object> objOperations(RedisTemplate<String, Object> redisTemplate) {
              return redisTemplate.opsForValue();
              }


              6. 创建完了需要的对象之后,可以新建一个JedisHelper类,把对Redis的操作都封装一下,在需要的地方直接调用JedisHelper对象即可。


                @Component
                public class JedisHelper {


                @Autowired
                private ValueOperations<String, String> strOperations;


                @Autowired
                private ValueOperations<String, Integer> intOperations;

                @Autowired
                private ValueOperations<String, Object> objOperations;


                @Autowired
                private 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


                文章转载自码上记录,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                评论