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

news2024/10/5 19:18:10

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/449600.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

多源迁移学习网络补充知识用于具有不可见故障的机器智能诊断

**摘要&#xff1a;**当前基于深度迁移学习的故障诊断的大多数成功需要两个假设&#xff1a;1&#xff09;源机器的健康状态集合应当与目标机器的健康状态集合重叠;2&#xff09;目标机器样本的数量跨健康状态平衡。然而&#xff0c;这样的假设在工程场景中是不现实的&#xff…

【闲聊杂谈】HTTPS原理详解

HTTPS和HTTP的区别 HTTP虽然使用极为广泛, 但是却存在不小的安全缺陷, 主要是其数据的明文传送和消息完整性检测的缺乏, 而这两点恰好是网络支付, 网络交易等新兴应用中安全方面最需要关注的。 关于 HTTP的明文数据传输, 攻击者最常用的攻击手法就是网络嗅探, 试图从传输过程…

Redis高可用高性能缓存的应用系列06 - 热Key,大Key,并发竞争解决方案

概述 终于迎来了Redis系列的尾声&#xff0c;本文针对Redis常遇到的热Key&#xff0c;大Key&#xff0c;并发竞争解决方案进行介绍。 热Key 什么是热key?当一个key的访问量明显大于其他key的时候&#xff0c;他就可以被称为热key。 热Key带来的问题 热key占用大量的CPU资…

黑马在线教育数仓实战7

1. hive的相关的优化 1.1 hive的相关的函数(补充说明) if函数: 作用: 用于进行逻辑判断操作语法: if(条件, true返回信息,false返回信息) 注意: if函数支持嵌套使用 nvl函数: 作用: null值替换函数格式: nvl(T value, T default_value) COALESCE函数 作用: 非空查找函数:格式…

Windows安装GPU环境CUDA、深度学习框架Tensorflow和Pytorch

Windows安装GPU环境CUDA、深度学习框架Tensorflow和Pytorch 1、未安装CUDA使用tensorflow报错 import tensorflow as tf2022-03-06 15:14:38.869955: W tensorflow/stream_executor/platform/default/dso_loader.cc:60] Could not load dynamic library cudart64_110.dll; dl…

Django | 一文完美解决admin增加新用户只有用户名密码和确认密码的问题

文章目录 如图所示&#xff0c;下面给出解决方案&#xff1a; 如果您使用 使用 Django 默认的后台管理界面添加用户时&#xff0c;只看到了三个字段&#xff08;通常是 username、password和 repassword&#xff09;&#xff0c;那么可以通过定义 add_fieldsets 属性来增加更多…

【JUC】原子操作类

【JUC】原子操作类 文章目录 【JUC】原子操作类1. 原子操作类1.1 基本类型原子类1.2 数组类型原子类1.3 引用类型原子类1.3.1 AtomicReference1.3.2 AtomicStampedReference1.3.3 AtomicMarkableReference 1.4 对象的属性修改原子类 1. 原子操作类 原子操作类如下所示&#xf…

【Linux】进程间通信 --- 管道 共享内存 消息队列 信号量

等明年国庆去西藏洗涤灵魂&#xff0c;laozi不伺候这无聊的生活了 文章目录 一、进程间通信1.什么是通信&#xff1f;&#xff08;IPC&#xff09;2.为什么要有通信&#xff1f;&#xff08;多进程协同&#xff09;3.如何进行通信&#xff1f; 二、基于文件系统的管道通信1.通信…

acwing17给了一个头节点,从尾到头输出链表的元素,顺便练练容器

方法一 建立一个数组&#xff0c;从头到尾遍历一遍链表&#xff0c;然后将链表的每个元素的值赋给数组 犯了一个错误 新建的vector容器是一个可变长的数组&#xff0c;要想像数组下标那样访问前提是这个下标所指向的元素得存在&#xff0c;这也就跟那个声明一维数组得写出长度来…

rk3568 适配摄像头 (CIF协议)

rk3568 适配摄像头 (CIF协议) 在RK3568处理器中&#xff0c;支持CIF协议的摄像头可以通过CSI接口连接到处理器&#xff0c;实现视频数据的采集和处理。同时&#xff0c;RK3568还支持多种图像处理算法和编解码器&#xff0c;可以对采集到的视频数据进行实时处理和压缩&#xff…

[Golang实战] 带你入手gin框架使用,以项目为例

&#x1f61a;一个不甘平凡的普通人&#xff0c;致力于为Golang社区和算法学习做出贡献&#xff0c;期待您的关注和认可&#xff0c;陪您一起学习打卡&#xff01;&#xff01;&#xff01;&#x1f618;&#x1f618;&#x1f618; &#x1f917;专栏&#xff1a;算法学习 &am…

Dear ImGui结合CMake实现基于GLFW和OpenGL3的入门级hello world代码

Dear ImGui结合CMake实现基于GLFW和OpenGL3的入门级hello world代码 如需转载请标明出处&#xff1a;https://blog.csdn.net/itas109 技术交流&#xff1a;129518033 环境&#xff1a; OS: windows 10 / Ubuntu 22.04 imgui: 1.89.5 glw: 3.3.8前言 Dear ImGui 是一个 用于…

alibaba arthas的新人上手教程

背景 Arthas 是Alibaba开源的Java诊断工具。 github开源地址&#xff1a;GitHub - alibaba/arthas: Alibaba Java Diagnostic Tool Arthas/Alibaba Java诊断利器Arthas 上手教程 1.下载arthas&#xff0c;并测试运行demo curl -O https://arthas.aliyun.com/arthas-boot.j…

高防IP的定义与作用

随着网络技术的发展&#xff0c;网络攻击的频率和威力不断升级&#xff0c;对企业和个人的网络安全造成了巨大风险。于是&#xff0c;高防IP作为一种网络安全防护工具应运而生&#xff0c;成为广大用户保障网络安全的重要手段。接下来让我们一起来详细了解下高防IP的定义和作用…

web实验(1)

&#xff08;1&#xff09; 应用html和css完成如图所示界面效果。内容相对于浏览器居中&#xff0c;图标见附件disc.jpg。 说明&#xff1a; 内容相对于浏览器居中&#xff0c;图标见附件disc.jpg盒子边框1px solid #ccc&#xff0c;内边距20px文本字体颜色#122e67&#xff…

outlook邮箱pc/mac客户端下载 含最新版

新的 Outlook for Windows or mac 为 Outlook 应用带来了最新功能、智能辅助功能和新的新式简化设计。 你可以根据自己的风格定制它&#xff0c;并使用新的 Outlook for Windows/mac 执行更多操作&#xff01; 览版&#xff0c;与我们一起开始旅程&#xff0c;并帮助我们塑造新…

SSM整合完整流程

&#x1f3e0;个人主页&#xff1a;shark-Gao &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是shark-Gao&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f389;目前状况&#xff1a;23届毕业生&#xff0c;目前在某公司实习&#x1f…

Django--DRf---序列化器:序列化器嵌套

模型表&#xff1a; from django.db import models# Create your models here.class StudentModel(models.Model):id models.AutoField(primary_keyTrue)name models.CharField(max_length32,verbose_name姓名)age models.SmallIntegerField(verbose_name年龄)class_mate_f…

人人可用的开源数据可视化分析工具-DataEase

DataEase 介绍 DataEase是一种开源的关系型数据库管理系统&#xff0c;旨在帮助用户创建和管理各种类型的数据。它是一种易于使用的工具&#xff0c;适用于各种规模的企业和组织&#xff0c;从个人使用到大型公司使用。 Github 地址&#xff1a;GitHub - dataease/dataease: …

2023年4月份上新的Transformer模型设计系列论文(附下载链接)

来源&#xff1a;投稿 作者&#xff1a;王老师 编辑&#xff1a;学姐 论文1 论文标题&#xff1a; Slide-Transformer: Hierarchical Vision Transformer with Local Self-Attention** 滑动Transformer&#xff1a;具有局部自注意的分层视觉Transformer 论文链接&#xff1a;h…