Java项目使用Redis缓存数据

article/2025/9/19 9:08:04

Java项目使用Redis缓存数据

一、Redis的下载安装

1、下载gcc编译器

yum install gcc-c++

在这里插入图片描述
安装完成后检查是否安装成功,查看版本

gcc --version

在这里插入图片描述
2、使用weget下载redis

wget http://download.redis.io/releases/redis-6.2.4.tar.gz

在这里插入图片描述
下载成功后使用 ll 或 ls 命令查看当前目录下有redis压缩包
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
使用命令解压缩

tar -zxvf redis-6.2.4.tar.gz

解压成功后当前目录下有redis解压后的文件
在这里插入图片描述
3、进入解压后的redis文件,使用make进行编译
在这里插入图片描述
编译后默认安装目录就是redis文件夹所在目录
4、在解压后目录下执行make install 命令安装redis
在这里插入图片描述
5、进入安装目录启动redis服务

redis-server redis.conf

在这里插入图片描述
6、在xshell复制一个会话,cd进入redis安装目录,进行客户端连接

redis-cli -h 127.0.0.1 -p 6379

在这里插入图片描述
避雷:我本来想在Redisdesktopmanager里面连接我虚拟机里装的redis,然后一直报错
在这里插入图片描述
在网上搜解决方案采用修改redis.conf后成功
具体步骤如下
(1)如果已经启动redis,ctrl+c退出关闭redis,vim redis.conf修改配置文件,把原来的bind的IP改成虚拟机IP,protectedmode改成no,保存并退出
在这里插入图片描述
(2)重新启动redis

redis-server redis.conf

再次打开Redisdesktopmanager测试连接成功
在这里插入图片描述
这种情况下,虚拟机内客户端连接目录中IP记得改成redis.conf里改成的bindIP

redis-cli -h 127.0.0.1 -p 6379

在这里插入图片描述
另外,目前redis启动必须在一个会话终端里,启动redis之后就不能切换目录,退出等操作了,如果切换目录或退出就会关闭redis服务,如果要允许在启动redis的会话终端还能做别的操作还需要在redis.conf配置文件中更改配置daemonize yes;即作为守护进程启动,这样redis就可以后台启运行了。
在这里插入图片描述
这时候我们再来重新启动redis就不会显示像第五点的图一样的redis服务器启动后的画面,可以做别的操作
在这里插入图片描述

二、Java项目中整合Redis

1、添加依赖

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

在这里插入图片描述
2、redis连接配置
Redis实例默认创建了16个数据库,且不支持自定义命名,以dbX的方式命名(db0~db15);
此处我使用的redis的14数据库,没设置密码,若设置了密码则相应在password处输入密码

spring:redis:host: 127.0.0.1port: 6379database: 14password:

在这里插入图片描述
3、代码实现
(1)基础缓存DAO

@Repository
public class BaseCacheOperate {private final GsonBuilder gsonBuilder = new GsonBuilder().setDateFormat("yyyy-MM-dd HH:mm:ss");/*** @description boundList-Add*/public void add(BoundListOperations<String, String> boundListOperations, Object obj) {try {boundListOperations.rightPush(gsonBuilder.create().toJson(obj));} catch (Exception e) {e.printStackTrace();}}/*** @description boundList-Delete*/public void remove(BoundListOperations<String, String> boundListOperations, String cacheStr) {try {boundListOperations.remove(1, cacheStr);} catch (Exception e) {e.printStackTrace();}}/*** @description boundList-Query*/public List<String> list(BoundListOperations<String, String> boundListOperations, long count) {List<String> result = null;try {result = boundListOperations.range(0, count - 1);} catch (Exception e) {e.printStackTrace();}return result;}/*** @description boundHash-Add*/public void put(BoundHashOperations<String, String, String> boundHashOperations,String key, Object value) {try {boundHashOperations.put(key, gsonBuilder.create().toJson(value));} catch (Exception e) {e.printStackTrace();}}/*** @description boundHash-Remove*/public void remove(BoundHashOperations<String, String, String> boundHashOperations,String key) {try {boundHashOperations.delete(key);} catch (Exception e) {e.printStackTrace();}}/*** @description boundHash-Entries(Value单实体)*/public <T> Map<String, T> entries(BoundHashOperations<String, String, String> cacheOperations, Class<T> valueClass) {Map<String, T> result = new HashMap<>();Map<String, String> entries = cacheOperations.entries();if (DataStructureUtils.isValid(entries)) {entries.forEach((key, value) -> result.put(key, gsonBuilder.create().fromJson(value, valueClass)));}return result;}/*** @description boundHash-Get(Value单实体)*/public <T> T get(BoundHashOperations<String, String, String> cacheOperations,String key, Class<T> valueClass) {String cacheStr = get(cacheOperations, key);return StringUtils.isNotBlank(cacheStr) ? gsonBuilder.create().fromJson(cacheStr, valueClass) : null;}/*** @description boundHash-Get(Value为List)*/public <T> List<T> getList(BoundHashOperations<String, String, String> cacheOperations,String key, Class<T> valueClass) {String cacheStr = get(cacheOperations, key);return StringUtils.isNotBlank(cacheStr) ? gsonBuilder.create().fromJson(cacheStr, new TypeToken<List<T>>() {}.getType()) : null;}/*** @description boundHash-Get*/public String get(BoundHashOperations<String, String, String> cacheOperations,String key) {String result = null;try {result = cacheOperations.get(key);} catch (Exception e) {e.printStackTrace();}return result;}/*** @param cacheOperations Hash缓存操作实例* @param keyList         Key值集* @param valueClass      Value的类* @return 缓存数据集* @description 根据Key值集获取多条Value*/public <T> List<T> multiGet(BoundHashOperations<String, String, String> cacheOperations,List<String> keyList, Class<T> valueClass) {List<String> cacheStrList = multiGet(cacheOperations, keyList);List<T> result = new ArrayList<>();if (DataStructureUtils.isValid(cacheStrList)) {for (String cacheStr : cacheStrList) {result.add(gsonBuilder.create().fromJson(cacheStr, valueClass));}}return result;}/*** @param cacheOperations Hash缓存操作实例* @param keyList         Key值集* @param typeToken       Gson转换类型* @return 缓存数据集* @description 根据Key值集获取多条Value*/public <T> List<T> multiGet(BoundHashOperations<String, String, String> cacheOperations,List<String> keyList, TypeToken<List<T>> typeToken) {List<String> cacheStrList = multiGet(cacheOperations, keyList);List<T> result = new ArrayList<>();if (DataStructureUtils.isValid(cacheStrList)) {for (String cacheStr : cacheStrList) {result.addAll(gsonBuilder.create().fromJson(cacheStr, typeToken.getType()));}}return result;}/*** @param cacheOperations Hash缓存操作实例* @param keyList         Key值集* @return 缓存数据集* @description 根据Key值集获取多条Value*/public List<String> multiGet(BoundHashOperations<String, String, String> cacheOperations, List<String> keyList) {List<String> result = null;if (DataStructureUtils.isValid(keyList)) {try {result = cacheOperations.multiGet(keyList);if (result != null) {result.removeIf(Objects::isNull);}} catch (Exception e) {e.printStackTrace();}}return result;}}

(2)实际缓存业务

@Repository
public class TestDataDAO {private final BaseCacheOperate baseCacheOperate;private final BoundHashOperations<String, String, String> operations;@Autowiredpublic TestDataDAO(PublicCacheOperate baseCacheOperate, StringRedisTemplate redisTemplate) {this.baseCacheOperate = baseCacheOperate;this.operations = redisTemplate.boundHashOps("TEST_DATA");}/*** @description 缓存测试数据*/public void cache(TestData testData) {baseCacheOperate.put(operations, testData.getId().toString(), airSiteLatestData);}/*** @description 根据ID获取测试数据*/public TestData get(Long id) {return baseCacheOperate.get(operations, id.toString(), TestData.class);}/*** @description 根据ID集获取测试数据集*/public List<TestData> list(List<Long> idList) {return baseCacheOperate.multiGet(operations, idList.stream().map(Objects::toString).collect(Collectors.toList()), TestData.class);}
}

http://chatgpt.dhexx.cn/article/vfSDU8VP.shtml

相关文章

Java数据结构及原理实现

程序设计主要是数据结构算法&#xff0c;而数据结构在面向对象思维里是“容器”的意思&#xff0c;数据结构主要负责数据的添加&#xff0c;删除&#xff0c;修改&#xff0c;查找及对数据的其他操作。编程里面对着不同问题场景&#xff0c;选择哪种数据结构进行操作就非常重要…

Java数据集总结

Java数据集关系图&#xff08;来自网上&#xff09; 红色是接口&#xff0c;绿色是实现。其中 HashSet是通过内部持有HashMap实现TreeSet是通过内部持有TreeMap实现 除了上述基础数据集&#xff0c;还有一些其他数据集 LinkedHashMap 继承HashMapLinkedHashSet 继承HashSet&…

Java常见数据集合list、set、map

线性表 由零个或者多个数据元素组成的有限序列。第一个元素无前驱&#xff0c;最后一个元素没有后继&#xff0c;其他元素有且只有一个前驱或者后继 栈、队列 栈Queue队列Stack先进先出先进后出LinkedList&#xff1a;可以用它来实现双向队列。PriorityQueue&#xff1a;基于…

java数据集合

一&#xff09;Collection接口&#xff1a;存储单列数据&#xff1a; (1)List&#xff1a;单列有序集合&#xff08;可以重复&#xff09;&#xff1a; A、ArrayList&#xff1a;底层结构是数组&#xff0c;底层查询快&#xff0c;增删慢&#xff08;非线程安全&#xff09;&am…

windows VM12虚拟机安装苹果系统(Mac OX 10.11)

windows VM12虚拟机安装苹果系统(Mac OX 10.11) 本人最近需要使用苹果电脑生成请求文件&#xff0c;由于没有苹果电脑&#xff0c;只能安装个黑苹果对付一下了&#xff0c;以下是本人的经历。 首先需要工具 1、vm12安装包下载 提取码tcua&#xff1b; 2、unlocker208工具下载 提…

vm16安装macos12的详细配置

文章目录 版本情况macos安装unlock创建虚拟机虚拟机安装配置安装tools 优化部分参考文档部分 版本情况 VM16 macos 12.01 unlocker&#xff08;破解&#xff09; Github上的大佬Dr. Donk分享的Unlocker: https://github.com/DrDonk/unlocker/releases 资源相关链接&#xff1…

FileUtils中writeStringToFile和readFileToString的使用

使用FileUtils的前提必须先导入commons.io   jar包 maven 版本 <!-- https://mvnrepository.com/artifact/commons-io/commons-io --> <dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.…

Java 使用FileUtils.copyFile复制文件

1、FileUtils.copyFile方法 copyFile方法有多种重载形式&#xff0c;下面截图只是其中比较简单的一种&#xff0c;详细见官方文档 2、业务代码&#xff1a; private File copyFile(Long baseTime, int orgId, int typeId, String sourcePath, String fileName) throws IOExce…

【Java基础知识 18】通过FileUtils.copyFile探索IO原理

目录 一、FileUtils.copyFile1、从实例出发2、还是蛮快的&#xff0c;探索源码一番... 二、FileChannel1、读操作2、写操作3、代码实例4、控制台输出 三、如何减少copy和上下文切换的次数&#xff1f;1、为什么不能舍弃内核空间这一步&#xff0c;直接读取到用户空间呢&#xf…

FileUtils工具类常用方法

文件操作工具类&#xff08;FileUtils&#xff09; 使用 apache 的commons-io包下的FileUtils&#xff0c;import org.apache.commons.io.FileUtils; 下载地址&#xff1a;http://commons.apache.org/proper/commons-io/download_io.cgi 官方API文档&#xff1a;http://com…

App分渠道打包工具

渠道包就是要在安装包中添加渠道信息&#xff0c;也就是channel&#xff0c;对应不同的渠道&#xff0c;例如&#xff1a;小米市场、360市场、应用宝市场等。 我们要在安装包中添加不同的标识&#xff0c;应用在请求网络的时候携带渠道信息&#xff0c;方便后台做运营统计&…

H5打包成app的在线工具

H5打包成APP&#xff0c;有两种方式&#xff0c;方式一是直接用网址打包&#xff0c;方式二是将H5文件打包到APP的资源文件里面。第一种方式的用户体验不是很好&#xff0c;因为这种APP在用户没有网络的情况下&#xff0c;打开APP就会变成白屏&#xff0c;因为这种远程网址调用…

网站打包成app,webapp在线打包工具推荐

最近因为需求&#xff0c;需要把移动端网页打包成APP&#xff0c;本人一直是做网站开发的&#xff0c;没想到现在的webapp打包能如此方便了&#xff0c;打包的时候只用提供网站链接就可以了&#xff08;原理应该是做一个app简单浏览器&#xff0c;然后默认打开你网站的链接&…

HTML一键打包IPA(苹果IOS应用)工具 网站打包 APP

工具简介 HTML一键打包IPA&#xff08;苹果应用&#xff09;工具可以把本地HTML项目或者网站打包为一个苹果应用IPA文件&#xff0c;无需编写任何代码&#xff0c;支持在苹果设备上安装运行。 打包工具群&#xff1a;429338543 下载地址&#xff1a; 点击进入下载页面 加群获…

HTML一键打包APK工具_安卓app封装_H5打包安卓APP

随着目前苹果Appstore审核越来越严格&#xff0c;每天平均上架1000个&#xff0c;下架3000个应用&#xff0c;想要上架苹果应用商店已经越来越困难了&#xff0c;反复修改审核上架&#xff0c;短则1-2周&#xff0c;长则几个月&#xff0c;并且游戏类应用上架目前极其困难。 因…

AndroidStudio如何打包APP

首先&#xff0c;点击AS工具栏的Build下面的“Generate Signed Build APK…” 然后在弹出的框内选择APK &#xff08;Android App Bundle&#xff1a;用于通过 Google Play 发布的应用&#xff0c;需要升级到AS 3.2 以上版本才支持App Bundle格式&#xff1b; APK&#xff1a;…

网站项目打包成app

web项目打包app 这次打包app项目&#xff0c;主要用到的软件是HBuilderX&#xff1b; HBuilderX下载网址&#xff1a;https://www.dcloud.io/hbuilderx.html HBuilderX&#xff1a;可直接将网页打包成手机端app&#xff0c;可以有安卓和苹果两种安装包&#xff0c;这次我们主…

Flutter项目打包生成APK

flutter实现安卓打包&#xff1a;&#xff08;以安卓Studio工具为例&#xff09; &#xff08;1&#xff09;创建key.jks文件 在安卓studio中调整至项目路径&#xff0c;例如&#xff1a; 我的项目所在地 E:\Flutter\fluttershuqi>然后输入命令&#xff1a; keytool -ge…

Android App打包流程

简单总结下app打包的流程&#xff1a; 第一步&#xff1a;aapt 为res目录下的资源生成R.java文件&#xff0c;同时为AndroidManinfest.xml生成Manifest.java文件 第二步&#xff1a;aidl 把项目中自定义的aidl文件生成相应的Java代码文件 第三步&#xff1a;javac 把项目中所…

iOS app打包过程

1.点击Product - Archive 2.选择Development 点击Next 3.什么都不选&#xff0c;点击下一步 4.选择第一个&#xff0c;点击next 5.选择Export 6.拿到.ipa文件&#xff0c;导出成功&#xff01; 7.接下来&#xff0c;可以将ipa文件拖到蒲公英进行发布