SpringBoot 中操作 Redis 及工具类的封装

2023-11-13

在我们项目开发中总是免不了会使用缓存,Redis现在基本是我们公司中非常常见的缓存方案,包括在用户token的缓存,热点信息的缓存等,这篇文章主要讲讲在SpringBoot项目中如何去操作Redis,及最后工具类的封装。

一、引入依赖及进行配置

  1. maven依赖的引入(继承了SpringBoot的父模块,所以不需要再声明版本)
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
复制代码
  1. application.yml配置
spring:
  redis:
    host: localhost
    port: 6379
    password:
    database: 0 # 指定redis的分库(共16个,0-15)
复制代码

二、使用

使用示例:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/user")
public class UserController {
    @Autowired
    private RedisTemplate redisTemplate;
    @GetMapping("/get")
    public Object getUser() {
        return redisTemplate.opsForValue().get("user");
    }
    @GetMapping("/set")
    public String setUser(String user) {
        redisTemplate.opsForValue().set("user", user);
        return "success";
    }
}
复制代码

主要是自动装配好redis依赖提供给我们的RedisTemplate,然后通过redisTemplate来进行getset的操作

RedisTemplate Api(部分展示)

三、Redis 操作工具类的封装

redis相应的工具类封装,主要是对各种数据类型操作更方便,设置缓存过期时间等。

utils.RedisCache:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.BoundSetOperations;
import org.springframework.data.redis.core.HashOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.stereotype.Component;

import java.util.*;
import java.util.concurrent.TimeUnit;

@Component
public class RedisCache {
    @Autowired
    public RedisTemplate redisTemplate;

    /**
     * 缓存基本的对象,Integer、String、实体类等
     *
     * @param key   缓存的键值
     * @param value 缓存的值
     */
    public <T> void setCacheObject(final String key, final T value) {
        redisTemplate.opsForValue().set(key, value);
    }

    /**
     * 缓存基本的对象,Integer、String、实体类等
     *
     * @param key      缓存的键值
     * @param value    缓存的值
     * @param timeout  时间
     * @param timeUnit 时间颗粒度
     */
    public <T> void setCacheObject(final String key, final T value, final Integer timeout, final TimeUnit timeUnit) {
        redisTemplate.opsForValue().set(key, value, timeout, timeUnit);
    }

    /**
     * 设置有效时间
     *
     * @param key     Redis键
     * @param timeout 超时时间
     * @return true=设置成功;false=设置失败
     */
    public boolean expire(final String key, final long timeout) {
        return expire(key, timeout, TimeUnit.SECONDS);
    }

    /**
     * 设置有效时间
     *
     * @param key     Redis键
     * @param timeout 超时时间
     * @param unit    时间单位
     * @return true=设置成功;false=设置失败
     */
    public boolean expire(final String key, final long timeout, final TimeUnit unit) {
        return redisTemplate.expire(key, timeout, unit);
    }

    /**
     * 获得缓存的基本对象。
     *
     * @param key 缓存键值
     * @return 缓存键值对应的数据
     */
    public <T> T getCacheObject(final String key) {
        ValueOperations<String, T> operation = redisTemplate.opsForValue();
        return operation.get(key);
    }

    /**
     * 删除单个对象
     *
     * @param key
     */
    public boolean deleteObject(final String key) {
        return redisTemplate.delete(key);
    }

    /**
     * 删除集合对象
     *
     * @param collection 多个对象
     * @return
     */
    public long deleteObject(final Collection collection) {
        return redisTemplate.delete(collection);
    }

    /**
     * 缓存List数据
     *
     * @param key      缓存的键值
     * @param dataList 待缓存的List数据
     * @return 缓存的对象
     */
    public <T> long setCacheList(final String key, final List<T> dataList) {
        Long count = redisTemplate.opsForList().rightPushAll(key, dataList);
        return count == null ? 0 : count;
    }

    /**
     * 获得缓存的list对象
     *
     * @param key 缓存的键值
     * @return 缓存键值对应的数据
     */
    public <T> List<T> getCacheList(final String key) {
        return redisTemplate.opsForList().range(key, 0, -1);
    }

    /**
     * 缓存Set
     *
     * @param key     缓存键值
     * @param dataSet 缓存的数据
     * @return 缓存数据的对象
     */
    public <T> BoundSetOperations<String, T> setCacheSet(final String key, final Set<T> dataSet) {
        BoundSetOperations<String, T> setOperation = redisTemplate.boundSetOps(key);
        Iterator<T> it = dataSet.iterator();
        while (it.hasNext()) {
            setOperation.add(it.next());
        }
        return setOperation;
    }

    /**
     * 获得缓存的set
     *
     * @param key
     * @return
     */
    public <T> Set<T> getCacheSet(final String key) {
        return redisTemplate.opsForSet().members(key);
    }

    /**
     * 缓存Map
     *
     * @param key
     * @param dataMap
     */
    public <T> void setCacheMap(final String key, final Map<String, T> dataMap) {
        if (dataMap != null) {
            redisTemplate.opsForHash().putAll(key, dataMap);
        }
    }

    /**
     * 获得缓存的Map
     *
     * @param key
     * @return
     */
    public <T> Map<String, T> getCacheMap(final String key) {
        return redisTemplate.opsForHash().entries(key);
    }

    /**
     * 往Hash中存入数据
     *
     * @param key   Redis键
     * @param hKey  Hash键
     * @param value 值
     */
    public <T> void setCacheMapValue(final String key, final String hKey, final T value) {
        redisTemplate.opsForHash().put(key, hKey, value);
    }

    /**
     * 获取Hash中的数据
     *
     * @param key  Redis键
     * @param hKey Hash键
     * @return Hash中的对象
     */
    public <T> T getCacheMapValue(final String key, final String hKey) {
        HashOperations<String, String, T> opsForHash = redisTemplate.opsForHash();
        return opsForHash.get(key, hKey);
    }


    public void incrementCacheMapValue(String key, String hKey, int v) {
        redisTemplate.opsForHash().increment(key, hKey, v);
    }

    /**
     * 删除Hash中的数据
     *
     * @param key
     * @param hkey
     */
    public void delCacheMapValue(final String key, final String hkey) {
        HashOperations hashOperations = redisTemplate.opsForHash();
        hashOperations.delete(key, hkey);
    }

    /**
     * 获取多个Hash中的数据
     *
     * @param key   Redis键
     * @param hKeys Hash键集合
     * @return Hash对象集合
     */
    public <T> List<T> getMultiCacheMapValue(final String key, final Collection<Object> hKeys) {
        return redisTemplate.opsForHash().multiGet(key, hKeys);
    }

    /**
     * 获得缓存的基本对象列表
     *
     * @param pattern 字符串前缀
     * @return 对象列表
     */
    public Collection<String> keys(final String pattern) {
        return redisTemplate.keys(pattern);
    }
}
复制代码

使用:

import com.jk.utils.RedisCache;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/user")
public class UserController {
    @Autowired
    private RedisCache redisCache;
    @GetMapping("/get")
    public Object getUser() {
        return redisCache.getCacheObject("user");
    }
    @GetMapping("/set")
    public String setUser(String user) {
        redisCache.setCacheObject("user", user);
        return "success";
    }
}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SpringBoot 中操作 Redis 及工具类的封装 的相关文章

  • 无法在 Android 10 中创建目录

    我无法在 android 10 中创建目录 它可以在 android Oreo 之前的设备上运行 我尝试了两种创建文件夹的方法 Using File mkdir File f new File Environment getExternal
  • HashMap不写入数据库

    我尝试在我的数据库中写入 但只写入发件人和消息 我不明白为什么会发生这种情况 我认为问题出在我使用 sendMessage 的地方 我认为问题是我没有什么可以做的读 写其他用户的主键 我在数据库中写入消息的活动 public class M
  • 无法使用maven编译java项目

    我正在尝试在 java 16 0 1 上使用 maven 构建 IntelliJ 项目 但它无法编译我的项目 尽管 IntelliJ 能够成功完成 在此之前 我使用maven编译了一个java 15项目 但我决定将所有内容更新到16 0 1
  • 为什么 java 编译器不报告 Intellij 中多播表达式的未经检查的强制转换警告?

    为什么下面的代码没有报告 Intellij IDEA 的未经检查的警告jdk 1 8 0 121自从Supplier
  • Spring安全“记住我”cookie在第一个请求中不可用

    我无法在登录请求后检索 Spring 记住我 cookie 但它在对受保护页面的下一个请求中工作正常 谁能告诉我怎样才能立即得到它 我在登录请求中设置了记住我的 cookie 但在 Spring 重定向回原始 受保护的 url 后无法检索它
  • eclipse中导入项目文件夹图标

    我在 Eclipse 工作区中新导入的 Maven 项目有J and M项目文件夹顶部的图标 项目和包资源管理器 而其他导入的 Maven 项目只有一个J icon 有人可以解释其中的区别吗 该项目有J装饰器被称为 Java 项目和具有M装
  • 如何在android中设置多个闹钟,在这种情况下最后一个闹钟会覆盖以前的闹钟

    我正在开发一个Android应用程序 用户可以在其中设置提醒时间 但我在以下代码中遇到一个问题 即最后一个警报会覆盖之前的所有警报 MainActivity java public void setreminders DatabaseHan
  • 如何将 android.net.Uri 转换为 java.net.URL? [复制]

    这个问题在这里已经有答案了 有没有办法从Uri to URL 我正在使用的库需要这个 它only接受一个URL但我需要在我的设备上使用图像 如果该方案的Uri is http or https new URL uri toString 应该
  • 在java中实现你自己的阻塞队列

    我知道这个问题之前已经被问过并回答过很多次了 但我只是无法根据互联网上找到的示例找出窍门 例如this http tutorials jenkov com java concurrency blocking queues html or t
  • Java:正则表达式排除空值

    在问题中here https stackoverflow com questions 51359056 java regexp for a separated group of digits 我得到了正则表达式来匹配 1 到 99 之间的一
  • 如何获取 WebElement 的父级[重复]

    这个问题在这里已经有答案了 我试过了 private WebElement getParent final WebElement webElement return webElement findElement By xpath 但我得到
  • 隐式超级构造函数 Person() 未定义。必须显式调用另一个构造函数?

    我正在开发一个项目 但收到错误 隐式超级构造函数 Person 未定义 必须显式调用另一个构造函数 我不太明白它 这是我的人物课程 public class Person public Person String name double D
  • Java - 返回值是否会中断循环?

    我正在编写一些基本上遵循以下格式的代码 public static boolean isIncluded E element Node
  • Android Studio 将音乐文件读取为文本文件,如何恢复它?

    gameAlert mp3是我的声音文件 运行应用程序时 它询问我该文件不与任何文件类型关联 请定义关联 我选择TextFile错误地 现在我的音乐文件被读取为文本文件 我如何将其转换回music file protected void o
  • 无法捕获 Spring Batch 的 ItemWriter 中的异常

    我正在编写一个 Spring Batch 流程来将数据集从一个系统迁移到另一个系统 在这种情况下 这就像使用RowMapper实现在传递给查询之前从查询构建对象ItemWriter The ItemWriter称为save我的 DAO 上的
  • JVM:是否可以操作帧堆栈?

    假设我需要执行N同一线程中的任务 这些任务有时可能需要来自外部存储的一些值 我事先不知道哪个任务可能需要这样的值以及何时 获取速度要快得多M价值观是一次性的而不是相同的M值在M查询外部存储 注意我不能指望任务本身进行合作 它们只不过是 ja
  • Java的-XX:+UseMembar参数是什么

    我在各种地方 论坛等 看到这个参数 并且常见的答案是它有助于高并发服务器 尽管如此 我还是找不到 sun 的官方文档来解释它的作用 另外 它是Java 6中添加的还是Java 5中存在的 顺便说一句 许多热点虚拟机参数的好地方是这一页 ht
  • Java:多线程内的 XA 事务传播

    我如何使用事务管理器 例如Bitronix http docs codehaus org display BTM Home JBoss TS http www jboss org jbosstm or Atomikos http www a
  • Android AutoCompleteTextView 带芯片

    我不确定我是否使用了正确的词语来描述此 UI 功能 但我已附上我希望在我的应用程序中实现的目标的快照 它由 Go SMS 使用 用户在编辑文本中键入联系人 在用户从完成下拉列表中选择联系人后 该联系人将被插入到编辑文本中 如附图所示 编辑文
  • Android 和 Java 中绘制椭圆的区别

    在Java中由于某种原因Ellipse2D Double使用参数 height width x y 当我创建一个RectF在Android中参数是 left top right bottom 所以我对适应差异有点困惑 如果在 Java 中创

随机推荐

  • 微信小程序简介

    一 了解微信小程序微信小程序 小程序的一种 英文名Wechat Mini Program 是一种不需要下载安装即可使用的应用 张小龙 发布时间2017年1月9日 二 微信小程序和普通H5的区别1 微信小程序用开发者工具来查看预览页面 H5用
  • R中的统计模型

    R中的统计模型 这一部分假定读者已经对统计方法 特别是回归分析和方差分析有一定的了解 后面我们还会假定读者对广义线性模型和非线性模型也有所了解 R已经很好地定义了统计模型拟合中的一些前提条件 因此我们能构建出一些通用的方法以用于各种问题 R
  • 股票资金建仓分仓补仓计算器

    软件演示图 百度网盘下载地址 http pan baidu com s 1o8Prq6A 软件功能原理与应用价值 我们每个人买股票基本很难做到一买就涨的 买了后可能会下跌一波段再涨 则此就会另到我们时常赚不到钱而纠结卖出一分钱都不能获利而离
  • grep常用需要转义字符汇总

    最近用grep的时候发现转义非常恶心 干脆做个测试 统计一下表示特殊语意时 需要转义的字符 这里的特殊语意是指非匹配自己本身 有特殊含义的时候
  • 神经网络参数理解与设置

    一 超参数 1 学习率 每次迭代的步长 决定着目标函数能否收敛到局部最小值以及何时收敛到最小值 学习率越高 步长越大 2 batch 当训练数据过多时 无法一次将所有的数据送入计算 所以需要将数据分成几个部分 多个batch 逐一地送入计算
  • excel重复的数据只计数一次_你还在加班核对重复数据?3个Excel技巧教你快速进行数据查重...

    相信使用Excel办公的同学 绝大多数都会碰到一个问题 它就是数据重复值的问题 因为数据里面有重复内容 经常会让我们的工作变得非常的棘手 如上图所示 里面是我们仓库发出的单号 我们需要里面就有包含重复发货的单号 如果我们单凭肉眼去看基本是不
  • 联想电脑安装虚拟机出现不可恢复的错误

    VMware Workstation 不可恢复错误 vcpu 0 vcpu 0 VERIFY vmcore vmm main cpuid c 376 bugNr 1036521 日志文件位于 F centos vmware log 中 您可
  • websocket协议与实现原理

    文章目录 一 websocket 二 websocket的协议实现 websocket的协议格式 websocket如何验证客户端合法 websocket传输的明文和密文的传输 websocket如何断开 实现 一 websocket we
  • __attribute__((__aligned__(n)))对结构体对齐的影响

    1 attribute 是什么 attribute 是GCC里的编译参数 用法有很多种 感兴趣可以阅读一下gcc的相关文档 这里说一下 attribute 对变量和结构体对齐的影响 这里的影响大概分为两个方面 对齐和本身占用的字节数的大小
  • android ndk常见的问题及解决的方法

    原文 http blog csdn net fangyuanseu article details 6857911 在ndk编译的过程中遇到的一些问题 1 在用ndk build编译的时候 被编译文件的路径中不能包含空格 如果包含有空格将会
  • Content-Type的几种常用数据编码格式

    Content Type 内容类型 一般是指网页中存在的Content Type ContentType属性指定请求和响应的HTTP内容类型 如果未指定 ContentType 默认为text html 1 text html 文本方式的网
  • Ubuntu 环境下使用中文输入法

    Ubuntu 环境下使用中文输入法 安装fcitx 1 进入系统设置 gt 语言支持 将汉语 中国 拖到最上面 如果列表中没有 选择 添加或删除语言 来添加 2 切换键盘输入法系统 将其修改为fcitx 如果下拉框中没有显示fcitx 则需
  • java poi导入Excel、导出excel

    java poi导入Excel 导出excel 导出meven架包
  • hive中判断一个字符串是否包含另一个子串的四种方法,sql中也可用

    hive中判断一个字符串是否包含另一个子串的四种方法 如果你有一个数据需求 需要从一个字段中 判断是否有一个字符串 你该怎么做 一 方法1 like和rlike 最能想到的方法 用like或者rlike select i want to t
  • Python使用pytorch深度学习框架构造Transformer神经网络模型预测红酒分类例子

    1 红酒数据介绍 经典的红酒分类数据集是指UCI机器学习库中的Wine数据集 该数据集包含178个样本 每个样本有13个特征 可以用于分类任务 具体每个字段的含义如下 alcohol 酒精含量百分比 malic acid 苹果酸含量 克 升
  • VirtualBox&VMWare虚拟机导入/导出步骤

    一 问题描述 最近做项目需要用到Linux虚拟机 以及在不同硬件平台 不同笔记本电脑 之间进行性能对比测试 因此学习如何导入 导出虚拟机 其中用到的虚拟化软件包括 1 VMware Workstation 17 Pro 2 VirtualB
  • 多位个数字 ,不同组合排列之和 (不重复,所有可能的组合之和) PHP

    数组 array 1 2 3 4 多位数也可以 以下是所需第一种方式结果 以下是具体实现代码 public function getSortList array level 1 list for i 0 i lt count array i
  • 记录渗透靶场实战【网络安全】

    第一次写靶场实战的文章 有不足之处还请多多指教 本次实战的靶场是红日安全vulnstack系列的第二个靶场 靶场地址 http vulnstack qiyuanxuetang net vuln detail 3 环境搭建 网络环境 网卡配置
  • 《Apache MINA 2.0 用户指南》第十五章: 代理

    有待官方完善中
  • SpringBoot 中操作 Redis 及工具类的封装

    在我们项目开发中总是免不了会使用缓存 Redis现在基本是我们公司中非常常见的缓存方案 包括在用户token的缓存 热点信息的缓存等 这篇文章主要讲讲在SpringBoot项目中如何去操作Redis 及最后工具类的封装 一 引入依赖及进行配