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

Redis访问工具

使用Redis存储缓存数据,如何通过Java去访问Redis?

防止后面看晕,先来张图。

1. Redis的客户端库

Redis的客户端库是Redis官方提供的,用于让Java等编程语言与Redis服务器进行通信的工具包。常见的Redis客户端库有多个,主要包括以下两种:

1.1 Jedis

1.1.1 特点

  • Jedis是最早的Java Redis客户端之一,API简单直观。
  • 它是阻塞式的客户端,也就是说每个命令的执行会阻塞当前线程,直到获得响应为止。
  • 支持Redis的所有基本功能,如字符串、列表、集合、哈希等基本数据结构的操作。
  • 提供了连接池功能,用于管理多个Redis连接。

1.1.2 适用场景

  • 小规模项目或对性能要求不高的应用。
  • 单线程操作足够的场景。

1.1.3 缺点

  • 阻塞式设计在高并发场景下性能不如Lettuce。
  • 不支持异步或反应式编程模型

1.2 Lettuce

1.2.1 特点

  • Lettuce是一个基于Netty的高性能、非阻塞的Redis客户端库。
  • 支持同步异步响应式(Reactive)操作。
  • 在多线程环境下更高效,连接可以共享在多个线程之间使用。
  • 内建的可扩展性使得Lettuce非常适合高并发场景。
  • 提供自动重连和连接管理功能。

1.2.2 适用场景

  • 高并发、大规模系统。
  • 对性能、非阻塞操作有要求的场景。
  • 需要支持异步和反应式编程的应用。

1.2.3 优点

  • 性能优越,支持异步和响应式操作。
  • 在多线程环境中效率更高。

2. 集成框架

2.1 Spring data redis

RedisTemplate 是 Spring Data Redis 提供的用于与 Redis 进行交互的模板类,它封装了与 Redis 服务器的连接,并为 Redis 的操作提供了简便的 API。通过 RedisTemplate,开发者可以轻松地在项目中执行各种 Redis 操作,如键值存储、列表操作、哈希操作、集合操作等。

2.1.1 RedisTemplate 的核心功能

RedisTemplate 提供了以下几种主要功能,适用于对 Redis 进行各种数据类型的操作:

  • String 类型操作:可以用于常见的 key-value 存储,如缓存数据等。
  • Hash 类型操作:适合存储复杂对象的数据结构,类似于数据库中的表结构。
  • List 类型操作:适合存储有序的数据集合,常用于队列、消息队列等。
  • Set 类型操作:适合存储无序的不重复的数据集合。
  • ZSet(有序集合)类型操作:适合存储有序的带分数的集合。

2.1.2 如何使用 RedisTemplate

在项目中,RedisTemplate 一般是通过 Spring Data Redis 框架自动配置的,默认情况下会提供一个 StringRedisTemplate,可以直接使用。

2.1.3 RedisTemplate 的主要方法

  • opsForValue():用于操作 Redis 中的 String 类型数据。支持常用的 setget 等操作。
  • opsForHash():用于操作 Redis 中的 Hash 类型数据。支持 putgetdelete 等操作。
  • opsForList():用于操作 Redis 中的 List 类型数据。支持 leftPushrightPop 等操作。
  • opsForSet():用于操作 Redis 中的 Set 类型数据。支持 addmembers 等操作。
  • opsForZSet():用于操作 Redis 中的 ZSet(有序集合)类型数据。支持 addrangeremove 等操作。

2.2 Spring Cache框架

Spring Cache 是 Spring 框架中的缓存抽象机制,它通过统一的 API 来处理缓存操作,并且可以与各种缓存中间件进行集成,包括 EhCache、Caffeine 和 Redis。Spring Cache 提供了一套注解,开发者只需通过这些注解就能轻松地完成缓存的增删改查操作。

在集成 Redis 的情况下,Spring Cache 通过 Redis 客户端(如 Lettuce)与 Redis 服务器进行通信,并通过 RedisCacheManager 来管理缓存的操作。

2.2.1 Spring Cache 相关的核心注解

Spring Cache 通过以下几个核心注解来管理缓存:

  • @Cacheable:将方法的返回值缓存起来,下次调用时如果缓存中存在,则直接返回缓存中的数据。
  • @CachePut:在执行方法的同时,将方法的返回值放入缓存中。
  • @CacheEvict:清理缓存中的数据。
  • @Caching:组合多个缓存操作。

2.2.2 Spring Cache 集成 Redis的工作原理

Spring Cache 与 Redis 的集成主要通过 RedisCacheManagerRedisTemplate 完成。当 Spring Cache 执行缓存操作时,它实际上会通过 RedisCacheManager 来管理缓存,并通过 RedisTemplate 与 Redis 服务器通信,RedisTemplate 调用 Redis 的相关命令,Lettuce 客户端则负责将这些命令传递到 Redis 服务器,并接收响应。

工作原理:

  • 当调用带有 @Cacheable 注解的方法时,Spring Cache 会先检查 Redis 缓存中是否存在该方法对应的缓存数据。如果存在,则直接返回缓存中的数据;如果不存在,则执行方法,并将方法的返回值存储在 Redis 中。
  • @CacheEvict 用于清理缓存中的数据。当调用该注解标记的方法时,Spring Cache 会通过 RedisCacheManager 删除 Redis 中的相应缓存。
  • @CachePut 则是强制将方法的返回值更新到缓存中,即使缓存中已经存在数据。

2.3 Spring data redis 和 Spring Cache的关系

对于使用 Redis 作为缓存的场景,Spring Data Redis 提供了具体的实现,通常你会配置一个 RedisCacheManager 作为 CacheManager 的实现。RedisCacheManager 内部使用 RedisTemplate 来与 Redis 进行交互,但这种细节是被 Spring Cache 抽象层所隐藏的。

在 Spring 项目中,Spring data redis框架中的RedisTemplate 提供了底层的 Redis 操作 API,而 Spring Cache 则通过注解的方式简化了缓存操作。在使用 Spring Cache 时,缓存的存储方式可以是 Redis,这时底层仍然是通过 RedisTemplate 进行 Redis 操作。

3. 总结

        常用的有Jedis和Lettuce两个访问redis的客户端库,其中Lettuce的性能和并发性要好一些,Spring Boot 默认使用的是 Lettuce 作为 Redis 的客户端。

        使用Spring data redis框架,在项目中可以通过RedisTemplate访问Redis,RedisTemplate提供了方便访问redis的模板方法。RedisTemplate 进行 Redis 操作时,实际上是通过 Lettuce 客户端与 Redis 服务器进行通信。

        使用Spring Cache框架,Spring Cache是spring的缓存框架,可以集成各种缓存中间件,比如:EhCache、Caffeine、redis。Spring Cache最终也是通过Lettuce 去访问redis 。使用Spring Cache的方法很简单,只需要在方法上添加注解即可实现将方法返回数据存入缓存,以及清理缓存等注解的使用。

        RedisTemplate适用于灵活操作redis的场景,通过RedisTemplate的API灵活访问Redis。

        这两种访问 redis的方法可以在项目中都使用。

相关文章:

Redis访问工具

使用Redis存储缓存数据,如何通过Java去访问Redis? 防止后面看晕,先来张图。 1. Redis的客户端库 Redis的客户端库是Redis官方提供的,用于让Java等编程语言与Redis服务器进行通信的工具包。常见的Redis客户端库有多个&#xff0c…...

vue3+ant design vue动态实现级联菜单~

1、这里使用的是ant design vue 的TreeSelect 树选择来实现的。 <a-form-item name"staffDept" label"责任部门" labelAlign"left"><a-tree-selectv-model:value"formState.staffDept"show-search//允许在下拉框中添加搜索框…...

软件可维护性因素例题

答案&#xff1a;C 知识点&#xff1a; 系统可维护性因素决定 可理解性 可测试性 可修改性 选项C可移植性错误...

git的一些操作

参考视频: git分支详解&#xff08;约10分钟掌握分支80%操作&#xff09;&#xff0c;git-branch&#xff0c;git分支管理&#xff0c;git分支操作&#xff0c;git分支基础和操作&#xff0c;2023年git基础使用教程 不同的分支相当于不同的平行世界 合并分支 两个分支是我们项…...

opencv实战项目二十三:基于BEBLID描述符的特征点匹配实现表盘校正

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、特征点匹配介绍二、特征点检测三、特征描述符计算四&#xff0c;描述符的匹配筛选五&#xff0c;根据匹配结果映射图片六&#xff0c;整体代码&#xff1a;…...

数据库是全表扫描是怎么扫描法?

全表扫描是数据库服务器用来搜寻表的每一条记录的过程&#xff0c;直到所有符合给定条件的记录返回为止。‌ 在执行全表扫描时&#xff0c;数据库会逐行扫描表中的所有记录&#xff0c;以找到符合查询条件的记录。这种扫描方式适用于没有为查询条件中的字段建立索引的情况。全…...

认准这10款人力资源系统,90%的企业都在用!

本文将为大家推荐十款主流的人力资源系统&#xff0c;为企业选型提供参考&#xff01; 想象一下&#xff0c;企业在不断发展壮大的过程中&#xff0c;员工数量逐渐增多&#xff0c;人事管理变得越来越复杂。如果没有一个高效的人力资源系统&#xff0c;就如同在大海中航行却没有…...

2024年我的利基出版转型——新战略与重点解析

这篇文章酝酿已久。这是我在网络出版策略上投入数百小时后得出的成果。 像我们这个行业的许多人一样&#xff0c;即网络出版行业&#xff0c;我一直忙于彻底改造整个出版业务。 这是一段漫长的旅程&#xff0c;这是肯定的。 我预感在此过程中还会有更多调整&#xff0c;但我…...

【数据结构】双向链表专题

目录 1.双向链表的结构 2.双向链表的实现 2.1初始化 以参数的形式初始化链表&#xff1a; 以返回值的形式初始化链表&#xff1a; 2.2尾插 2.3打印 2.4头插 2.5尾删 2.6头删 2.7查找 2.8在指定位置之后插入数据​编辑 2.9删除pos节点 2.10销毁 3.整理代码 3.1…...

大二上学期计划安排

大二上学期计划安排 学期目标: 加强算法学习,提升算法思维,为以后的算法竞赛做准备学习java知识,学习框架,构建知识体系,深入底层,增强理解增加项目经验,独立完成至少一个项目,并进行交流,优化增强团队凝聚力,营造良好的团队氛围阅读书籍,阅读至少3本以上经典书籍 日常学习安…...

HarmonyOS开发实战( Beta5.0)图片编辑实现马赛克效果详解

鸿蒙HarmonyOS开发往期必看&#xff1a; HarmonyOS NEXT应用开发性能实践总结 最新版&#xff01;“非常详细的” 鸿蒙HarmonyOS Next应用开发学习路线&#xff01;&#xff08;从零基础入门到精通&#xff09; 介绍 本示例将原图手指划过的区域分割成若干个大小一致的小方格…...

【新书介绍】《JavaScript前端开发与实例教程(微课视频版)(第2版)》

本书重点 无任何基础的初学者&#xff0c;高校JavaScript课程教材。 配套非常全&#xff0c;提供案例源代码、PPT课件、课后习题答案、微课视频、教案、教学大纲、课程实训、期末考试试卷、章节测试、实验报告、学习通建课资源包。 内容简介 JavaScript是开发Web前端必须掌…...

什么是GWAS全基因组关联分析?

什么是全基因组关联分析&#xff1f;&#xff08;Genome-Wide Association Study&#xff0c;GWAS&#xff09; 全基因组关联分析&#xff08;GWAS&#xff09;是一种在全基因组范围内搜索遗传变异&#xff08;通常是单核苷酸多态性&#xff0c;SNP&#xff09;与复杂性状之间关…...

k8s dashboard token 生成/获取

创建示例用户 在本指南中&#xff0c;我们将了解如何使用 Kubernetes 的服务帐户机制创建新用户、授予该用户管理员权限并使用与该用户绑定的承载令牌登录仪表板。 对于以下每个和的代码片段ServiceAccount&#xff0c;ClusterRoleBinding您都应该将它们复制到新的清单文件(如)…...

windows@openssh免密登陆配置@基于powershell快速配置脚本

文章目录 abstract免密自动登录配置介绍&#x1f47a;修改Server配置文件一键脚本修改&#x1f47a; 向ssh server端上传或创建支持免密登录的公钥文件预执行命令&#x1f47a;方式1方式2重启服务以生效&#x1f47a; 傻瓜式配置免密自动登录&#x1f47a;&#x1f47a;准备 操…...

【深度学习】【图像分类】【OnnxRuntime】【Python】VggNet模型部署

【深度学习】【图像分类】【OnnxRuntime】【Python】VggNet模型部署 提示:博主取舍了很多大佬的博文并亲测有效,分享笔记邀大家共同学习讨论 文章目录 【深度学习】【图像分类】【OnnxRuntime】【Python】VggNet模型部署前言Windows平台搭建依赖环境模型转换--pytorch转onnxONN…...

手写排班日历

手写排班日历&#xff1a; 效果图&#xff1a; vue代码如下&#xff1a; <template><div class"YSPB"><div class"title">排班日历</div><div class"banner"><span classiconfont icon-youjiantou click&qu…...

SpringBoot多数据源配置

1、添加依赖 <!-- 数据库驱动 --><!--mysql--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>${mysql-connector-java.version}</version><scope>runtime</sco…...

影响画布微信小程序canvas及skyline和webview用户界面布局的关键流程

影响微信小程序画布canvas及skyline和webview用户界面布局的关键流程 目录 影响微信小程序画布canvas及skyline和webview用户界面布局的关键流程 一、微信小程序canvas开发流程 1.1、官方指南 1.2、客制化开发 第一步&#xff1a;在 WXML 中添加 canvas 组件 第二步&…...

MATLAB图像处理

MATLAB图像处理 MATLAB&#xff0c;作为美国MathWorks公司出品的商业数学软件&#xff0c;以其强大的矩阵运算能力和丰富的函数库&#xff0c;在图像处理领域得到了广泛的应用。MATLAB不仅提供了基础的图像处理功能&#xff0c;还通过图像处理工具箱&#xff08;Image Process…...

VB.net复制Ntag213卡写入UID

本示例使用的发卡器&#xff1a;https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...

Zustand 状态管理库:极简而强大的解决方案

Zustand 是一个轻量级、快速和可扩展的状态管理库&#xff0c;特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...

遍历 Map 类型集合的方法汇总

1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...

uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖

在前面的练习中&#xff0c;每个页面需要使用ref&#xff0c;onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入&#xff0c;需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案

问题描述&#xff1a;iview使用table 中type: "index",分页之后 &#xff0c;索引还是从1开始&#xff0c;试过绑定后台返回数据的id, 这种方法可行&#xff0c;就是后台返回数据的每个页面id都不完全是按照从1开始的升序&#xff0c;因此百度了下&#xff0c;找到了…...

376. Wiggle Subsequence

376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...

【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)

可以使用Sqliteviz这个网站免费编写sql语句&#xff0c;它能够让用户直接在浏览器内练习SQL的语法&#xff0c;不需要安装任何软件。 链接如下&#xff1a; sqliteviz 注意&#xff1a; 在转写SQL语法时&#xff0c;关键字之间有一个特定的顺序&#xff0c;这个顺序会影响到…...

C++ 基础特性深度解析

目录 引言 一、命名空间&#xff08;namespace&#xff09; C 中的命名空间​ 与 C 语言的对比​ 二、缺省参数​ C 中的缺省参数​ 与 C 语言的对比​ 三、引用&#xff08;reference&#xff09;​ C 中的引用​ 与 C 语言的对比​ 四、inline&#xff08;内联函数…...

工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配

AI3D视觉的工业赋能者 迁移科技成立于2017年&#xff0c;作为行业领先的3D工业相机及视觉系统供应商&#xff0c;累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成&#xff0c;通过稳定、易用、高回报的AI3D视觉系统&#xff0c;为汽车、新能源、金属制造等行…...

Android15默认授权浮窗权限

我们经常有那种需求&#xff0c;客户需要定制的apk集成在ROM中&#xff0c;并且默认授予其【显示在其他应用的上层】权限&#xff0c;也就是我们常说的浮窗权限&#xff0c;那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...