Spring Data Redis操作Redis

news2024/12/22 23:21:01
  • 在Spring Boot项目中,可以使用Spring Data Redis来简化Redis操作,maven的依赖坐标:
       <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

在这里插入图片描述

8.3.3、操作Redis的步骤

(1)创建一个Spring Boot工程;

(2)在pom.xml文件中导入以上Spring Data Redis的依赖坐标;

(3)配置application.yml文件:

#spring的配置
spring:
  application:
    name: springdataRedis_demo
  main:
      #解决升级Spring Boot2.6,因依赖循环引用导致启动时报错的问题
    allow-circular-references: true

#Redis的相关配置(在spring下)
  redis:
    port: 6379 #默认端口号
    host: localhost #表示连接的是本地的服务,要连接远程的话,需要更改为远程服务器的ip地址
    #设置密码(在redis的redis.windows.conf配置文件中有设置密码的话,这里要配置)
    #password: 123456
    database: 0  #默认提供了16个数据库,编号为0-15,在命令行可以通过select index更改数据库
    #jedis的配置
    jedis:
      #Redis连接池配置
      pool:
        max-active: 8 #最大连接数
        max-wait: 1ms #连接池最大阻塞等待时间
        max-idle: 4 #连接池中的最大空闲连接
        min-idle: 0 #连接池中最小空闲连接

(4)配置序列化配置类:

package com.itcast.springdataredis_demo.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.StringRedisSerializer;

/**
 * @author :LTY
 * @date :Created in 2023/7/20 16:37
 * @description:序列化配置类
 * @modified By:
 * @version: $
 */
@Configuration
public class RedisConfig {

    @Bean
    public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        //1.创建RedisTemplate对象
        RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();

        //默认的key序列化器为: JdkSerializationRedisSerializer
        redisTemplate.setKeySerializer(new StringRedisSerializer()); //String类型
        redisTemplate.setHashKeySerializer(new StringRedisSerializer()); //Hash哈希类型
        //设置Value的序列化
        redisTemplate.setValueSerializer(new StringRedisSerializer());
        redisTemplate.setHashValueSerializer(new StringRedisSerializer());

        //2.设置连接工厂
        redisTemplate.setConnectionFactory(redisConnectionFactory);

        return redisTemplate;
    }
}

(5)测试各数据类型的数据

首先在测试类上进行如下修改:

在这里插入图片描述

  • String类型数据

    测试代码:

  /**
     * 操作String类型数据
     */
    @Test
    public void testString() {
        redisTemplate.opsForValue().set("city12", "beijing");
        String city = (String)redisTemplate.opsForValue().get("city12");
        System.out.println(city);

        //设置10秒的过去时间(对应redis的String类型的setex key seconds value命令)
        redisTemplate.opsForValue().set("key1", "value1", 10L, TimeUnit.SECONDS);

        //对应redis的String类型的setnx key value命令
        redisTemplate.opsForValue().setIfAbsent("city12","shanghai");
    }

​ 运行结果如下:

在这里插入图片描述

  • Hash哈希类型数据

​ 测试代码:

   /**
     * hash哈希类型数据
     */
    @Test
    public void testHash() {
        HashOperations hashOperations = redisTemplate.opsForHash();
        //存入数据(对应hset命令)
        hashOperations.put("002","name","xiaohong");
        hashOperations.put("002","age","21");
        hashOperations.put("002","sex","male");
        //获取单个字段的值(对应hget命令)
         String name = (String)hashOperations.get("002", "name");
        System.out.println("获得单个字段的值(hget key field): " +name);

        //获得hash结构中所有的字段(对应hkeys命令)
        System.out.println("获得hash结构中所有的字段(hkeys key): ");
       Set keys = hashOperations.keys("002");
        for (Object key : keys) {
            System.out.println(key);
        }
        //获得hash结构中所有的字段的值(对应hvals命令)
        System.out.println("获得hash结构中所有的字段的值(kvals key): ");
        List values = hashOperations.values("002");
        for (Object value : values) {
            System.out.println(value);
        }
        //获取哈希表中指定key的所有字段和值(hgetall key)
        System.out.println("获得哈希表中指定key的所有字段和值(hgetall key): ");
        Map entries = hashOperations.entries("002");
        System.out.println(entries);
    }

运行结果如下:

在这里插入图片描述

  • List类型数据

    测试代码:

     /**
         * 操作List类型的数据
         */
        @Test
        public void testList() {
            ListOperations listOperations = redisTemplate.opsForList();
           //存值(从左边存值)
            listOperations.leftPush("mylist", "a"); //存一个
            listOperations.leftPushAll("mylist","b","c","d"); //存多个
                //从右边存值
            listOperations.rightPush("mylist", "e");
            listOperations.rightPushAll("mylist", "f","g");//此时存入的值顺序:d c b a e f g
    
            //取值(从表头到表尾依次输出)
            List<String> mylist = listOperations.range("mylist", 0, -1);
            for (String s : mylist) {
                System.out.println(s); //输出:d c b a e f g
            }
    
    
            //获取列表的菜单llen
            System.out.println("...............移除...........");
            Long size = listOperations.size("mylist");
            int i1 = size.intValue();
            for (int i = 0; i < i1; i++) {
                //出队
                /**
                 *  leftPop:移除并获取第一个元素(从表头出队(左边))
                 *  rightPop:移除并获取最后一个元素(从表尾移除(右边))
                 */
    //            String mylist1 = (String)listOperations.rightPop("mylist");
    //            System.out.println(mylist1); //输出:g f e a b c d
    
                //rightPopAndLeftPush:从mylist表尾移除数据,并在mylist2左边(表头)存值
                listOperations.rightPopAndLeftPush("mylist","mylist2", 10l, TimeUnit.SECONDS);//存入顺序:d c b a e f g
            }
    
            //取值
            System.out.println("..........mylist2..........");
            List<String> mylist2 = listOperations.range("mylist2", 0, -1);
            for (String s1 : mylist2) {
                System.out.println(s1); //输出:d c b a e f g
            }
        }
    

    运行结果如下:

在这里插入图片描述

  • Set类型数据

​ ①基本操作

​ 测试代码:

 /**
     * 操作Set类型数据
     */
    @Test
    public void testSet() {
        SetOperations setOperations = redisTemplate.opsForSet();
        //存值(sadd)
        setOperations.add("myset", "a", "b", "c","a");
        //取值(smembers)
        Set<String> myset = setOperations.members("myset");
        //获得集合的成员数(scard)
        System.out.println("集合的成员数为: " + setOperations.size("myset"));
        for (String s : myset) {
            System.out.println(s); //输出:
        }

        //删除一个或多个成员(srem)
        setOperations.remove("myset", "a", "b");

        //取值
        myset = setOperations.members("myset");
        for (String string : myset) {
            System.out.println(string);
        }
    }

运行结果:

在这里插入图片描述

​ ②交集、并集和差集

​ 测试代码:

 /**
     * 交集、并集和差集
     */
    @Test
    public void testSet2() {
        redisTemplate.opsForSet().add("myset2", "a", "b", "c");
        redisTemplate.opsForSet().add("myset3", "a", "b", "e");
        //交集
        System.out.println("myset2与myset3的交集为: ");
        Set<String> intersect = redisTemplate.opsForSet().intersect("myset2", "myset3");
        for (String o : intersect) {
            System.out.println(o);
        }
        //并集
        System.out.println("myset2与myset3的并集为: ");
        Set<String> union = redisTemplate.opsForSet().union("myset2", "myset3");
        for (String o : union) {
            System.out.println(o);
        }
        //差集
          //myset2-myset3
        System.out.println("myset2与myset3的差集为(myset2-myset3): ");
        Set<String> difference1 = redisTemplate.opsForSet().difference("myset2", "myset3");
        for (String o : difference1) {
            System.out.println(o);
        }
        //myset3-myset2
        System.out.println("myset3与myset2的差集为(myset3-myset2): ");
        Set<String> difference2 = redisTemplate.opsForSet().difference("myset3", "myset2");
        for (String o : difference2) {
            System.out.println(o);
        }
    }

运行结果:

在这里插入图片描述

  • ZSet类型数据

​ 测试代码:

/**
     * 操作ZSet类型数据
     */
    @Test
    public void testZSet() {
        ZSetOperations zSetOperations = redisTemplate.opsForZSet();
        //存值
        zSetOperations.add("myZSet", "a", 20.0);
        zSetOperations.add("myZSet", "b", 30.0);
        zSetOperations.add("myZSet", "c", 40.0);
        zSetOperations.add("myZSet", "a", 50.0);

        //取值
        Set<String> myZSet = zSetOperations.range("myZSet", 0, -1);
        for (String s : myZSet) {
            System.out.println(s);
        }

运行结果:

在这里插入图片描述

  • 通用操作

​ 测试代码:

/**
     * 通用操作,针对不同类型的数据类型都可以进行操作
     */
    @Test
    public void testCommon() {
        //获取Redis中所有的key
        Set<String> keys = redisTemplate.keys("*");
        for (String key : keys) {
            System.out.println(key);
        }

        //判断某个key是否存在
        Boolean itcast = redisTemplate.hasKey("itcast");
        System.out.println(itcast);

        //删除指定的key
        redisTemplate.delete("myZSet");

        //获得指定的key对应的value的数据类型
        DataType type = redisTemplate.type("myset");
        System.out.println(type);
    }

运行结果:

在这里插入图片描述

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

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

相关文章

STM32使用DMA实现GPIO的高速翻转

STM32使用DMA实现GPIO的高速翻转 一、前言二、原理三、配置IO口四、配置DMA五、程序内容5.1 gpio配置5.2 keil中添加.C和.h文件&#xff08;需要DMA发送控制GPIO的数组波形文件&#xff09;如不想这么麻烦的可以略过&#xff0c;在main函数中定义一个数组即可&#xff0c;因为我…

0基础学C#笔记07:选择排序法

文章目录 前言一、选择排序原理二、使用步骤三、打印结果总结 前言 我们常用的排序方法有十种&#xff0c;分别是&#xff1a; 冒泡排序&#xff1b;选择排序&#xff1b;插入排序&#xff1b;希尔排序&#xff1b;归并排序&#xff1b;快速排序&#xff1b;堆排序&#xff1…

全志F1C200S嵌入式驱动开发(spi-nor驱动)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 和v3s一样,f1c200s本身也支持spi-nor flash。当然,不管是norflash,还是nandflash,都是为了能够让程序脱离sd卡,直接依靠板子上面的flash,就可以完成正常地加载和运行工作。tf…

《Docker容器编排模式:了解Sidecar、Ambassador等模式,构建高效稳定的容器化应用》

&#x1f337;&#x1f341; 博主 libin9iOak带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33…

基于 Graviton2处理器构建容器化基因分析工作负载

概述 相对于基于传统 x86架构的处理器来说&#xff0c;Amazon 设计的基于 ARM 架构的 Graviton 处理器为 EC2中运行的云工作负载提供了更佳的性价比。基于 Graviton2 的实例支持广泛的通用型、突发型、计算优化型、内存优化型、存储优化型和加速计算型工作负载&#xff0c;包括…

重生之我要学c++第二课

在上期内容&#xff0c;我们讲述了c相比于C语言的更简易之处&#xff0c;本期就让我们继续学习相关的知识&#xff0c;了解c宇宙 引用(起别名) 引用不是新定义一个变量&#xff0c;而是给已存在变量取了一个别名&#xff0c;编译器不会为引用变量开辟内存空 间&#xff0c;它…

基于 KubeKey 扩容 Kubernetes v1.24 Worker 节点实战

前言 知识点 定级&#xff1a;入门级KubeKey 扩容 Worker 节点openEuler 操作系统的基本配置Kubernets 基本命令 实战服务器配置(架构 1:1 复刻小规模生产环境&#xff0c;配置略有不同) 主机名IPCPU内存系统盘数据盘用途ks-master-0192.168.9.912450100KubeSphere/k8s-mas…

新能源汽车的发展

目录 1.什么是新能源 2.什么是新能源汽车 3.新能源汽车的优点 4.新能源汽车的危害 5.新能源汽车未来的发展 1.什么是新能源 新能源是指与传统能源&#xff08;如化石燃料&#xff09;相比&#xff0c;更具可再生性、清洁性和低碳排放的能源形式。它主要通过利用自然资源和可…

C语言---每天小练习,从大到小输出

题目&#xff1a;从大到小输出 写代码将三个整数数按从大到小输出。 例如&#xff1a; 输入&#xff1a;2 3 1 输出&#xff1a;3 2 1 int main() {// 初始化int a 0;int b 0;int c 0;int d 0;scanf("%d %d %d", &a, &b, &c);if (a < b) {…

Unity Shader - UI/Default shader 优化示例

文章目录 环境优化示例Texture Format : Alpha 8 和 shaderlab : _TextureSampleAddshaderlab : _UIMaskSoftnessX 和 _UIMaskSoftnessYshaderlab _Colorshader ARM Mobile Studio - Graphics Analyzer优化前优化后 环境 Unity : 2020.3.37f1 Pipeline : BRP 优化 做性能优化…

laravel10.x nginx服务推荐配置文件

laravel10.x 服务器配置 如果您正在将应用程序部署到运行Nginx的服务器&#xff0c;则可以使用以下配置文件作为配置web服务器的起点。很可能&#xff0c;此文件需要根据服务器的配置进行自定义。如果你想在管理服务器方面获得帮助&#xff0c;可以考虑使用第一方Laravel服务器…

3分钟搭建一个springboot项目并运行起来

第一步&#xff1a; 创建一个maven项目。 第二步&#xff1a; 导入maven依赖&#xff0c;代码如下&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http:/…

执行 yum install gcc 报 【-bash: $‘yum\302\240install\302\240gcc‘: 未找到命令】

执行 yum install gcc 报错 找了一圈&#xff0c;执行&#xff1a;sudo apt-get install yum 执行&#xff1a;wget http://yum.baseurl.org/download/3.2/yum-3.2.28.tar.gz 在线下载yum完成 对其进行解压&#xff1a;tar zxvf yum-3.2.28.tar.gz 解压后如下&#xff1a; 执行…

vue3+h5实现虚拟列表

目录 vue3h5实现虚拟列表component / List.vuecomponent / itemComponent.vue使用组件效果 vue3h5实现虚拟列表 安装&#xff1a;npm i vue3-virtual-scroll-listpackage.json "dependencies": {"vue": "^3.2.36","vue3-virtual-scroll-li…

7.20 ARM-A7核心三盏LED灯

思维导图 汇编代码&#xff1a; .text .global _start _start: /**********LED1点灯**************/ RCC_INIT_E:ldr r0,0x50000A28ldr r1,[r0]orr r1,r1,#(0x1 << 4)str r1,[r0]RCC_INIT_F:ldr r0,0x50000A28ldr r1,[r0]orr r1,r1,#(0x1 << 5)str r1,[r0]LED_INI…

SAP 后台作业简单介绍 job

主要事务代码&#xff1a;SM36、SM37 作业设置 1. 一般数据&#xff1a;作业名称&#xff0c;优先级&#xff0c;目标服务器 优先级适用于资源受限情况&#xff0c;目标服务器适用于服务器环境依赖的程序&#xff0c;比如操作服务器文件等类似的处理 2. 开始条件&#xff0c;…

LRU页面置换算法(C语言实现)

1、实验目的 &#xff08;1&#xff09;熟悉虚拟存储器页面置换过程&#xff1b; &#xff08;2&#xff09;通过编写和调试页面置换算法的模拟程序以加深对页面置换算法的理解&#xff1b; &#xff08;3&#xff09;掌握LRU算法的原理&#xff1b; &#xff08;4&#xf…

Ubuntu中安装Vivado软件

文章目录 Ubuntu中安装Vivado加载License修改软件运行权限安装下载器驱动运行Vivado软件连接开发板测试驱动交叉编译器 Ubuntu中安装Vivado 跨系统文件复制的设置在文章Ubuntu 的安装及其设置中已经介绍过了。 在Ubuntu中找到一个需要存放Vivado软件安装包的文件夹&#xff0c…

二分图博弈学习笔记

前言&#xff1a;最近每场训练赛都有博弈题&#xff0c;而且我都被薄纱了。。。真烦 二分图博弈是少有的直接跟图论挂钩的一种博弈模型 一个博弈是二分图博弈应当满足一下条件&#xff1a; 博弈人数为两人&#xff0c;轮流操作 博弈状态转移可以表示成一张二分图 不可访问已…

MySQL 的 crash-safe浅谈

MySql执行流程 MySQL作为当下最流行的开源关系型数据库&#xff0c;有一个很关键和基本的能力&#xff0c;就是必须能够保证数据不会丢。那么在这个能力背后&#xff0c;MySQL是如何设计才能保证不管在什么时间崩溃&#xff0c;恢复后都能保证数据不会丢呢&#xff1f;有哪些…