通过 Spring 操作 Redis

要想通过 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";
    }

}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据库的约束 not null, unique, default, primary key, foreign key, check

约束可以理解成 数据库提供的一种针对数据的合法性进行验证的机制, 在创建表的时候使用 1. 约束类型 NOT NULL - 指示某列不能存储 NULL 值, 表里的这个内容是必填项UNIQUE - 保证某列的每行必须有唯一的值, 不能重复 每次插入/修改时, 都要先触发查询, 如果当前插入/修改的…

mysql存储比特位

一、介绍 二、SQL CREATE TABLE bits_table (id INT PRIMARY KEY AUTO_INCREMENT,bit_value BIGINT UNSIGNED );-- 插入一个 8 位的 BIT 值 INSERT INTO bits_table (bit_value) VALUES (B10101010);-- 查询并格式化输出 SELECT id,bit_value,CONCAT(b, LPAD(BIN(bit_value),…

解决小皮面版搭建php网站数据库连接不了

首先进入mysql bin目录下 并执行cmd mysql -u root -pCREATE USER userlocalhost IDENTIFIED BY pass;GRANT ALL PRIVILEGES ON *.* TO userlocalhost;GRANT SELECT, INSERT, UPDATE ON database_name.* TO xxwlocalhost;FLUSH PRIVILEGES;select host ,user from mysql.user…

pdf文件怎么编辑?分享3个专业的pdf软件!

在数字化时代&#xff0c;PDF文件已成为我们工作、学习中的得力助手。然而&#xff0c;面对需要修改的PDF文件&#xff0c;许多人却感到无从下手。今天&#xff0c;就让我们一起探索如何轻松编辑PDF文件&#xff0c;并介绍几款实用的编辑软件&#xff0c;让你轻松应对各种PDF编…

Linux DAY 6 _systemctl

systemctl命令&#xff0c;通过这个命令控制系统操作 语法&#xff1a;systemctl start | stop | status | enable | disable 服务名 start 启动 stop 关闭 status 查看状态 enable 开启开机自启 disable 关闭开机自启 服务名&#xff1a; NetworkManager 主网络服务 net…

DFE_offset失调校准

1.校准原因 *制造工艺的限制&#xff1a;晶体管在制造过程中&#xff0c;由于工艺的限制&#xff0c;不可能做到完全对称&#xff0c;这导致了输入级晶体管的性能存在微小的差异。 *输入级偏置电流的不对称&#xff1a;输入级晶体管的偏置电流也会存在差异&#xff0c;这也会…

如何在OpenHarmony上使用SeetaFace2人脸识别库?

简介 相信大部分同学们都已了解或接触过OpenAtom OpenHarmony&#xff08;以下简称“OpenHarmony”&#xff09;了&#xff0c;但你一定没在OpenHarmony上实现过人脸识别功能&#xff0c;跟着本文带你快速在OpenHarmony标准设备上基于SeetaFace2和OpenCV实现人脸识别。 项目效…

如何理解kmp的套娃式算法啊?

概念 KMP算法&#xff0c;全称Knuth Morris Pratt算法 。文章大部分内容出自《数据结构与算法之美》 核心思想 假设主串是a&#xff0c;模式串是b 在模式串与主串匹配的过程中&#xff0c;当遇到不可匹配的字符的时候&#xff0c;对已经对比过的字符&#xff0c;是否能找到…

向上调整建堆与向下调整建堆的时间复杂度 AND TopK问题

目录 前言建堆的时间复杂度TOPK问题总结 前言 本篇旨在介绍使用向上调整建堆与向下调整建堆的时间复杂度. 以及topk问题 博客主页: 酷酷学!!! 感谢关注~ 建堆的时间复杂度 堆排序是一种优于冒泡排序的算法, 那么在进行堆排序之前, 我们需要先创建堆, 为什么说堆排序的是优于…

YOLOv8绘制map曲线图

yolov8源码绘制的map曲线图不够清晰&#xff0c;python代码绘制的曲线图导入word之后清晰度也不够高&#xff0c;所以选择使用matlab来绘制曲线图&#xff0c;matlab可以直接复制图窗到word中&#xff0c;在转换成pdf也不会失真。点击编辑&#xff0c;复制图窗即可复制到word中…

【Linux】:Linux 2.6内核 调度队列和调度原理

朋友们、伙计们&#xff0c;我们又见面了&#xff0c;本期来给大家解读一下有关Linux 2.6内核 调度队列和调度原理&#xff0c;如果看完之后对你有一定的启发&#xff0c;那么请留下你的三连&#xff0c;祝大家心想事成&#xff01; C 语 言 专 栏&#xff1a;C语言&#xff1a…

做抖店需要截流吗?聊下抖店的出单玩法和运营思路

我是王路飞。 做抖店需要截流吗&#xff1f; 关于抖店的玩法&#xff0c;一直都是众说纷纭&#xff0c;谁都想发表点自己的意见。 尤其是很多新手&#xff0c;可能以前接触过淘宝等传统电商&#xff0c;对截流等玩法有个基本了解&#xff0c;就认为抖店是不是也是这样玩的。…

使用Flask ORM进行数据库操作的技术指南

文章目录 安装Flask SQLAlchemy配置数据库连接创建模型类数据库操作插入数据查询数据更新数据删除数据 总结 Flask是一个轻量级的Python Web框架&#xff0c;其灵活性和易用性使其成为开发人员喜爱的选择。而ORM&#xff08;对象关系映射&#xff09;则是一种将数据库中的表与面…

免费开源人脸识别系统,支持RESTful API

简介 CompreFace 是一个免费开源的人脸识别项目&#xff0c;您不需要具备机器学习技能就能安装设置和使用 CompreFace&#xff0c;官方提供了基于 docker 的部署方法&#xff0c;可以方便地部署在本地或者云端服务器上。 CompreFace 提供了 RESTful API&#xff0c;用于人脸识别…

超详细的前后端实战项目(Spring系列加上vue3)(一步步实现+源码)前端篇(一)

最近想着一步步搭建一个前后端项目&#xff0c;将每一步详细的做出来。&#xff08;如果有不足或者建议&#xff0c;也希望大佬们指出哦&#xff09; 前端初始化 1.根据vue脚手架创建vue项目 这里可以用很多方法创建vue项目&#xff0c;大家看着创建吧&#xff0c;只要能创建…

C++、与C语言的一些变化、新增的一些函数类型、面向对象程序设计的基本特点

C 面向对象的编程思想 万物皆对象 类库&#xff1a; MFC Qt opencv opengl cout&#xff1a;标准输出流对象 endl&#xff1a;换行符 新的数据类型 bool型&#xff1a;逻辑真假—— true、false 变量的存储类型 auto&#xff1a;变量在定义时由编译器自动推到…

Linux网络配置全攻略:解读/etc/network/interfaces文件的精髓

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 Linux网络配置全攻略&#xff1a;解读/etc/network/interfaces文件的精髓 前言文件结构与基本概念配置网络接口的常用参数高级网络配置技巧实用工具与调试技巧实战案例与最佳实践 前言 在我们的日常生…

JVM(7):虚拟机性能分析和故障解决工具之jstat工具

1 jstat(JVM Statistics Monitoring Tool)作用 监视虚拟机各种运行状态信息&#xff0c;可以显示本地或者是远程虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据 2 命令格式 jstat [options vmid [interval[count]]] 参数解释 第一个参数&#xff1a;options 代…

谷歌插件编写

目录 manifest.json {"manifest_version": 3,"name": "Floating Ball","version": "1.0","description": "A floating ball on the right side of the webpage.","permissions": ["act…

C语言 数组——计算最大值的函数实现

目录 计算最大值 计算最大值的函数实现 应用实例&#xff1a;计算班级最高分​编辑​编辑 返回最大值所在的下标位置 返回最大值下标位置的函数实现​编辑 一个综合应用实例——青歌赛选手评分​编辑​编辑​编辑​编辑​编辑 计算最大值 计算最大值的函数实现 应用实例&…