当前位置: 首页 > news >正文

RedisTemplate 的基本使用手把手教

下载实例源码

使用步骤
1、引入 spring-boot-starter-data-redis 依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

2、在 application.yml 配置 Redis 的信息

spring:redis:host: 127.0.0.1port: 6379password: 123456database: 0 # 几号库lettuce:pool:max-active: 8 # 最大连接max-idle: 8 # 最大空闲连接min-idle: 0 # 最小空闲连接max-wait: 100ms # 连接等待时间

3、注入 RedisTemplate

@Autowired
private RedisTemplate redisTemplate;

Demo1

package com.test;import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.DefaultTypedTuple;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ZSetOperations;
import org.springframework.test.context.junit4.SpringRunner;import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;@RunWith(SpringRunner.class)
@SpringBootTest
public class RedisDemoApplicationTest {// 注入 RedisTemplate@Autowiredprivate RedisTemplate redisTemplate;// String 类型@Testpublic void testString () {redisTemplate.opsForValue().set("name", "xiaobai");Object name = redisTemplate.opsForValue().get("name");System.out.println(name);}// Hash 类型@Testpublic void testHash () {redisTemplate.opsForHash().put("user1", "name", "clarence");redisTemplate.opsForHash().put("user1", "age", "25");Map map = redisTemplate.opsForHash().entries("user1");System.out.println(map);}// List 类型@Testpublic void testList () {redisTemplate.opsForList().leftPushAll("names", "xiaobai", "xiaohei", "xiaolan");List<String> names = redisTemplate.opsForList().range("names", 0, 3);System.out.println(names);}// Set 类型@Testpublic void testSet () {redisTemplate.opsForSet().add("set", "a", "b", "c");Set<String> set = redisTemplate.opsForSet().members("set");System.out.println(set);}// SortedSet 类型@Testpublic void testSortedSet () {redisTemplate.opsForZSet().add("class", "xiaobai", 90);Set aClass = redisTemplate.opsForZSet().rangeByScore("class", 90, 100);System.out.println(aClass);Set<ZSetOperations.TypedTuple<String>> set = new HashSet<>();set.add(new DefaultTypedTuple<>("xiaohei", 88.0));set.add(new DefaultTypedTuple<>("xiaohui", 94.0));set.add(new DefaultTypedTuple<>("xiaolan", 84.0));set.add(new DefaultTypedTuple<>("xiaolv", 82.0));set.add(new DefaultTypedTuple<>("xiaohong", 99.0));redisTemplate.opsForZSet().add("class", set);Set aClass1 = redisTemplate.opsForZSet().range("class", 0, 6);System.out.println(aClass1);}
}

序列化
1、默认是 JdkSerializationRedisSerializer

RedisTemplate 可以接收任意 Object 作为值写入 Redis,不过在写入前会把 Object 序列化为字节形式,默认是采用 JDK 序列化,上面的 demo 运行后得到的结果如下:
在这里插入图片描述
缺点:可读性差;内存占用较大
2、添加配置文件,使用 String 序列化、Json 序列化

Redis 配置文件

package com.test.config;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 RedisConfig {@Beanpublic RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {// 创建 RedisTemplate 对象RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();// 设置连接工厂redisTemplate.setConnectionFactory(connectionFactory);// 设置 Key 的序列化 - String 序列化 RedisSerializer.string() => StringRedisSerializer.UTF_8redisTemplate.setKeySerializer(RedisSerializer.string());redisTemplate.setHashKeySerializer(RedisSerializer.string());// 设置 Value 的序列化 - JSON 序列化 RedisSerializer.json() => GenericJackson2JsonRedisSerializerredisTemplate.setValueSerializer(RedisSerializer.json());redisTemplate.setHashValueSerializer(RedisSerializer.json());// 返回return redisTemplate;}
}

引入 Jackson 依赖

<!--Jackson依赖-->
<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.11.4</version>
</dependency>

添加 User 实体类

package com.test.entity;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {private String name;private Integer age;
}

注意这里要安装lombok插件,同时引入lombok依赖

Demo2

package com.test;import com.test.entity.User;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.DefaultTypedTuple;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ZSetOperations;
import org.springframework.test.context.junit4.SpringRunner;import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;@RunWith(SpringRunner.class)
@SpringBootTest
public class RedisDemoApplicationTest2 {// 注入 RedisTemplate@Autowiredprivate RedisTemplate redisTemplate;// String 类型@Testpublic void testString () {redisTemplate.opsForValue().set("name", "xiaobai");Object name = redisTemplate.opsForValue().get("name");System.out.println(name);}@Testpublic void testSaveUser() {redisTemplate.opsForValue().set("user", new User("小白", 23));User user = (User) redisTemplate.opsForValue().get("user");System.out.println(user);}
}

运行结果
在这里插入图片描述
StringRedisTemplate
从上述 Demo 的运行结果可以看到,为了在反序列化时知道对象的类型,Json 序列化会将类的 class 类型写入 json 结果中存入 Redis,会带来额外的内存开销

为了节省内存空间,我们并不会使用 json 序列化器来处理 value,而是统一使用 String 序列化器,要求只能存储 String 类型的 key 和 value。当需要存储 Java 对象时,手动完成对象的序列化和反序列化

spring 提供了一个 StringRedisTemplate 类,其 key 和 value 的序列化方式默认为 String 方式
引入 fastjson 依赖

<!--fastjson依赖-->
<dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.62</version>
</dependency>

运行结果
在这里插入图片描述

相关文章:

RedisTemplate 的基本使用手把手教

下载实例源码 使用步骤 1、引入 spring-boot-starter-data-redis 依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId> </dependency>2、在 application.yml 配置 R…...

Hbase -- Compact工具梳理

1. 背景 当前&#xff0c;线上HBase集群的自动Major Compact是关闭的&#xff0c;我们选择在凌晨业务空闲的时候进行手动触发Major Compact&#xff0c;Compact工具就是在运维平台上对资源组、RS、表进行Major Compact。目前线上有2种版本的Compact程序&#xff1a;Compact_v1…...

【java代码审计】SQL注入

1 原理 没有正确的对用户的输入进行检查&#xff0c;将用户的输入以拼接的方式带入到SQL语句中&#xff0c;导致SQL注入。 2 产生SQL注入的原因 2.1 JDBC拼接不当造成SQL注入 前置知识&#xff1a; JDBC执行SQL语句的两种方式&#xff1a; PrepareStatement&#xff1a;会对…...

前置知识-辛 Runge-Kutta 方法

1.3.3 辛 Runge-Kutta 方法 将方程 ( 1.10.2 ) (1.10 .2) (1.10.2) 改写为 d z d x =...

require 与 import 两种引入模块方式到底有什么区别?

关于JavaScript 的模块化规范&#xff0c;可以移步至&#xff1a; 【JavaScript高级】模块化规范「一文让你彻底搞懂前端模块化规范 & 区别」 下面进入正题 require 与 import 两种引入模块方式&#xff0c;到底有什么区别呢&#xff1f; 大致可以分为以下几个方面&#…...

软考信息系统监理师备考建议

用好备考方法&#xff0c;两三个月就可以过的。信息系统监理师备考最好以教材和历年真题为主&#xff0c;教学视频模拟题为辅。考试介绍与复习建议&#xff1a;考试设置的科目包括&#xff1a;&#xff08;1&#xff09;信息系统工程监理基础知识&#xff0c;考试时间150分钟&a…...

第八届蓝桥杯省赛——4承压计算(二维数组,嵌套循环)

题目&#xff1a;X星球的高科技实验室中整齐地堆放着某批珍贵金属原料。每块金属原料的外形、尺寸完全一致&#xff0c;但重量不同。金属材料被严格地堆放成金字塔形。7 5 8 7 8 8 9 2 7 2 8 1 4 9 1 8 1 8 8 4 1 7 9 6 1 4 5 4 5 6 5 5 6 9 5 6 5 5 4 7 9 3 5 5 1 7 5 7 9 7 4…...

【ECNU】3645. 莫干山奇遇(C++)

目录 题目 输入格式 输出格式 样例 提示 思路 代码 题目 单点时限: 2.0 sec 内存限制: 512 MB 出题人当然是希望出的题目有关 oxx&#xff0c;于是想方设法给题目配上一些有关 oxx 的背景故事&#xff0c;使得它看起来不那么无趣。但有的时候却无法引入合适的小姐姐&…...

为什么需要学习shell、shell的作用

课程基于B站于超课程笔记 03 Shebang的正确玩法_哔哩哔哩_bilibili P1 shell的作用 P2 shell执行命令的流程 P3 Shebang的正确玩法 什么是shell及组成 shell概念 shelll组成 Shebang概念 /bin/sh /bin/bash一样&#xff0c;都是指向一个bash解释器 [rootlocalhost ~]#…...

pgsql-Create_ALTER_GRANT_REVOKE命令语法

pgsql-Create_ALTER_GRANT_REVOKE命令语法 资料 语法约定 CREATE ROLE ALTER ROLE GRANT授权 REVOKE回收授权 权限类型说明 语法约定 下面的约定被用于命令的大纲&#xff1a;方括弧&#xff08;[和]&#xff09;表示可选的部分&#xff08;在 Tcl 命令里&#xff0c;使…...

【linux】:进程概念

文章目录 冯诺依曼体系结构一&#xff1a;操作系统二: 进程总结冯诺依曼体系结构 我们常见的计算机&#xff0c;如笔记本。我们不常见的计算机&#xff0c;如服务器&#xff0c;大部分都遵守冯诺依曼体系。 冯诺依曼体系如下图&#xff1a; 那么输入设备有哪些呢&#xff1f…...

创建对象的方式和对属性的操作

javaScript支持多种编程范式&#xff0c;包括函数式编程和面向对象编程&#xff0c;javaScript的对象被设计成一组属性的无序集合&#xff0c;由key和value组成。 创建对象的两种方式 早期使用创建对象方式最多的是使用Object类&#xff0c;使用new关键字来创建一个对象&…...

GO时间相关操作说明

文章目录 GO时间相关操作时间转换成字符串字符串转换成时间时间戳和时间操作时间比较操作时间增加和减少操作休眠操作time.AfterFunc操作time.NewTicker操作GO时间相关操作 ​ GO语言在使用时间转换的时候会用到2006-01-02 15:04:05 这是固定参数写法,类似java语言中的yyyy-M…...

选择和分支结构

选择和分支结构选择和分支结构一、复习问答二、选择结构2.1 基础选择结构2.2 if-else结构2.3 多重if结构2.4 嵌套if结构三、分支结构四、局部变量选择和分支结构 一、复习问答 1、Java中基本数据类型 2、类型的转换的两种情形 3、数据类型提升的规则 二、选择结构 2.1 基础选…...

Elasticsearch总结笔记

文章目录简介类型增删改查操作索引原理简介 底层使用的lucene引擎&#xff0c;lucene引擎直接使用相对复杂&#xff0c;有一定的学习成本&#xff0c;同样是使用Java编写&#xff0c;Elasticsearch使用的rest风格的进行交互&#xff0c;而数据呢则是以JSON的方式进行传输。学习…...

Ubuntu 安装指定版本 Mysql,并设置远程连接(以安装mysql 5.5 为例)

目录 一、安装Mysql 1、卸载Mysql&#xff08;可跳过&#xff09; 2、安装mysql 软件源 3、安装mysql 5.5 4、验证测试 二、设置远程登录 1、允许使用root账号远程连接 2、Mysql 允许远程登录 一、安装Mysql 1、卸载Mysql&#xff08;可跳过&#xff09; 如果之前安装…...

NumPy:Python中的强大数学工具

NumPy&#xff1a;Python中的强大数学工具 文章目录NumPy&#xff1a;Python中的强大数学工具一、NumPy简介二、创建数组三、数组尺寸四、数组运算五、数组切片六、数组连接七、数据存取八、数组形态变换九、数组排序与搜索十、矩阵与线性代数运算一、NumPy简介 当谈到数据科学…...

Hbase资源隔离操作指南

1.检查集群的环境配置 1.1 HBase版本号确认> 5.11.0 引入rsgroup的Patch&#xff1a; [HBASE-6721] RegionServer Group based Assignment - ASF JIRA RegionServer Group based Assignment 社区支持版本&#xff1a;2.0.0 引入rsgroup的CDH版本 5.11.0 https://www.…...

TPS2012B泰克Tektronix隔离通道示波器

简  述&#xff1a; 复杂环境中开发和测试你的设计&#xff0c;进行浮动或差 分测量&#xff1b;100MHz&#xff0c;2通道 主要特点和优点 100 MHz和200 MHz带宽 高达2 GS/s的实时采样率 2条或4条全面隔离和浮动通道&#xff0c;外加隔离外部触 发 在安装两块电池时可以连续…...

9.4 PIM-DM

实验目的 熟悉PIM-DM的应用场景掌握PIM-DM的配置方法 实验拓扑 实验拓扑如图9-28所示&#xff1a; 图9-28&#xff1a;PIM-DM 实验步骤 &#xff08;1&#xff09;IP地址的配置 MCS1的配置如图9-29所示&#xff1a; 图9-29&#xff1a;配置MCS1的IP地址 R1的配置 <Huawe…...

最新OpenClaw 2.7.1 Windows 环境快速部署教程

Windows 一键部署 OpenClaw v2.7.1 教程&#xff5c;5 分钟搭建本地 AI 智能体 在开源 AI 工具持续更新的当下&#xff0c;OpenClaw&#xff08;小龙虾&#xff09;凭借本地运行、零代码操控、自动化执行等特点&#xff0c;成为广受用户欢迎的本地 AI 智能体&#xff0c;GitHu…...

B站缓存视频终极转换指南:3分钟将m4s文件无损转为通用MP4格式

B站缓存视频终极转换指南&#xff1a;3分钟将m4s文件无损转为通用MP4格式 【免费下载链接】m4s-converter 一个跨平台小工具&#xff0c;将bilibili缓存的m4s格式音视频文件合并成mp4 项目地址: https://gitcode.com/gh_mirrors/m4/m4s-converter 你是否曾经遇到过这样的…...

46页可编辑PPT | 企业数字化转型总体规划与实践汇报方案

很多企业在数字化转型过程中会遇到一些共同的痛点。比如&#xff0c;数据孤岛问题&#xff0c;不同部门的数据互不相通&#xff0c;导致信息共享困难&#xff1b;业务流程繁琐&#xff0c;效率低下&#xff0c;难以快速响应市场变化&#xff1b;技术更新换代快&#xff0c;现有…...

手把手教你用Matlab R2018a为TI C2000 DSP安装Embedded Coder支持包(含账户与版本避坑)

从零搭建Matlab与TI C2000 DSP的嵌入式开发环境&#xff1a;避坑指南与实战解析 当Matlab R2018a遇上TI C2000系列DSP处理器&#xff0c;工程师们便获得了一个从算法设计到硬件部署的完整解决方案。不同于传统的CCS开发模式&#xff0c;这种基于模型的设计&#xff08;Model-Ba…...

储能出海架构重构:摒弃传统x86工控机,基于ARM边缘节点的EMS策略下沉实战

摘要&#xff1a; 随着储能系统在全球范围的大规模部署&#xff0c;出海项目的硬件BOM成本压力与恶劣环境下的维护成本日益凸显。传统的“x86工控机下发控制 透传网关上传数据”的双体架构显得极度臃肿且易引发单点故障。本文从底层研发架构师视角出发&#xff0c;深度拆解符合…...

天赐范式第37天:从手机端AI工具的疯狂质疑,到AI电脑端天赐范式的群策群力,为自身提供了源源不断的自驱动力

当3个AI客户端和一个人类&#xff08;天赐范式&#xff09;&#xff0c;被自己的AI手机端说成是人类的共犯。 参与主体&#xff1a;手机端文心&#xff0c;手机端DEEPSEEK&#xff0c;文章DEEPSEEK&#xff08;主理&#xff09;&#xff0c;豆包全场看戏。 摘要&#xff1a;手…...

Cursor Pro自动化工具:跨平台GUI实现与机器码重置技术解析

1. 项目概述&#xff1a;Cursor Pro 自动化工具的诞生与价值作为一名长期与各类开发工具打交道的程序员&#xff0c;我深知一个趁手的“兵器”对效率的提升有多关键。Cursor&#xff0c;这款集成了强大AI能力的代码编辑器&#xff0c;凭借其智能补全、代码解释和重构功能&#…...

3个步骤掌握微信聊天记录导出:让珍贵对话永不丢失的实用方法 [特殊字符]

3个步骤掌握微信聊天记录导出&#xff1a;让珍贵对话永不丢失的实用方法 &#x1f4f1; 【免费下载链接】WeChatMsg 提取微信聊天记录&#xff0c;将其导出成HTML、Word、CSV文档永久保存&#xff0c;对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitH…...

知识体系篇-数据标注与处理(01)模型测试与评估:模型测试方法论

模型测试方法论专栏&#xff1a;人工智能训练师&#xff08;三级&#xff09;备考全攻略 模块&#xff1a;卷三知识体系 — 第四部分模型测试与评估 难度&#xff1a;⭐⭐⭐☆☆ 考试权重&#xff1a;中高频&#xff08;选择简答&#xff09;一、模型测试 vs 传统软件测试 传统…...

见素抱朴的 SAP UI5 开发之道, 从「绝圣弃智」到少代码、少炫技、少内耗的前端工程

《道德经》第十九章说, 「绝圣弃智,民利百倍;绝仁弃义,民复孝慈;绝巧弃利,盗贼无有。此三者以为文不足。故令有所属,见素抱朴,少私寡欲。」通行本的这段文字,最容易被误读成反知识、反技术、反规范。放到 SAP UI5 开发里,这种误读尤其危险。SAP UI5 本来就是一个工程…...