文章目录
- 一、Redis的Java客户端
- 二、Jedis快速入门
- 三、Jedis连接池
- 四、SpringDataRedis快速入门
- 五、SpringDataRedis优化
一、Redis的Java客户端
在Redis官网中提供了各种语言的客户端,地址:https://redis.io/clients
而关于java的功能模块分为以下几种
 
 本篇文章主学Jedis与SpringDataRedis
二、Jedis快速入门
Jedis的官网地址: https://github.com/redis/jedis,我们先来个快速入门:
 1,引入依赖:
<dependency>
	<groupId>redis.clients</groupId>
	<artifactId>jedis</artifactId>
	<version>3.7.0</version>
</dependency>
2,建立连接
private Jedis jedis;
@BeforeEach
void setUp() {
    // 建立连接
       jedis = new Jedis("192.168.150.101", 6379);
    // 设置密码
    jedis.auth("123321");
    // 选择库
    jedis.select(0);
 }
3,测试string
@Test
void testString() {
	// 插入数据,方法名称就是redis命令名称,非常简单
	String result = jedis.set("name", "张三");
	System.out.println("result = " + result); 
	// 获取数据
	String name = jedis.get("name");
	System.out.println("name = " + name);
}
4,释放资源
@AfterEach
void tearDown() {
    // 释放资源
    if (jedis != null) {
    	jedis.close();
       }
}
三、Jedis连接池
Jedis本身是线程不安全的,并且频繁的创建和销毁连接会有性能损耗,因此我们推荐大家使用Jedis连接池代替Jedis的直连方式
public class JedisConnectionFactory {
    private static final JedisPool jedisPool;
    static {
        JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
        // 最大连接
        jedisPoolConfig.setMaxTotal(8);
        // 最大空闲连接
        jedisPoolConfig.setMaxIdle(8); 
        // 最小空闲连接
        jedisPoolConfig.setMinIdle(0);
        // 设置最长等待时间, ms
        jedisPoolConfig.setMaxWaitMillis(200);
        jedisPool = new JedisPool(jedisPoolConfig, "192.168.150.101", 6379,
                1000, "123321");
    }
    // 获取Jedis对象
    public static Jedis getJedis(){
        return jedisPool.getResource();
    }
}
四、SpringDataRedis快速入门
SpringDataRedis中提供了RedisTemplate工具类,其中封装了各种对Redis的操作。并且将不同数据类型的操作API封装到了不同的类型中:
 
 SpringBoot已经提供了对SpringDataRedis的支持,使用非常简单:
 1,引入依赖
<!--Redis依赖-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!--连接池依赖-->
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-pool2</artifactId>
</dependency>
2,配置文件
spring:
  redis:
    host: 192.168.150.101
    port: 6379
    password: 123321
    lettuce:
      pool:
        max-active: 8 # 最大连接
        max-idle: 8 # 最大空闲连接
        min-idle: 0 # 最小空闲连接
        max-wait: 100 # 连接等待时间
3,注入RedisTemplate
@Autowired
private RedisTemplate redisTemplate
4,编写测试
@SpringBootTest
public class RedisTest {
    @Autowired
    private RedisTemplate redisTemplate;
    @Test
    void testString() { 
        // 插入一条string类型数据
        redisTemplate.opsForValue().set("name", "李四");
        // 读取一条string类型数据
        Object name = redisTemplate.opsForValue().get("name");
        System.out.println("name = " + name);
    }
}
五、SpringDataRedis优化
RedisTemplate可以接收任意Object作为值写入Redis,只不过写入前会把Object序列化为字节形式,默认是采用JDK序列化,得到的结果是这样的:
 
缺点:
 可读性差
 内存占用较大
方案一:
 1,自定义RedisTemplate
 2,修改RedisTemplate的序列化器为GenericJackson2JsonRedisSerializer
 我们可以自定义RedisTemplate的序列化方式,代码如下:
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory)
        throws UnknownHostException {
    // 创建Template
    RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
    // 设置连接工厂
    redisTemplate.setConnectionFactory(redisConnectionFactory);
    // 设置序列化工具
    GenericJackson2JsonRedisSerializer jsonRedisSerializer = 
					new GenericJackson2JsonRedisSerializer();
    // key和 hashKey采用 string序列化
    redisTemplate.setKeySerializer(RedisSerializer.string()); 
    redisTemplate.setHashKeySerializer(RedisSerializer.string());
    // value和 hashValue采用 JSON序列化
    redisTemplate.setValueSerializer(jsonRedisSerializer);
    redisTemplate.setHashValueSerializer(jsonRedisSerializer);
    return redisTemplate;
}
为了在反序列化时知道对象的类型,JSON序列化器会将类的class类型写入json结果中,存入Redis,会带来额外的内存开销。
{
	“@class”:"com.heima.redis.pojo.user"
	"name":"王五"
	""age":21
}
方案二:
 1,使用StringRedisTemplate
 2,写入Redis时,手动把对象序列化为JSON
 3,读取Redis时,手动把读取到的JSON反序列化为对象
Spring默认提供了一个StringRedisTemplate类,它的key和value的序列化方式默认就是String方式。省去了我们自定义RedisTemplate的过程:
@Autowired
private StringRedisTemplate stringRedisTemplate;
// JSON工具
private static final ObjectMapper mapper = new ObjectMapper();
@Test
void testStringTemplate() throws JsonProcessingException {
    // 准备对象
    User user = new User("yemaozi", 18);
    // 手动序列化
    String json = mapper.writeValueAsString(user);
    // 写入一条数据到redis
    stringRedisTemplate.opsForValue().set("user:200", json); 
    // 读取数据
    String val = stringRedisTemplate.opsForValue().get("user:200");
    // 反序列化
    User user1 = mapper.readValue(val, User.class);
    System.out.println("user1 = " + user1);
}













![[Redis][Zset]详细讲解](https://i-blog.csdnimg.cn/direct/0d74c374bb8242b3bf646e9687f79dc3.png)





