RedisTemplate和Jedis的区别以及Spring Data Redis的使用

Spring Data是用于简化数据库访问的开源框架,包括:jdbc,jpa,elasticsearch,redis.......

Spring Data Redis是Spring Data旗下的一个子模块,用于简化redis操作。

其中提供了一个封装好的操作模板RedisTemplate,这里说一下RedisTemplate和Jedis的区别:

1.SpringBoot2.x后RedisTemplate默认底层lettuce,大并发下lettuce(底层为netty,是非阻塞性的nio)效率更高,而Jedis底层是阻塞性的IO,效率相对低

2.RedisTemplate可以设置通用序列化器,而Jedis不行

Spring Data Redis的启动器为:spring-boot-starter-data-redis

在application.yml配置文件中配置(集群模式):

spring:
  redis:
    cluster:
      nodes:
        - 192.168.116.134:7001
        - 192.168.116.134:7002
        - 192.168.116.134:7003
        - 192.168.116.134:7004
        - 192.168.116.134:7005
        - 192.168.116.134:7006
     jedis:
        pool:
           max-active: 20 #连接池最大连接数
           max-idle: 10 #连接池中的最大空闲连接
           min-idle: 5 # 连接池中的最小空闲连接

非集群模式:

spring:
  redis:
    host: 192.168.116.134
    port: 6379
     jedis:
        pool:
           max-active: 20 #连接池最大连接数
           max-idle: 10 #连接池中的最大空闲连接
           min-idle: 5 # 连接池中的最小空闲连接

创建配置类,配置通用序列化器

@Configuration
public class RedisConfig{
        @Bean
        public RedisTemplate redisTemplate(RedisConnectionFactory factory){
                RedisTemplate redisTemplate = new RedisTemplate<>();
                //设置通用序列化器
                redisTemplate.setKeySerializer(new StringRedisSerializer());
                redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
                redisTemplate.setHashKeySerializer(new StringRedisSerializer());
                redisTemplate.setHashValueSerializer(new                      
                GenericJackson2JsonRedisSerializer());

                redisTemplate.setConnectionFactory(factory);
                return redisTemplate;
        }
}        
      

创建启动类:


@SpringBootApplication
public class App {
	public static void main(String[] args) {
		SpringApplication.run(App.class, args);
	}
}

创建实体类:

public class User implements Serializable {
	
	private Integer id;
	private String name;
	private Integer age;
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Integer getAge() {
		return age;
	}
	public void setAge(Integer age) {
		this.age = age;
	}
	@Override
	public String toString() {
		return "User [id=" + id + ", name=" + name + ", age=" + age + "]";
	}
}

测试类:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = {RedisApp.class})
public class RedisTest {

    //默认key-value的序列化器是JdkSerializationRedisSerializer
    @Autowired
    private RedisTemplate redisTemplate;

    /**
     * 1、StringRedisSerializer:key或value是字符串时使用
     */
    @Test
    public void testSetStr(){
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setValueSerializer(new StringRedisSerializer());
        redisTemplate.opsForValue().set("str", "张三丰");
    }

    @Test
    public void testGetStr(){
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setValueSerializer(new StringRedisSerializer());
        String str = (String) redisTemplate.opsForValue().get("str");
        System.out.println(str);
    }

    /**
     * 2、JdkSerializationRedisSerializer:pojo<----->字节序列,大小243,乱码
     */
    @Test
    public void testSetPojo(){
        User user = new User();
        user.setId(1);
        user.setName("张三丰");
        user.setAge(140);

        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setValueSerializer(new JdkSerializationRedisSerializer());
        redisTemplate.opsForValue().set("user", user);
    }

    @Test
    public void testGetPojo(){
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setValueSerializer(new JdkSerializationRedisSerializer());
        User user = (User) redisTemplate.opsForValue().get("user");
        System.out.println(user);
    }

    /**
     * GenericJackson2JsonRedisSerializer:pojo<------>json,大小74,不乱码
     */
    @Test
    public void testSetPojo2(){
        User user = new User();
        user.setId(1);
        user.setName("张三丰");
        user.setAge(140);

        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
        redisTemplate.opsForValue().set("user2", user);
    }

    @Test
    public void testGetPojo2(){
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
        User user2 = (User) redisTemplate.opsForValue().get("user2");
        System.out.println(user2);
    }

    /**
     * GenericJackson2JsonRedisSerializer处理String
     */
    @Test
    public void testSetStr2(){
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
        redisTemplate.opsForValue().set("str2", "张三丰");
    }

    @Test
    public void testGetStr2(){
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
        String str2 = (String) redisTemplate.opsForValue().get("str2");
        System.out.println(str2);
    }

    /**
     * 使用通用的序列化器
     */
    @Test
    public void testSetPojo3(){
        User user = new User();
        user.setId(1);
        user.setName("张三丰");
        user.setAge(140);

        redisTemplate.opsForValue().set("user3", user);
    }

    @Test
    public void testGetPojo3(){
        User user3 = (User) redisTemplate.opsForValue().get("user3");
        System.out.println(user3);
    }
}

你可能感兴趣的:(spring,redis,java)