SpringBoot整合Redis

文章介绍了如何在SpringBoot项目中整合Redis,分别展示了Jedis和Lettuce两种客户端的连接与操作方法,强调了Lettuce的线程安全优势。此外,还提到了RedisTemplate作为推荐的整合方式,并给出了配置和使用示例。
摘要由CSDN通过智能技术生成

Jedis

概念

Jedis Client 是Redis官网推荐的一个面向Java的客户端,其库文件实现了对各类API进行封装、调用。类似于JDBC。

整合

  1. 创建SpringBoot项目。

  2. 引入Jedis依赖implementation group: 'redis.clients', name: 'jedis', version: '4.3.1'

  3. 通过实例连接Redis.例:

    	//与对应的Redis进行连接
       Jedis jedis = new Jedis("127.0.0.1",6379);
       	//连接Redis的密码,如果没有密码可注释掉
       	jedis.auth("password");
       	//相当于 Redis 的 PING 命令
        System.out.println(jedis.ping());
    	// Redis 的 FLUSHALL
        jedis.flushAll();
        // keys *
        System.out.println(jedis.keys("*"));
        // set k1 jedis;
        jedis.set("k1","jedis");
        System.out.println("==============");
        // get k1
        System.out.println(jedis.get("k1"));
        System.out.println("============");
        // keys *
        System.out.println(jedis.keys("*"));
    

Lettuce

概念

Lettue是Redis的一个Java驱动包。

Jedis和Lettuce的区别

Jedis和Lettuce都是Redis的客户端,他们都可以连接Redis服务器。但是,从Spring Boot2.0之后默认都是用了Lettuce的客户端连接Redis。
因为在使用Jedis客户端连接Redis服务器的时候,每个线程都要拿自己创建的Jedis实例去连接。当线程较多时,会反复的创建、关闭Jedis连接,而且也是线程不安全的,一个线程通过Jedis实例更改Redis中的数据后可能会影响另一个线程。
如果使用Lettuce去连接Redis,就不会出现该情况。Lettuce的底层是Netty,有多个线程去连接Redis服务器的时候,可以保证只创建一个Lettuce,所有的线程共享这一个Lettuce.

整合

  1. 创建Spring Boot项目

  2. 引入Lettuce依赖implementation group: 'io.lettuce', name: 'lettuce-core', version: '6.2.2.RELEASE'

  3. 整合,例:

      //使用构建器 RedisURI.builder
        RedisURI uri = RedisURI.Builder
                .redis("127.0.0.1")
                .withPort(6379)
                //没有密码可不加
                .withAuthentication("default","111111")
                .build();
        //创建连接客户端
        RedisClient client = RedisClient.create(uri);
        StatefulRedisConnection conn = client.connect();
        //操作命令api
        RedisCommands<String,String> commands = conn.sync();
    
        //keys
        List<String> list = commands.keys("*");
        for(String s : list) {
            System.out.println(s);
        }
        //String
        commands.set("k1","1111");
        String s1 = commands.get("k1");
        System.out.println("String s ==="+s1);
        //关闭
        conn.close();
        client.shutdown();
    

RedisTemplate

推荐使用

整合

  1. 创建SpringBoot项目

  2. 引入依赖implementation 'org.springframework.boot:spring-boot-starter-data-redis'

  3. 编写application.properties

    spring.redis.database=0
    spring.redis.host=127.0.0.1
    spring.redis.port=6379
    spring.redis.password=111111
    spring.redis.lettuce.pool.max-active=8
    spring.redis.lettuce.pool.max-wait=-1ms
    spring.redis.lettuce.pool.max-idle=8
    spring.redis.lettuce.pool.min-idle=0
    
  4. 配置主启动类

  5. 使用

    Service层

    @Service
    @Slf4j
    public class OrderService
    {
        public static final String ORDER_KEY = "order:";
    
        @Resource
        private RedisTemplate redisTemplate;
    
        public void addOrder()
        {
            int keyId = ThreadLocalRandom.current().nextInt(1000)+1;
            String orderNo = UUID.randomUUID().toString();
            redisTemplate.opsForValue().set(ORDER_KEY+keyId,"京东订单"+ orderNo);
            log.info("=====>编号"+keyId+"的订单流水生成:{}",orderNo);
        }
    
        public String getOrderById(Integer id)
        {
            return (String)redisTemplate.opsForValue().get(ORDER_KEY + id);
        }
    }
    

    Controller层

    @RestController
    @Slf4j
    public class OrderController
    {
        @Resource
        private OrderService orderService;
    
    
        @RequestMapping(value = "/order/add",method = RequestMethod.POST)
        public void addOrder()
        {
            orderService.addOrder();
        }
    
    
        @RequestMapping(value = "/order/{id}", method = RequestMethod.GET)
        public String findUserById(@PathVariable Integer id)
        {
            return orderService.getOrderById(id);
        }
    }
    
  6. 扩展
    Config

    @Configuration
    public class RedisConfig
    {
        /**
         * redis序列化的工具配置类,下面这个请一定开启配置
         * 127.0.0.1:6379> keys *
         * 1) "ord:102"  序列化过
         * 2) "\xac\xed\x00\x05t\x00\aord:102"   野生,没有序列化过
         * this.redisTemplate.opsForValue(); //提供了操作string类型的所有方法
         * this.redisTemplate.opsForList(); // 提供了操作list类型的所有方法
         * this.redisTemplate.opsForSet(); //提供了操作set的所有方法
         * this.redisTemplate.opsForHash(); //提供了操作hash表的所有方法
         * this.redisTemplate.opsForZSet(); //提供了操作zset的所有方法
         * @param lettuceConnectionFactory
         * @return
         */
        @Bean
        public RedisTemplate<String, Object> redisTemplate(LettuceConnectionFactory lettuceConnectionFactory)
        {
            RedisTemplate<String,Object> redisTemplate = new RedisTemplate<>();
    
            redisTemplate.setConnectionFactory(lettuceConnectionFactory);
            //设置key序列化方式string
            redisTemplate.setKeySerializer(new StringRedisSerializer());
            //设置value的序列化方式json,使用GenericJackson2JsonRedisSerializer替换默认序列化
            redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
    
            redisTemplate.setHashKeySerializer(new StringRedisSerializer());
            redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
    
            redisTemplate.afterPropertiesSet();
    
            return redisTemplate;
        }
    }
    
    
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值