一:Redis 数据类型
先了解 redis 的五种基本数据类型。
String 字符串类型:name: "value1"
List 列表:names: ["value1", "value2", "value2"]
Set 集合:names: ["value1", "value2", "value3"] (键不能重复)
Hash 哈希:nameAge: {"value1": 20, "value2": 21} (值里面的键不能重复。value1、value2...)
Zset 集合:names: {value1 - 1, value - 2} (每个值都对应一个数字,适合做排行榜)
二:引入 redis 依赖并编写依赖
(这个加入的是 starter,把版本改为你自己使用的 SpringBoot 版本)
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<version>2.6.4</version>
</dependency>
spring:
redis:
port: 6379
host: localhost // 如果是 redis 在虚拟机,则写虚拟机的 ip 地址
database: 1
三:测试使用 RedisTemplate
先写一个 User 类,用于做测试
@Data
public class User {
/**
* id
*/
private long id;
/**
* 用户昵称
*/
private String username;
}
import com.model.domain.User;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import javax.annotation.Resource;
@SpringBootTest
public class RedisTest {
@Resource
private RedisTemplate redisTemplate;
@Test
void test() {
// 创建操作对象
ValueOperations valueOperations = redisTemplate.opsForValue();
// 增
valueOperations.set("key1_String", "value1");
valueOperations.set("key2_Int", 1);
valueOperations.set("key3_Double", 2.0);
User user = new User();
user.setId(1L);
user.setUsername("test_User");
valueOperations.set("key4_User", user);
// 查
Object key1_string = valueOperations.get("key1_String");
Assertions.assertTrue("value1".equals((String)key1_string));
Object key2_int = valueOperations.get("key2_Int");
Assertions.assertTrue(1 == (Integer) key2_int);
Object key3_double = valueOperations.get("key3_Double");
Assertions.assertTrue(2.0 == (Double) key3_double);
valueOperations.get("key4_User");
System.out.println(valueOperations.get("key4_User"));
}
}
运行成功后,查看 redis 数据库:
但是这时候 redis 中存储的 key-value 是乱码的,这跟 redis 的默认序列化器有关。而在 redis 中 redis 使用的序列化器是一个 jdk 原生的序列化器。(具体源码参考 RedisTemplate)
测试结果:使用 RedisTemplate 会导致存储的对象出现序列化后的乱码问题。那么我们可以使用 StringRedisTemplate。
四:测试 StringRedisTemplate
在 StringRedisTemplate 中指定了使用 string 的序列化器
这里要注意:在 StringRedisTemplate 中集成的是: RedisTemplate<String, String> 说明 key 和 value 都是存储的 string 类型。
在测试类测试:
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import javax.annotation.Resource;
@SpringBootTest
public class RedisTest {
@Resource
private RedisTemplate redisTemplate;
@Resource
private StringRedisTemplate stringRedisTemplate;
@Test
void test() {
// 创建操作对象
ValueOperations valueOperations = stringRedisTemplate.opsForValue();
// 增
valueOperations.set("key1_String", "value1");
// valueOperations.set("key2_Int", 1);
// valueOperations.set("key3_Double", 2.0);
// User user = new User();
// user.setId(1L);
// user.setUsername("test_User");
// valueOperations.set("key4_User", user);
// 查
Object key1_string = valueOperations.get("key1_String");
Assertions.assertTrue("value1".equals((String)key1_string));
// Object key2_int = valueOperations.get("key2_Int");
// Assertions.assertTrue(1 == (Integer) key2_int);
// Object key3_double = valueOperations.get("key3_Double");
// Assertions.assertTrue(2.0 == (Double) key3_double);
// valueOperations.get("key4_User");
// System.out.println(valueOperations.get("key4_User"));
}
}
这时候查询 redis 中的 key 和 value 就都是 string 类型的了
但是这时候使用 StringRedisTemplate 有局限性:键和值都只能是 string 类型。
五:使用自定义 RedisTemplate
这里配置 key - String,value - Object 的 RedisTemplate
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.RedisSerializer;
@Configuration
public class RedisTemplateConfig {
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(connectionFactory);
redisTemplate.setKeySerializer(RedisSerializer.string());
return redisTemplate;
}
}
配置完成之后,在测试类中继续使用 redisTemplate 对 redis 进行操作即可:
import com.yupi.domain.User;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import javax.annotation.Resource;
@SpringBootTest
public class RedisTest {
@Resource
private RedisTemplate redisTemplate;
@Test
void test() {
// 创建操作对象
ValueOperations valueOperations = redisTemplate.opsForValue();
// 增
valueOperations.set("key1_String", "value1");
valueOperations.set("key2_Int", 1);
valueOperations.set("key3_Double", 2.0);
User user = new User();
user.setId(1L);
user.setUsername("test_User");
valueOperations.set("key4_User", user);
// 查
Object key1_string = valueOperations.get("key1_String");
Assertions.assertTrue("value1".equals((String)key1_string));
Object key2_int = valueOperations.get("key2_Int");
Assertions.assertTrue(1 == (Integer) key2_int);
Object key3_double = valueOperations.get("key3_Double");
Assertions.assertTrue(2.0 == (Double) key3_double);
valueOperations.get("key4_User");
System.out.println(valueOperations.get("key4_User"));
}
}
测试完成之后,查看 redis 中的键值对,发现序列化完成,只不过在 value 中存储的是一个对象(UTF-8 编码之后的值)。
六:Redis 的 改、删、查
在 redis 中改的话,直接再 set 一边就是改了。
Java :
// 改
valueOperations.set("key1_String", "testUpdate");
// 删
redisTemplate.delete("key1_String");