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

news/2024/10/17 16:20:38/

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


http://www.ppmy.cn/news/51165.html

相关文章

shell编程规范与变量

shell脚本编程规范 shell脚本概述 将要执行的命令按顺序保存到一个文本文件给该文件可执行权限可结合各种Shell控制语句以完成更复杂的操作 Shell脚本应用场景 重复性操作交互性任务批量事务处理服务运行状态监控定时任务执行 什么是Shell 就是与内核沟通的界面、应用程序等…

logback日志框架集成方式

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、logback是什么&#xff1f;二、使用步骤1.使用方式控制台输出配置文件输出配置html输出配置定期删除配置方式 总结 前言 提示&#xff1a;这里可以添加本文…

【C++】右值引用(极详细版)

在讲右值引用之前&#xff0c;我们要了解什么是右值&#xff1f;那提到右值&#xff0c;就会想到左值&#xff0c;那左值又是什么呢&#xff1f; 我们接下来一起学习&#xff01; 目录 1.左值引用和右值引用 1.左值和右值的概念 2.左值引用和右值引用的概念 2.左值引用和右…

达梦数据迁移问题罗列

目录 一、前言 二、问题罗列 一、前言 最近小编接触到国产的数据库达梦数据库&#xff0c;然后在用达梦数据迁移工具MySQL迁移至达梦的时候遇到了一系列的问题现在罗列一下在这里。目前关于国产的数据库达梦这些资料比较少&#xff0c;希望能够帮到有需要的同志们&#xff01…

Java面试题面向对象部分

面向对象 面向对象概述 面向对象和面向过程的区别 面向过程&#xff1a; 优点&#xff1a;性能比面向对象高&#xff0c;因为类调用时需要实例化&#xff0c;开销比较大&#xff0c;比较消耗资源;比如单片机、嵌入式 开发、Linux/Unix等一般采用面向过程开发&#xf…

Hibernate的持久化类

Hibernate是一个开源的ORM&#xff08;对象关系映射&#xff09;框架&#xff0c;用于将Java程序中的对象映射到数据库中的关系型数据。在Hibernate中&#xff0c;持久化类是用来映射Java对象和关系型数据库表的类。 编写Hibernate持久化类需要遵循以下规则&#xff1a; 持久…

MATLAB离散时间信号的实现和时域基本运算(九)

1、实验目的&#xff1a; 1&#xff09;了解时域离散信号的特点&#xff1b; 2&#xff09;掌握MATLAB在时域内产生常用离散时间信号的方法&#xff1b; 3&#xff09;熟悉离散时间信号的时域基本运算&#xff1b; 4&#xff09;掌握离散时间信号的绘图命令。 2、实验内容&…

学系统集成项目管理工程师(中项)系列03_职业道德规范

1. 职业道德 1.1. 涵盖了从业人员与服务对象、职业与职工、职业与职业之间的关系 1.2. 是所有从业人员在职业活动中应该遵循的行为准则 1.3. 包括爱岗敬业、诚实守信、办事公道、服务群众和奉献社会 2. 道德 2.1. 通常与法律相对应&#xff0c;具有非强制性 2.2. 指人们依…