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: 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");

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值