一 SpringBoot整合

SpringBoot官方有对Redis的支持。在1.x的时候,SpringBoot底层使用Jedis连接Redis,在2.x之后,改为Lettuce,因为Jedis采用的是直连的方式,有多个线程操作的话,会有线程不安全问题,想要避免,需要使用jedis pool。Lettuce采用netty,实例可以在多个线程中进行共享,不存在线程安全问题,可以减少线程数据,更像NIO的方式

  • maven依赖 ```xml org.springframework.boot spring-boot-starter-data-redis

org.apache.commons commons-pool2

  1. <a name="ZamBK"></a>
  2. ## 1.1 初始配置
  3. - properties配置
  4. ```markdown
  5. # host
  6. spring.redis.host=127.0.0.1
  7. # 端口
  8. spring.redis.port=6379
  9. # 数据库,默认为0
  10. spring.redis.database=0
  11. # 设置连接超时
  12. spring.redis.timeout=18000000
  13. # 连接池的最大连接数,负数表示没有限制
  14. spring.redis.lettuce.pool.max-active=8
  15. # 最大阻塞等待时间,负数表示没有限制
  16. spring.redis.lettuce.pool.max-wait=-1
  17. # 连接池中最大的空闲连接数
  18. spring.redis.lettuce.pool.max-idle=5
  19. # 连接池中最小的空闲连接处
  20. spring.redis.lettuce.pool.min-idle=0
  • 配置类

在Reidis配置类中,设置存储对象时,进行序列化的配置。使用Jackson工具类进行序列化配置

  1. @Configuration
  2. public class RedisConfig {
  3. @Bean
  4. public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
  5. RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
  6. // 序列化方式
  7. StringRedisSerializer redisSerializer = new StringRedisSerializer();
  8. Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
  9. ObjectMapper objectMapper = new ObjectMapper();
  10. objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
  11. objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
  12. jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
  13. redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
  14. redisTemplate.setKeySerializer(redisSerializer);
  15. redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
  16. return redisTemplate;
  17. }
  18. }

1.1 官方RedisTemplate

SpringBoot早已帮我们注册了Redis的操作对象:RestTemplate,直接从IOC取出使用即可

  1. @Service
  2. public class TestService {
  3. @Autowired
  4. private RedisTemplate<String, String> redisTemplate;
  5. public void test1() {
  6. ValueOperations<String, String> ops = redisTemplate.opsForValue();
  7. ops.set("name", "lz");
  8. }
  9. public void test2() {
  10. System.out.println(redisTemplate.opsForValue().get("name"));
  11. }
  12. }

可以通过 RestTemplate获取操作不同数据类型的对象,其方法大概和Redis命令差不多

  1. opsForValue():操作String
  2. opsForHash():操作Hash
  3. opsForList():操作List
  4. opsForSet():操作Set
  5. opsForZSet() :操作Zset
  6. opsForGeo():操作Geo
  7. opsForHyperLogLog():操作HyperLogLog
  8. opsForStream():操作Stream

    1.2 保存一个对象

二 Jedis

Jedis是java中常见的操作客户端,支持redis的各种命令操作

2.1 Jedis常见操作

1)创建对象

  1. public Jedis newJedis() {
  2. String host = "127.0.0.1";
  3. int port = 6379;
  4. // 创建对象
  5. return new Jedis(host, port);
  6. }

2)获取当前库所有的key

  1. @Test
  2. public void test1() {
  3. Jedis jedis = newJedis();
  4. Set<String> keys = jedis.keys("*");
  5. System.out.println(keys);
  6. }

3)常见操作
和命令行一样,方法名也是:set(),get() 等

  1. @Test
  2. public void test2() {
  3. Jedis jedis = newJedis();
  4. // set,get
  5. jedis.set("name", "lz");
  6. jedis.set("age", "19");
  7. System.out.println(jedis.get("name"));
  8. System.out.println(jedis.get("age"));
  9. // hset, hget
  10. jedis.hset("person", "name", "lz");
  11. jedis.hset("person", "age", "19");
  12. System.out.println(jedis.hget("person", "name"));
  13. // list操作
  14. jedis.lpush("list_key_1", "lucy", "tom", "jack");
  15. List<String> list_key_1 = jedis.lrange("list_key_1", 0, -1);
  16. System.out.println(list_key_1);
  17. jedis.del("list_key_1");
  18. // set操作
  19. jedis.sadd("set_key_1", "kk", "ll", "kk");
  20. Set<String> set_key_1 = jedis.smembers("set_key_1");
  21. System.out.println(set_key_1);
  22. jedis.del("set_key_1");
  23. // zset操作
  24. jedis.zadd("zset_key_1", 10d, "shanghai");
  25. jedis.zadd("zset_key_1", 20d, "beijing");
  26. jedis.zadd("zset_key_1", 5d, "guangzhou");
  27. Set<String> zset_key_1 = jedis.zrange("zset_key_1", 0, -1);
  28. System.out.println(zset_key_1);
  29. }

2.2 工具类封装