跳至主要內容

Java 整合

程序员李某某大约 3 分钟

Java 整合

Jedis

GitHub - redis/jedis: Redis Java client designed for performance and ease of use.open in new window

依赖

<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>4.2.0</version>
</dependency>

测试类中测试

public class JedisTest {

	private Jedis jedis;
  
  //创建连接
	@BeforeEach
	void setUp() {
		jedis = new Jedis("192.168.10.108", 6379);
		jedis.auth("1234");
	}

	@Test
	void testString() {
		jedis.set("name","李一玓");
		System.out.println(jedis.get("name"));
	}
	@Test
	public void testHash(){
		jedis.hset("user:1","name","liyuanhao");
		System.out.println(jedis.hget("user:1","name"));
	}
	//关闭资源
	@AfterEach
	void tearDown() {
		if (jedis != null) {
			jedis.close();
		}
	}
}

jedis的连接池

public class JedisConnectionFactory {
	public static final JedisPool jedisPool;
	static {
		JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
		jedisPoolConfig.setMaxTotal(8);
		jedisPoolConfig.setMaxIdle(8);
		jedisPoolConfig.setMinIdle(0);

		jedisPool = new JedisPool(jedisPoolConfig,"192.168.10.108",6379,1000,"1234");
	}
	public static Jedis getJedis(){
		return jedisPool.getResource();
	}
}
public class JedisTest {

	private Jedis jedis;

	@BeforeEach
	void setUp() {
		//jedis = new Jedis("192.168.10.108", 6379);
		//this.jedis.auth("1234");
		jedis = JedisConnectionFactory.getJedis();

	}
	@Test
	public void testList(){
		jedis.lpush("helloList","hao are you");
		System.out.println(jedis.lrange("helloList",0,2));
	}

	@AfterEach
	void tearDown() {
		if (jedis != null) {
			jedis.close();
		}
	}
}

SpringDataRedis

SpringData是Spring中数据操作的模块,包含对各种数据库的集成,其中对Redis的集成模块就叫做SpringDataRedis,官网地址:<https://spring.io/projects/spring-data-redis>

  • 提供了对不同Redis客户端的整合(Lettuce和Jedis)
  • 提供了RedisTemplate统一API来操作Redis
  • 支持Redis的发布订阅模型
  • 支持Redis哨兵和Redis集群
  • 支持基于Lettuce的响应式编程
  • 支持基于JDK.JSON.字符串.Spring对象的数据序列化及反序列化
  • 支持基于Redis的JDKCollection实现

SpringDataRedis中提供了RedisTemplate工具类,其中封装了各种对Redis的操作。并且将不同数据类型的操作API封装到了不同的类型中:

image-20220721204103020
image-20220721204103020

SpringBoot整合

依赖

<!--redis依赖-->
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!--Jackson依赖-->
<dependency>
  <groupId>com.fasterxml.jackson.core</groupId>
  <artifactId>jackson-databind</artifactId>
</dependency>
<!--lombok-->
<dependency>
  <groupId>org.projectlombok</groupId>
  <artifactId>lombok</artifactId>
  <optional>true</optional>
</dependency>
<!--test-->
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-test</artifactId>
  <scope>test</scope>
</dependency>

application.yml

spring:
  redis:
    host: 192.168.10.108
    port: 6379
    password: 1234
    lettuce:  #默认是lettuce的连接池
      pool:
        max-active: 8  #最大连接
        max-idle: 8   #最大空闲连接
        min-idle: 0   #最小空闲连接
        max-wait: 100ms #连接等待时间

序列号

  • jdk序列化,可读性差,内存占用大,key可能对应不上

    @SpringBootTest
    public class RedisTest {
    
    	@Autowired
    	private RedisTemplate redisTemplate;
    	@Test
    	public void test() {
    		redisTemplate.opsForValue().set("name","111111");
    		Object name = redisTemplate.opsForValue().get("name");
    		System.out.println(name);
    	}
    }
    
  • 自定义序列化--json:占内存

    {
      //通过@class反序列化
      "@class": "com.botuer.springdataredistest.pojo.User",
      "name": "李某某",
      "age": 12
    }
    
    //创建配置类
    @Configuration
    public class RedisConfig {
    
        @Bean
        public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory){
            // 创建RedisTemplate对象
            RedisTemplate<String, Object> template = new RedisTemplate<>();
            // 设置连接工厂
            template.setConnectionFactory(connectionFactory);
            // 创建JSON序列化工具
            GenericJackson2JsonRedisSerializer jsonRedisSerializer = 
                							new GenericJackson2JsonRedisSerializer();
            // 设置Key的序列化
            template.setKeySerializer(RedisSerializer.string());
            template.setHashKeySerializer(RedisSerializer.string());
            // 设置Value的序列化
            template.setValueSerializer(jsonRedisSerializer);
            template.setHashValueSerializer(jsonRedisSerializer);
            // 返回
            return template;
        }
    }
    
    @SpringBootTest
    public class RedisTest {
    
    	@Autowired
    	private RedisTemplate<String, Object> redisTemplate;
    	@Test
    	public void test() {
    
    		User user = new User("李某某", 12);
    		redisTemplate.opsForValue().set("user",user);
    		Object user1 = redisTemplate.opsForValue().get("user");
    		System.out.println(user1);
    	}
    }
    
  • StringRedisTemplate + 手动序列化

    • jackson是SpringBoot自带的json序列化工具,ObjectMapper类
      • writeValueAsString(实体对象)
      • readValue(jsonStr,实体类)
    • fastjson需要导入依赖(alibaba的fastjson)
      • JSON.toJSONString(实体对象);
      • JSON.parseObject(jsonStr, 实体类);
    @SpringBootTest
    class RedisStringTests {
    
        @Autowired
        private StringRedisTemplate stringRedisTemplate;
        private static final ObjectMapper mapper = new ObjectMapper();
    
        @Test
        void testSaveUser() throws JsonProcessingException {
            // 创建对象
            User user = new User("虎哥", 21);
            // 手动序列化
            String json = mapper.writeValueAsString(user);
            // 写入数据
            stringRedisTemplate.opsForValue().set("user:200", json);
            // 获取数据
            String jsonUser = stringRedisTemplate.opsForValue().get("user:200");
            // 手动反序列化
            User user1 = mapper.readValue(jsonUser, User.class);
            System.out.println("user1 = " + user1);
        }
    
    }
    
上次编辑于:
贡献者: 李元昊