当前位置: 首页 > 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…...

C++_核心编程_多态案例二-制作饮品

#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为&#xff1a;煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例&#xff0c;提供抽象制作饮品基类&#xff0c;提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...

云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地

借阿里云中企出海大会的东风&#xff0c;以**「云启出海&#xff0c;智联未来&#xff5c;打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办&#xff0c;现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例

使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件&#xff0c;常用于在两个集合之间进行数据转移&#xff0c;如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model&#xff1a;绑定右侧列表的值&…...

线程与协程

1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指&#xff1a;像函数调用/返回一样轻量地完成任务切换。 举例说明&#xff1a; 当你在程序中写一个函数调用&#xff1a; funcA() 然后 funcA 执行完后返回&…...

【项目实战】通过多模态+LangGraph实现PPT生成助手

PPT自动生成系统 基于LangGraph的PPT自动生成系统&#xff0c;可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析&#xff1a;自动解析Markdown文档结构PPT模板分析&#xff1a;分析PPT模板的布局和风格智能布局决策&#xff1a;匹配内容与合适的PPT布局自动…...

【论文笔记】若干矿井粉尘检测算法概述

总的来说&#xff0c;传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度&#xff0c;通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...

【算法训练营Day07】字符串part1

文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接&#xff1a;344. 反转字符串 双指针法&#xff0c;两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...

tree 树组件大数据卡顿问题优化

问题背景 项目中有用到树组件用来做文件目录&#xff0c;但是由于这个树组件的节点越来越多&#xff0c;导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多&#xff0c;导致的浏览器卡顿&#xff0c;这里很明显就需要用到虚拟列表的技术&…...

【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)

1.获取 authorizationCode&#xff1a; 2.利用 authorizationCode 获取 accessToken&#xff1a;文档中心 3.获取手机&#xff1a;文档中心 4.获取昵称头像&#xff1a;文档中心 首先创建 request 若要获取手机号&#xff0c;scope必填 phone&#xff0c;permissions 必填 …...

是否存在路径(FIFOBB算法)

题目描述 一个具有 n 个顶点e条边的无向图&#xff0c;该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序&#xff0c;确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数&#xff0c;分别表示n 和 e 的值&#xff08;1…...