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

SSM 如何使用 Redis 实现缓存?

SSM 如何使用 Redis 实现缓存?

Redis 是一个高性能的非关系型数据库,它支持多种数据结构和多种操作,可以用于缓存、队列、计数器等场景。在 SSM(Spring + Spring MVC + MyBatis)开发中,Redis 可以用来实现数据缓存,提高系统的性能和可靠性。

本文将介绍如何使用 SSM 框架和 Redis 实现数据缓存,包括 Redis 的常用数据结构、Redis 的 Java 客户端 Jedis 的使用方法,以及如何在 SSM 中使用 Redis。

在这里插入图片描述

Redis 的常用数据结构

Redis 支持多种数据结构,包括字符串、哈希、列表、集合和有序集合等。下面简单介绍一下这些数据结构的特点和用途。

1. 字符串

字符串是 Redis 最基本的数据结构,它可以存储任意类型的数据,包括文本、二进制数据和数字等。字符串的最大长度为 512 MB。

字符串常用的操作包括设置值、获取值、追加值、自增自减等。例如,可以使用以下命令设置一个字符串值:

SET key value

其中,key 是字符串类型的键,value 是字符串类型的值。可以使用以下命令获取字符串值:

GET key

2. 哈希

哈希是一种键值对集合,它将多个键值对存储在一个键下。哈希常用于存储对象的属性,例如用户信息、商品信息等。

哈希常用的操作包括设置值、获取值、删除值等。例如,可以使用以下命令设置一个哈希值:

HSET key field value

其中,key 是字符串类型的键,field 是字符串类型的域,value 是字符串类型的值。可以使用以下命令获取哈希值:

HGET key field

3. 列表

列表是一种有序集合,它可以存储多个字符串类型的值。列表常用于存储队列、消息等。

列表常用的操作包括添加值、获取值、弹出值等。例如,可以使用以下命令添加一个列表值:

LPUSH key value

其中,key 是字符串类型的键,value 是字符串类型的值。可以使用以下命令获取列表值:

LRANGE key start stop

其中,startstop 分别是列表的起始位置和结束位置。

4. 集合

集合是一种无序集合,它可以存储多个字符串类型的值,且每个值都是唯一的。集合常用于存储标签、好友列表等。

集合常用的操作包括添加值、获取值、删除值等。例如,可以使用以下命令添加一个集合值:

SADD key member

其中,key 是字符串类型的键,member 是字符串类型的值。可以使用以下命令获取集合值:

SMEMBERS key

5. 有序集合

有序集合是一种有序集合,它可以存储多个字符串类型的值,每个值都有一个分数和一个排名。有序集合常用于存储排行榜、计数器等。

有序集合常用的操作包括添加值、获取值、删除值等。例如,可以使用以下命令添加一个有序集合值:

ZADD key score member

其中,key 是字符串类型的键,score 是有序集合值的分数,member 是字符串类型的值。可以使用以下命令获取有序集合值:

ZRANGE key start stop

其中,startstop 分别是有序集合的起始位置和结束位置。

Redis 的 Java 客户端 Jedis 的使用方法

Jedis 是一个 Redis 的 Java 客户端,它提供了丰富的 API,可以方便地操作 Redis 数据库。下面介绍一下 Jedis 的使用方法。

1. 引入依赖

首先需要在项目中引入 Jedis 的依赖:

<dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>3.7.0</version>
</dependency>

2. 创建连接池和连接

使用 Jedis 操作 Redis 数据库需要先创建连接池和连接。可以使用以下代码创建连接池和连接:

JedisPool jedisPool = new JedisPool("localhost", 6379);
Jedis jedis = jedisPool.getResource();

其中,localhost6379 分别是 Redis 数据库的地址和端口号。创建连接池和连接后,就可以使用 Jedis 操作 Redis 数据库了。

3. 操作 Redis 数据库

下面介绍一些常用的 Jedis 操作 Redis 数据库的方法。

3.1 字符串操作

  • 设置字符串值:
jedis.set("key", "value");
  • 获取字符串值:
String value = jedis.get("key");
  • 追加字符串值:
jedis.append("key", "value");
  • 自增自减:
jedis.incr("key");
jedis.decr("key");

3.2 哈希操作

  • 设置哈希值:
jedis.hset("key", "field", "value");
  • 获取哈希值:
String value = jedis.hget("key", "field");
  • 删除哈希值:
jedis.hdel("key", "field");

3.3 列表操作

  • 添加列表值:
jedis.lpush("key", "value");
  • 获取列表值:
List<String> values = jedis.lrange("key", 0,-1);
  • 弹出列表值:
String value = jedis.lpop("key");

3.4 集合操作

  • 添加集合值:
jedis.sadd("key", "value");
  • 获取集合值:
Set<String> values = jedis.smembers("key");
  • 删除集合值:
jedis.srem("key", "value");

3.5 有序集合操作

  • 添加有序集合值:
jedis.zadd("key", score, "member");
  • 获取有序集合值:
Set<String> values = jedis.zrange("key", start, stop);
  • 删除有序集合值:
jedis.zrem("key", "member");

4. 关闭连接

使用完 Jedis 后需要关闭连接:

jedis.close();
jedisPool.close();

在 SSM 中使用 Redis

下面介绍如何在 SSM 中使用 Redis 实现数据缓存。

1. 引入依赖

首先需要在项目中引入 Jedis 的依赖:

<dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>3.7.0</version>
</dependency>

2. 配置 Redis 连接池

在 Spring 的配置文件中配置 Redis 连接池:

<bean id="jedisPool" class="redis.clients.jedis.JedisPool"><constructor-arg name="host" value="localhost" /><constructor-arg name="port" value="6379" />
</bean>

3. 封装 Redis 操作

为了方便在 SSM 中使用 Redis,可以封装一些常用的 Redis 操作。例如,可以创建一个 RedisService 类,封装字符串、哈希、列表、集合和有序集合等操作。

@Service
public class RedisService {@Autowiredprivate JedisPool jedisPool;public void set(String key, String value) {try (Jedis jedis = jedisPool.getResource()) {jedis.set(key, value);}}public String get(String key) {try (Jedis jedis = jedisPool.getResource()) {return jedis.get(key);}}public void hset(String key, String field, String value) {try (Jedis jedis = jedisPool.getResource()) {jedis.hset(key, field, value);}}public String hget(String key, String field) {try (Jedis jedis = jedisPool.getResource()) {return jedis.hget(key, field);}}public void lpush(String key, String value) {try (Jedis jedis = jedisPool.getResource()) {jedis.lpush(key, value);}}public List<String> lrange(String key, int start, int stop) {try (Jedis jedis = jedisPool.getResource()) {return jedis.lrange(key, start, stop);}}public void sadd(String key, String value) {try (Jedis jedis = jedisPool.getResource()) {jedis.sadd(key, value);}}public Set<String> smembers(String key) {try (Jedis jedis = jedisPool.getResource()) {return jedis.smembers(key);}}public void zadd(String key, double score, String member) {try (Jedis jedis = jedisPool.getResource()) {jedis.zadd(key, score, member);}}public Set<String> zrange(String key, int start, int stop) {try (Jedis jedis = jedisPool.getResource()) {return jedis.zrange(key, start, stop);}}public void delete(String key) {try (Jedis jedis = jedisPool.getResource()) {jedis.del(key);}}}

4. 在 Service 中使用 Redis

在 Service 中可以注入 RedisService,使用 Redis 缓存数据。例如,可以在 UserService 中使用 Redis 缓存用户信息:

@Service
public class UserService {@Autowiredprivate UserDao userDao;@Autowiredprivate RedisService redisService;public User getUserById(int id) {String key = "user:" + id;String value = redisService.get(key);if (value != null) {return JSON.parseObject(value, User.class);}User user = userDao.getUserById(id);if (user != null) {redisService.set(key, JSON.toJSONString(user));}return user;}
}

在 getUserById 方法中,首先从 Redis 中获取用户信息。如果缓存中存在,就直接返回缓存中的用户信息;否则,从数据库中获取用户信息,并将用户信息保存到 Redis 中。这样就可以实现用户信息的缓存,提高系统的性能和可靠性。

总结

本文介绍了如何使用 SSM框架和 Redis 实现数据缓存。首先介绍了 Redis 的常用数据结构,包括字符串、哈希、列表、集合和有序集合等;然后介绍了 Redis 的 Java 客户端 Jedis 的使用方法,包括连接池和连接的创建、字符串、哈希、列表、集合和有序集合等操作;最后介绍了在 SSM 中使用 Redis 实现数据缓存的方法,包括依赖的引入、Redis 连接池的配置、Redis 操作的封装和在 Service 中使用 Redis 缓存数据。

使用 Redis 缓存数据可以提高系统的性能和可靠性,减少数据库的压力。但是需要注意的是,缓存数据的有效期和缓存数据的更新问题。在实际开发中需要根据具体的业务场景来确定缓存数据的有效期和更新策略。

相关文章:

SSM 如何使用 Redis 实现缓存?

SSM 如何使用 Redis 实现缓存&#xff1f; Redis 是一个高性能的非关系型数据库&#xff0c;它支持多种数据结构和多种操作&#xff0c;可以用于缓存、队列、计数器等场景。在 SSM&#xff08;Spring Spring MVC MyBatis&#xff09;开发中&#xff0c;Redis 可以用来实现数…...

uin-app如何获取微信昵称和头像的博客

在很多应用中都会使用到微信登录功能&#xff0c;这样可以方便用户快速地完成注册、登录等操作。本文将介绍如何通过uin-app获取微信用户的昵称和头像信息。 第一步&#xff1a;准备开发环境 首先&#xff0c;需要下载并安装QQ精简版开发工具&#xff08;uin-app&#xff09;…...

第六十七天学习记录:对陈正冲编著《C 语言深度解剖》中关于变量命名规则的学习

最近开始在阅读陈正冲编著的《C 语言深度解剖》&#xff0c;还没读到十分之一就感觉收获颇多。其中印象比较深刻的是其中的变量的命名规则。 里面提到的不允许使用拼音正是我有时候会犯的错。 因为在以往的工作中&#xff0c;偶尔会遇到时间紧迫的情况。 而对于新增加的变量不知…...

matlab 计算点云的线性指数

目录 一、算法原理二、代码实现三、结果展示一、算法原理 选取当前点 p i ( x , y , z ) p_{i}(x,y,z) p<...

SpringBoot集成ElasticSearch

文章目录 前言一、ElasticSearch本地环境搭建二、SpringBoot整合ElasticSearch1.pom中引入ES依赖2.application.yaml配置elasticsearch3.ElasticSearchClientConnect连接ES客户端工具类4.ElasticSearchResult封装响应结果5.Person实体类6.Person实体类7.ElasticsearchControlle…...

分治入门+例题

目录 &#x1f947;2.3.2 合并排序 &#x1f947;2.3.3 快速排序 &#x1f33c;P1010 [NOIP1998 普及组] 幂次方 &#x1f333;总结 形象点&#xff0c;分治正如“凡治众如治寡&#xff0c;分数是也”&#xff0c;管理少数几个人&#xff0c;即可统领全军 本质&#xff…...

剑指offer打卡

这里写目录标题 day1 二叉树和为某一路径day2复杂链表的复刻day3二叉搜索树与双向链表day4数字排列day5找出出现次数超过一半的次数day6 二进制中1的个数day7 二叉树的最近公共祖先day8 字符串转换为整数day9 构建乘积数组day10不用加减乘除的加法day11求12....nday11 股票的最…...

运维实用脚本整理

运维实用脚本整理 本文脚本仅供参考运维排查问题思路运维排查问题的方法和命令&#xff08;1&#xff09;尽可能搞清楚问题的前因后果&#xff08;2&#xff09;有谁在?&#xff08;3&#xff09;之前发生了什么?&#xff08;4&#xff09; 现在在运行的进程是啥?&#xff0…...

INT8 中的稀疏性:加速的训练工作流程和NVIDIA TensorRT 最佳实践

INT8 中的稀疏性&#xff1a;加速的训练工作流程和NVIDIA TensorRT 最佳实践 文章目录 INT8 中的稀疏性&#xff1a;加速的训练工作流程和NVIDIA TensorRT 最佳实践结构稀疏量化在 TensorRT 中部署稀疏量化模型的工作流程案例研究&#xff1a;ResNet-34要求第 1 步&#xff1a;…...

隧道模式HTTP代理使用代码示例

以下是使用Python实现隧道模式HTTP代理的代码示例&#xff1a; python import socket def handle_client(client_socket): # 接收客户端请求 request client_socket.recv(4096) # 解析请求头&#xff0c;获取目标主机和端口号 host request.split(b\r\n)[1].sp…...

翻筋斗觅食海鸥优化算法-附代码

翻筋斗觅食海鸥优化算法 文章目录 翻筋斗觅食海鸥优化算法1.海鸥优化算法2. 改进海鸥优化算法2.1 非线性参数 &#xff21; 策略2.2 翻筋斗觅食策略 3.实验结果4.参考文献5.Matlab代码6.python代码 摘要&#xff1a;针对基本海鸥优化算法(SOA)在处理复杂优化问题中存在低精度、…...

K8S常见应用场景(六)

Kubernetes 是一个可移植的、可扩展的开源平台&#xff0c;用于管理容器化的工作负载和服务&#xff0c;可促进声明式配置和自动化。 Kubernetes 拥有一个庞大且快速增长的生态系统。Kubernetes 的服务、支持和工具广泛可用。 Kubernetes 这个名字源于希腊语&#xff0c;意为“…...

《不抱怨的世界》随记

*不抱怨的世界 * 1.天才只有三件事&#xff1a;我的事&#xff0c;他的事&#xff0c;老天的事。抱怨自己的的人&#xff0c;应该试着学习接纳自己&#xff1b;抱怨他人的人&#xff0c;应该试着把抱怨转成请求&#xff1b;抱怨老天的人么&#xff0c;请试着用祈祷的方式来诉求…...

2.2 利用MyBatis实现CRUD操作

一、准备工作 打开MyBatisDemo项目 二、查询表记录 1、在映射器配置文件里引入结果映射元素 在UserMapper.xml文件里创建结果映射元素 将UserMapper接口里抽象方法上的注解暂时注释掉 运行TestUserMapper测试类里的testFindAll()测试方法&#xff0c;查看结果 2、添加…...

自动缩放Kubernetes上的Kinesis Data Streams应用程序

想要学习如何在Kubernetes上自动缩放您的Kinesis Data Streams消费者应用程序&#xff0c;以便节省成本并提高资源效率吗&#xff1f;本文提供了一个逐步指南&#xff0c;教您如何实现这一目标。 通过利用Kubernetes对Kinesis消费者应用程序进行自动缩放&#xff0c;您可以从其…...

介绍js各种事件

目录 一、点击事件 二、鼠标移动事件 三、键盘事件 四、滚轮事件 五、拖放事件 六、窗口大小改变事件 一、点击事件 点击事件是指当用户单击页面上的某个元素时触发的事件。这是最常见和基础的事件之一&#xff0c;也是Web应用程序中最常用的交互之一。 以下是如何使用…...

Python 将 CSV 分割成多个文件

文章目录 使用 Pandas 在 Python 中创建 CSV 文件在 Python 中将 CSV 文件拆分为多个文件根据行拆分 CSV 文件根据列拆分 CSV 文件 总结 在本文中&#xff0c;我们将学习如何在 Python 中将一个 CSV 文件拆分为多个文件。 我们将使用 Pandas 创建一个 CSV 文件并将其拆分为多个…...

S32K144开发板

目录 一&#xff0e;S32K144开发板概述 二&#xff0e;产品技术和功能规格 三&#xff0e;开发环境 1.S32K144的开发环境主流是这么三种&#xff1a; 2.开发板Demo工程 四&#xff0e;S32K144开发板实物图 五、汽车大灯硬件架构 一&#xff0e;S32K144开发板概述 S32K14…...

三波混频下的相位失配原理

原理推导 在四波混频情况下&#xff0c;实现零相位失配是一件很困难的事情。因为在四波混频中&#xff0c;相位调制和增益都依赖于相同的参数&#xff0c;即克尔非线性 γ \gamma γ。这个问题可以用嵌入在传输线上的辅助共振元件的复杂色散工程来部分解决。 但是在三波混频中…...

软考A计划-试题模拟含答案解析-卷一

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分享&am…...

地震勘探——干扰波识别、井中地震时距曲线特点

目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波&#xff1a;可以用来解决所提出的地质任务的波&#xff1b;干扰波&#xff1a;所有妨碍辨认、追踪有效波的其他波。 地震勘探中&#xff0c;有效波和干扰波是相对的。例如&#xff0c;在反射波…...

Linux 文件类型,目录与路径,文件与目录管理

文件类型 后面的字符表示文件类型标志 普通文件&#xff1a;-&#xff08;纯文本文件&#xff0c;二进制文件&#xff0c;数据格式文件&#xff09; 如文本文件、图片、程序文件等。 目录文件&#xff1a;d&#xff08;directory&#xff09; 用来存放其他文件或子目录。 设备…...

Linux链表操作全解析

Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表&#xff1f;1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...

Spring Boot 实现流式响应(兼容 2.7.x)

在实际开发中&#xff0c;我们可能会遇到一些流式数据处理的场景&#xff0c;比如接收来自上游接口的 Server-Sent Events&#xff08;SSE&#xff09; 或 流式 JSON 内容&#xff0c;并将其原样中转给前端页面或客户端。这种情况下&#xff0c;传统的 RestTemplate 缓存机制会…...

Reasoning over Uncertain Text by Generative Large Language Models

https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...

Linux nano命令的基本使用

参考资料 GNU nanoを使いこなすnano基础 目录 一. 简介二. 文件打开2.1 普通方式打开文件2.2 只读方式打开文件 三. 文件查看3.1 打开文件时&#xff0c;显示行号3.2 翻页查看 四. 文件编辑4.1 Ctrl K 复制 和 Ctrl U 粘贴4.2 Alt/Esc U 撤回 五. 文件保存与退出5.1 Ctrl …...

Axure 下拉框联动

实现选省、选完省之后选对应省份下的市区...

Python 高级应用10:在python 大型项目中 FastAPI 和 Django 的相互配合

无论是python&#xff0c;或者java 的大型项目中&#xff0c;都会涉及到 自身平台微服务之间的相互调用&#xff0c;以及和第三发平台的 接口对接&#xff0c;那在python 中是怎么实现的呢&#xff1f; 在 Python Web 开发中&#xff0c;FastAPI 和 Django 是两个重要但定位不…...

Windows 下端口占用排查与释放全攻略

Windows 下端口占用排查与释放全攻略​ 在开发和运维过程中&#xff0c;经常会遇到端口被占用的问题&#xff08;如 8080、3306 等常用端口&#xff09;。本文将详细介绍如何通过命令行和图形化界面快速定位并释放被占用的端口&#xff0c;帮助你高效解决此类问题。​ 一、准…...

2025.6.9总结(利与弊)

凡事都有两面性。在大厂上班也不例外。今天找开发定位问题&#xff0c;从一个接口人不断溯源到另一个 接口人。有时候&#xff0c;不知道是谁的责任填。将工作内容分的很细&#xff0c;每个人负责其中的一小块。我清楚的意识到&#xff0c;自己就是个可以随时替换的螺丝钉&…...