SpringBoot整合Redis
Jedis
概念
Jedis Client 是Redis官网推荐的一个面向Java的客户端,其库文件实现了对各类API进行封装、调用。类似于JDBC。
整合
-
创建SpringBoot项目。
-
引入Jedis依赖
implementation group: 'redis.clients', name: 'jedis', version: '4.3.1'
-
通过实例连接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.
整合
-
创建Spring Boot项目
-
引入Lettuce依赖
implementation group: 'io.lettuce', name: 'lettuce-core', version: '6.2.2.RELEASE'
-
整合,例:
//使用构建器 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
推荐使用
整合
-
创建SpringBoot项目
-
引入依赖
implementation 'org.springframework.boot:spring-boot-starter-data-redis'
-
编写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
-
配置主启动类
-
使用
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); } }
-
扩展
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; } }