通过 Spring 操作 Redis

news2024/11/20 3:28:19

要想通过 Java 操作 redis,首先要连接上 redis 服务器,推荐看通过 Java 操作 redis -- 连接 redis

创建项⽬

        勾选 NoSQL 中的 Spring Data Redis 

        当然, 把 Web 中的 Spring Web 也勾选⼀下.⽅便写接进⾏后续测试.

配置 redis 服务地址

        在 application.properties 配置文件中配置参数:

#redis 服务器的地址
spring.redis.host=127.0.0.1
#redis 服务器的端口号
spring.redis.port=8888

        至于为什么是这里配置的 redis 端口是本地的 8888 端口,相信看了本文章头部推荐的博客以后就很清楚了,我们用 shh 的端口转发,将服务器上 redis 的 6379 端口映射到了本地的 8888 端口

 测试代码

package com.example.redisspringdemo.Controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.connection.RedisConnection;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.ZSetOperations;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;
import java.util.Set;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: wuyulin
 * Date: 2024-05-21
 * Time: 18:03
 */
@RestController
@RequestMapping("/RedisDemoController")
public class RedisDemoController {
    //从 spring 的 IOC 容器中获取 stringRedisTemplate 对象
    @Autowired
    //在 Spring 中通过 StringRedisTemplate 类的对象来操作 Redis
    //  在 Spring 中操作 Redis 最原始的类是 RedisTemplate,StringRedisTemplate 是它的子类
    //专门用于处理文本数据,还有一个类专门用于处理二进制数据
    private StringRedisTemplate stringRedisTemplate;

    /**
     * 操作 Redis 中 String 类型的键值对
     * */
    @RequestMapping("/stringDemo")
    public String stringDemo(){
        //  清空 Redis 中已有的键值对避免对最终结果造成影响
        //  但 Spring 中并没有封装 flushAll 等操作,那怎么办呢?
        //RedisTemplate 留了一个后手,能够让我们执行 Jedis 原生命令
        //  这里的 RedisConnection 就代表了 Redis 连接,对标 Jedis 对象
        //通过 RedisConnection 对象就可以执行 Jedis 对象中的方法
        stringRedisTemplate.execute((RedisConnection redisConnection)->{
            //清空 redis 中的数据
            redisConnection.flushAll();
            return null;
        });

        //stringRedisTemplate.opsForValue() 得到一个专门操作 String 类型的对象
        //调用 set 方法设置键值对
        stringRedisTemplate.opsForValue().set("key1","111");
        stringRedisTemplate.opsForValue().set("key2","222");
        stringRedisTemplate.opsForValue().set("key3","333");

        //通过 get 方法通过 key 获取 value
        String key1=stringRedisTemplate.opsForValue().get("key1");
        String key2=stringRedisTemplate.opsForValue().get("key2");

        System.out.println("key1:"+key1);
        System.out.println("key2:"+key2);
        return "ok";
    }

    /**
     * 操作 Redis 中 List 类型的键值对
     * */
    @RequestMapping("/listDemo")
    public String listDemo(){
        stringRedisTemplate.execute((RedisConnection redisConnection)->{
            //清空 redis 中的数据
            redisConnection.flushAll();
            return null;
        });

        // stringRedisTemplate.opsForList() 得到一个专门操作 List 类型的对象
        // leftPush() 向列表的左边插入数据
        stringRedisTemplate.opsForList().leftPush("key","1");
        //leftPushAll()向列表的左边插入多条数据
        stringRedisTemplate.opsForList().leftPushAll("key","2","3","4");

        //range() 获取指定范围内的数据
        List<String> key=stringRedisTemplate.opsForList().range("key",0,-1);

        System.out.println(key);
        return "ok";
    }
    /**
     * 操作 Redis 中 set 类型的键值对
     * */
    @RequestMapping("/setDemo")
    public String setDemo(){
        stringRedisTemplate.execute((RedisConnection redisConnection)->{
            redisConnection.flushAll();
            return null;
        });

        // stringRedisTemplate.opsForSet() 得到一个专门操作 Set 类型的对象
        //向集合中添加数据
        stringRedisTemplate.opsForSet().add("key","zhangsan","lisi","wangwu");

        //获取集合中的所有数据
        Set<String> key=stringRedisTemplate.opsForSet().members("key");
        System.out.println(key);

        //判断集合中 zhangsan 是否存在
        Boolean result1=stringRedisTemplate.opsForSet().isMember("key","zhangsan");
        System.out.println(result1);

        //获取集合中的元素个数
        Long count=stringRedisTemplate.opsForSet().size("key");
        System.out.println(count);

        stringRedisTemplate.opsForSet().remove("key","zhangsan","lisi");
        key=stringRedisTemplate.opsForSet().members("key");
        System.out.println(key);

        return "ok";
    }

    @RequestMapping("/hashDemo")
    public String hashDemo(){
        stringRedisTemplate.execute((RedisConnection redisConnection)->{
           redisConnection.flushAll();
           return null;
        });

        // stringRedisTemplate.opsForHash() 得到一个专门操作 Hash 类型的对象
        //向哈希表中添加数据
        stringRedisTemplate.opsForHash().put("key","f1","111");
        stringRedisTemplate.opsForHash().put("key","f2","222");
        stringRedisTemplate.opsForHash().put("key","f3","333");

        //获取 hash 表中的数据
        String f1=(String) stringRedisTemplate.opsForHash().get("key","f1");
        System.out.println(f1);

        //判断哈希表中的某个键值对是否存在
        Boolean exists=stringRedisTemplate.opsForHash().hasKey("key","f1");
        System.out.println(exists);

        //删除哈希表中的键值对
        stringRedisTemplate.opsForHash().delete("key","f1","f2");

        //获取哈希表中的元素个数
        Long count=stringRedisTemplate.opsForHash().size("key");
        System.out.println(count);

        return "ok";
    }

    @RequestMapping("/zsetDemo")
    public String zsetDemo(){
        //清空 redis 中的数据
        stringRedisTemplate.execute((RedisConnection redisConnection)->{
           redisConnection.flushAll();
           return null;
        });

        // stringRedisTemplate.opsForZSet() 得到一个专门操作 ZSet 类型的对象
        //添加数据到有序集合中
        stringRedisTemplate.opsForZSet().add("key","zhangsan",10);
        stringRedisTemplate.opsForZSet().add("key","lisi",20);
        stringRedisTemplate.opsForZSet().add("key","wangwu",30);

        //获取有序集合中指定范围的元素
        Set<String> members=stringRedisTemplate.opsForZSet().range("key",0,-1);
        System.out.println(members);

        //获取有序集合指定范围内的元素和分数
        Set<ZSetOperations.TypedTuple<String>> membersAndScore=stringRedisTemplate.opsForZSet().rangeWithScores("key",0,-1);
        System.out.println(membersAndScore);

        //获取有序集合中指定元素的分数
        Double score=stringRedisTemplate.opsForZSet().score("key","zhangsan");
        System.out.println(score);

        //删除有序集合中指定的元素
        stringRedisTemplate.opsForZSet().remove("key","zhangsan","lisi");

        //获取有序集合中的元素个数
        Long count=stringRedisTemplate.opsForZSet().size("key");
        System.out.println(count);

        //获取有序集合中指定元素的排名
        Long rank=stringRedisTemplate.opsForZSet().rank("key","wangwu");
        System.out.println(rank);

        return "ok";
    }

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1683171.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CF451E: Devu and Flowers(容斥原理 + 考虑反面 + golang组合模版)

题目截图 题目翻译 题目分析 正难则反&#xff0c;考虑所有不符合的例子 由于n很小&#xff0c;所以可以状态压缩二进制遍历完全部不符合例子的组合 对于不符合的例子&#xff0c;假设其中第i个不符合&#xff0c;那么就消耗掉fi 1个球 以此类推&#xff0c;减剩下s2个球 这时…

盘点28个免费域名申请大全

盘点28个免费域名申请大全 免费域名推荐学习使用&#xff0c;免费就意味着没任何保障。 名称稳定时间支持解析模式后缀格式说明地址EU.org28 年NS.eu.org/. 国家简写.eu.org需要审核&#xff0c;稳定性高&#xff0c;限制少&#xff0c;国内访问有问题&#xff0c;可 CFeu.orgp…

关于「公 告」根据中华人民共和国法律,Bing 在中国内地暂停 “搜索自动建议” 功能 30 天

当我看见我们大家都这样我可放心了&#xff0c;我打开电脑搜索图片就发生了。 当我看见我们大家都这样我可放心了&#xff0c;坐等攻城狮修复。

前端vue用el-table如何实现表头内容过长换行处理,实现换行效果

前端vue用el-table如何实现表头内容过长换行处理&#xff0c;实现换行效果 这是效果图 有两种方法&#xff0c;一种简易版本&#xff0c;一种万能方法,都是el-table&#xff0c;先看文档 表头标题是可以自定义的 方法一 label的解释写在代码里面了&#xff0c;这里会自动形成换…

六零导航页 file.php 任意文件上传漏洞复现(CVE-2024-34982)

0x01 产品简介 LyLme Spage(六零导航页)是中国六零(LyLme)开源的一个导航页面。致力于简洁高效无广告的上网导航和搜索入口,支持后台添加链接、自定义搜索引擎,沉淀最具价值链接,全站无商业推广,简约而不简单。 0x02 漏洞概述 六零导航页 file.php接口处任意文件上传…

中银基金软件开发工程师春招群面记录

本文介绍2024届春招中&#xff0c;中国银行下属中银基金管理有限公司的软件开发工程师岗位1场面试的基本情况、提问问题等。 2024年04月投递了中国银行的共计4个部门或单位&#xff0c;包括中银基金管理有限公司的软件开发工程师岗位&#xff0c;暂时不清楚所在部门。目前完成了…

AWS安全性身份和合规性之Artifact

AWS Artifact是对您很重要的与合规性相关的信息的首选中央资源。AWS Artifact是一项服务&#xff0c;提供了一系列用于安全合规的文档、报告和资源&#xff0c;以帮助用户满足其合规性和监管要求。它允许按需访问来自AWS和在AWS Marketplace上销售产品的ISV的安全性和合规性报告…

I.MX6Ull交叉编译QT项目并用u盘拷贝到开发板下

1.安装交叉编译器 2.命令行交叉编译Qt项目 3.拷贝编译好的执行程序到开发板运行 下载到虚拟机 修改权限chom u x 名称 执行完后&#xff0c;变色 执行脚本文件&#xff0c;使能 source /opt/fsl-imx-x11/4.1.15-2.1.0/environment-setup-cortexa7hf-neon-poky-linux-gnueabi …

利用远控工具横向

一.横向移动介绍和方式 1.介绍 内网渗透的横向移动是指攻击者在成功进入内网后&#xff0c;通过利用内部系统的漏洞或者获取的合法访问权限&#xff0c;从一个受感染的系统向其他系统扩散或移动。这种横向移动的目的通常是为了获取更多的敏感信息、提升权限、扩大攻击面或者更…

将PCD点云投影到BEV平面得到图片

前言 点云数据作为一种丰富的三维空间信息表达方式&#xff0c;通常用于自动驾驶、机器人导航和三维建模等领域。然而&#xff0c;点云数据的直观性不如二维图像&#xff0c;这限制了它在一些需要快速视觉反馈的应用场景中的使用。本文将探讨如何将点云数据转换为二维图像&…

【传知代码】从零开始搭建图像去雾神经网络-论文复现

文章目录 概述原理介绍网络结构 核心逻辑迁移学习子网数据拟合子网 环境配置训练本次复现代码所用数据集测试本次复现代码所用的评价指标 结果展示在O-Haze数据集上的结果在I-Haze数据集上的结果 小结 本文涉及的源码可从从零开始搭建图像去雾神经网络该文章下方附件获取 本文复…

React中显示数据

SX 会让你把标签放到 JavaScript 中。而大括号会让你 “回到” JavaScript 中&#xff0c;这样你就可以从你的代码中嵌入一些变量并展示给用户。例如&#xff0c;这将显示 user.name&#xff1a; return (<h1>{user.name}</h1> ); 你还可以将 JSX 属性 “转义到 …

内网安全之搭建ADCS证书服务

在域控上安装ADCS服务时&#xff0c;默认会自动配置完LDAPS&#xff0c;如果不是在域控上安装ADCS服务&#xff0c;需要手动配置LDAPS 安装证书服务ADCS 打开服务器管理器——>添加角色和功能 选择“基于角色或基于功能的安装”选项&#xff0c;然后点击下一步 选择“从…

我的前端封装之路

最近有粉丝提问了我一个面试中遇到的问题&#xff0c;他说面试的时候&#xff0c;面试官问我&#xff1a;你在以前的项目中封装过组件吗&#xff1f;或者做过npm公共库吗&#xff1f;遇到过什么问题吗&#xff1f;当时自己突然觉得好像没什么可回答的啊&#xff0c;但面试结束想…

实现顺序表各种基本运算的算法

实验一&#xff1a;实现顺序表各种基本运算的算法 一、实验目的与要求 目的: 领会顺序表存储结构和掌握顺序表中各种基本运算算法设计。 内容: 编写一个程序sqlist.cpp,实现顺序表的各种基本运算和整体建表算法(假设顺序表的元素类型ElemType为char),并在此基础上设计一个…

【免费】支持向量机回归预测(SVR)的MATLAB实现(含源代码)

支持向量机&#xff08;Support Vector Machine, SVM&#xff09;是一种常用于分类和回归分析的机器学习算法。虽然SVM最为人熟知的是其分类应用&#xff0c;但它同样适用于回归任务&#xff0c;被称为支持向量回归&#xff08;Support Vector Regression, SVR&#xff09;。以…

温故而知新-JUC篇【面试复习】

温故而知新-JUC篇【面试复习】 前言版权推荐温故而知新-JUC篇多线程Java语言中的线程安全线程安全的实现方法线程的创建线程的状态wait和sleep的区别ThreadLocalsynchronize的优化synchronize和Reentrant的对比AQS线程池ThreadPoolExecutorThreadPoolExecutor源码ConcurrentHas…

javaSwing电影票购票管理系统(视频+源码)

摘要 运行环境&#xff1a;jdk1.8 mysql5.7 eclipse 系统实现 联系 q:3996962787 完整代码、sql、报告、程序资源

【Shell脚本】文本三剑客之sed编辑器

目录 一.sed编辑器的相关介绍及执行过程 1.sed介绍 2.sed编辑器的执行过程 二.sed命令格式 1.基本格式 2.在一个脚本文件里定义操作命令 3.常用操作 三.打印功能 1.默认打印方式 2.防止出现重复打印 2.1. 2.2. 2.3. 2.4. 3.使用地址打印 3.1.以数字形式打印行区…

物联网实战--平台篇之(八)分组后台管理

目录 一、分组数据库 二、请求分组列表 三、添加分组 四、重命名分组 五、删除分组 六、分组排序 本项目的交流QQ群:701889554 物联网实战--入门篇https://blog.csdn.net/ypp240124016/category_12609773.html 物联网实战--驱动篇https://blog.csdn.net/ypp240124016/ca…