> 文章列表 > Redis 快速上手 Java 增删改查(包含 RedisTemplateConfig 的编写)

Redis 快速上手 Java 增删改查(包含 RedisTemplateConfig 的编写)

Redis 快速上手 Java 增删改查(包含 RedisTemplateConfig 的编写)

一: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: 6379host: 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 {@Resourceprivate RedisTemplate redisTemplate;@Testvoid 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 {@Resourceprivate RedisTemplate redisTemplate;@Resourceprivate StringRedisTemplate stringRedisTemplate;@Testvoid 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 {@Beanpublic 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 {@Resourceprivate RedisTemplate redisTemplate;@Testvoid 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");