SpringBoot Data Redis来操作Redis

news2024/11/25 11:36:19

SpringBoot Data Redis来操作Redis

  • 1、Redis启动
    • Redis主要的作用
    • 安装的位置
    • 启动
  • 2、Java中来操作Redis
  • 3、Spring Data Redis(重点)
    • 测试连接
    • 配置Redis序列化器
    • redisTemplate操作常见数据类型
    • 通用操作,针对不同的数据类型都可以操作

申明: 未经许可,禁止以任何形式转载,若要引用,请标注链接地址。 全文共计4277字,阅读大概需要1分钟
更多学习内容, 欢迎关注我的个人公众号:不懂开发的程序猿

1、Redis启动

Redis主要的作用

配合关系型数据库做高速缓存

多样的数据结构存储持久化数据

安装的位置

CentOS 7

启动

启动redis

cd /usr/local/bin
redis-server /etc/redis.conf
ps -ef | grep redis

关闭redis

redis-cli shutdown

进入客户端

redis-cli

测试连接
进入客户端后输入:

ping

2、Java中来操作Redis

<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
@Test
public void testRedis(){
    // 1、获取连接
    Jedis jedis = new Jedis("192.168.10.129", 6379);

    // 2、执行具体操作
    //添加一个[key, value]
    jedis.set("username", "张三");

    // 获取value
    String username = jedis.get("username");
    System.out.println("username = " + username);

    //删除
    jedis.del("username");
    System.out.println("username = " + username);

    // 存hashset
    jedis.hset("myhashset", "addr","beijing");
    String hget = jedis.hget("myhashset", "addr");
    System.out.println("hget = " + hget);

    // 3、关闭连接
    jedis.close();
}

3、Spring Data Redis(重点)

pom

<!--开启redis缓存-->
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

application.yaml

spring:
  redis:
    host: 192.168.10.129
#    port: 6379 #不写就是默认端口号6379
#    database: 0 #操作的是0号数据库,不写就是默认的

RedisTemplate

在这里插入图片描述

测试连接

package com.jerry.springdataredis;

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;

@SpringBootTest
class SpringdataredisApplicationTests {

    @Autowired
    RedisTemplate redisTemplate;

    @Test
    void testString() {
        redisTemplate.opsForValue().set("city","beijing");

    }

}

查看redis数据库会发现有[key, values]前面有一堆转义字符,是因为默认的RedisTemplate 进行了序列化操作

在这里插入图片描述

配置Redis序列化器

要想解决此问题,就需要我们手动添加配置类,设置我们自己的序列化器

package com.jerry.springdataredis.config;

import org.springframework.cache.annotation.CachingConfigurerSupport;
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;

@Configuration
public class RedisConfig extends CachingConfigurerSupport {

    @Bean
    public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
        RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();

        //默认的Key序列化器为:JdkSerializationRedisSerializer
        redisTemplate.setKeySerializer(new StringRedisSerializer()); // key序列化
        //redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer()); // value序列化
        redisTemplate.setHashKeySerializer(new StringRedisSerializer()); // hash序列化

        redisTemplate.setConnectionFactory(connectionFactory);
        return redisTemplate;
    }
}

在这里插入图片描述

在这里插入图片描述

redisTemplate操作常见数据类型

package com.jerry.springdataredis;

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;

import java.util.List;
import java.util.Set;
import java.util.concurrent.TimeUnit;

@SpringBootTest
class SpringdataredisApplicationTests {

    @Autowired
    RedisTemplate redisTemplate;

    /**
     * 操作 String 类型的数据
     */
    @Test
    void testString() {
        redisTemplate.opsForValue().set("city123","beijing123");

        Object o = redisTemplate.opsForValue().get("city123");
        System.out.println("o = " + o);

        redisTemplate.opsForValue().set("k1", "v1", 10L, TimeUnit.SECONDS);

        Boolean aBoolean = redisTemplate.opsForValue().setIfAbsent("k1", "v1");
        System.out.println("aBoolean = " + aBoolean);

    }

    /**
     * 操作 Hash 类型的数据
     */
    @Test
    void testHash(){
        // 存值
        redisTemplate.opsForHash().put("001", "name", "xiaoming");
        redisTemplate.opsForHash().put("001", "age", "20");
        redisTemplate.opsForHash().put("001", "city", "Shanghai");

        // 取值
        String name = (String) redisTemplate.opsForHash().get("001", "name");
        System.out.println("name = " + name);

        // 获取hash结构中的所有字段
        Set keys = redisTemplate.opsForHash().keys("001");
        for (Object key : keys) {
            System.out.println(key);
        }

        // 获取hash结构中的所有值
        List values = redisTemplate.opsForHash().values("001");
        for (Object value : values) {
            System.out.println(value);
        }
    }

    /**
     * 操作 List 类型的数据(有序集合)
     */
    @Test
    void testList(){
        // 存值
        redisTemplate.opsForList().leftPush("myList", "a");
        redisTemplate.opsForList().leftPushAll("myList", "b","c","d");

        // 取值
        List<String> myList = redisTemplate.opsForList().range("myList", 0, -1);
        for (String value : myList) {
            System.out.println(value); // d c b a
        }

        // 获取列表长度
        Long size = redisTemplate.opsForList().size("myList");
        int isize = size.intValue();

        for (int i = 0; i < isize; i++) {
            // 出队列
            String element = (String) redisTemplate.opsForList().rightPop("myList");
            System.out.println(element); // a b c d
        }

    }

    /**
     * 操作set类型数据(无序集合,可以重复)
     */
    @Test
    void testSet(){
        // 存值, 可以有重复的元素
        redisTemplate.opsForSet().add("mySet","a","b","c","a","b");

        // 取值
        Set<String> mySet = redisTemplate.opsForSet().members("mySet");
        for (String s : mySet) {
            System.out.println(s); // c b a
        }
        // 删除元素
        redisTemplate.opsForSet().remove("mySet", "a","b");
    }


    /**
     * 操作 ZSet 类型数据(有序集合,按分数大小排序)
     */
    @Test
    void testZSet(){
        // 存值, 不能有重复的元素
        redisTemplate.opsForZSet().add("myZSet", "a", 10.0);
        redisTemplate.opsForZSet().add("myZSet", "b", 11.0);
        redisTemplate.opsForZSet().add("myZSet", "c", 12.0);
        redisTemplate.opsForZSet().add("myZSet", "a", 13.0);

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

        // 修改分数
        redisTemplate.opsForZSet().incrementScore("myZSet", "b", 20.0);

        myZSet = redisTemplate.opsForZSet().range("myZSet", 0, -1);
        for (String s : myZSet) {
            System.out.println(s); // c a b
        }
        System.out.println();

        // 删除元素
        redisTemplate.opsForZSet().remove("myZSet", "a","b");

        myZSet = redisTemplate.opsForZSet().range("myZSet", 0, -1);
        for (String s : myZSet) {
            System.out.println(s); // c
        }
    }
}

通用操作,针对不同的数据类型都可以操作

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

    // 判断指定key 是否存在
    Boolean hasKey = redisTemplate.hasKey("jerry");
    System.out.println("hasKey = " + hasKey);

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

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

–end–

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

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

相关文章

浅谈Springboot自动化配置原理

文章目录1.前言2.SpringBoot的入口3.SpringBootApplication背后的秘密4.Configuration5.ComponentScan扫描bean6.EnableAutoConfiguration7.自动配置生效1.前言 不论在工作中&#xff0c;亦或是求职面试&#xff0c;Spring Boot已经成为我们必知必会的技能项。除了某些老旧的政…

java面试题-JUC线程池

1.FutureTask的作用?FutureTask 是 Java 并发编程中的一个类&#xff0c;用于异步执行任务并获取其结果。它实现了 Future 和 Runnable 接口&#xff0c;因此可以作为一个可运行的任务提交给 Executor 执行&#xff0c;也可以通过 Future 接口获取任务执行的结果。FutureTask …

2023年DAMA-CDGA/CDGP数据治理认证选择哪家机构好?

DAMA认证为数据管理专业人士提供职业目标晋升规划&#xff0c;彰显了职业发展里程碑及发展阶梯定义&#xff0c;帮助数据管理从业人士获得企业数字化转型战略下的必备职业能力&#xff0c;促进开展工作实践应用及实际问题解决&#xff0c;形成企业所需的新数字经济下的核心职业…

将整数数组变为浮点型数组的np.asfarray()方法

【小白从小学Python、C、Java】 【计算机等级考试500强双证书】 【Python-数据分析】 将整数数组转换为浮点型数组 np.asfarray() 选择题 关于以下代码说法错误的一项是? import numpy as np a1 np.array([1,2,3]) print("【显示】a1",a1) print("【执行】a…

网络工程(一) 简单的配置

网络工程 简单的配置 需求 两台交换机 两台路由器 两台PC AR1配置静态路由 system-view [HUAWEI]sysname ar1 [ar1]interface g 0/0/0 [ar1-G…0/0/0]ip address 192.168.2.1 24 [ar1-G…0/0/0]quit [ar1]interface g 0/0/1 [ar1-G…0/0/1]ip address 192.168.3.1 24 [ar1-G…

关于学习git时的一些疑惑与笔记

关于学习git时的一些疑惑与笔记SSH相关问题SSH是什么&#xff1f;SSH有什么作用&#xff1f;如何在github配置SSH?分支什么是本地分支&#xff0c;远程分支&#xff1f;main主分支与master主支&#xff1f;为什么要把master分支修改为main分支&#xff1f;什么时候用分支&…

Java线程——常见方法

一、 常见方法 1.1 概述 ① start_vs_run&#xff1a;直接调用run方法并不会启动新的线程 import cn.itcast.n2.util.FileReader; import lombok.extern.slf4j.Slf4j;Slf4j(topic "c.Test") public class Test {public static void main(String[] args) {Thread t…

【网络安全】Windows系统安全实验

第3模块 Windows操作系统安全部分 3.1 帐户和口令的安全设置 3.1.1 实验目的 本章实验的目的主要是熟悉Windows操作系统中帐户和口令的安全设置&#xff0c;掌握删除、禁用帐户的方法&#xff0c;了解并启用密码策略和用户锁定策略&#xff0c;体验查看“用户权限分配”、…

如何在Linux环境下用VI编辑器写C程序编译C程序运行C程序

我是荔园微风&#xff0c;作为一名在IT界整整25年的老兵&#xff0c;今天我们来重点说一说如何在Linux环境下用VI编辑器写C程序编译C程序运行C程序。相信大家在Windows环境下写C程序编译C程序运行C程序怎么弄都已经很清楚了&#xff0c;现在我们来看在Linux下如果来做&#xff…

Vue 在for循环中动态添加类名及style样式集合

介绍 在vue的 for 循环中&#xff0c;经常会使用到动态添加类名或者样式的情况&#xff0c;实现给当前的选中的 div 添加不同的样式。 动态添加类名 提示&#xff1a; 所有动态添加的类名&#xff0c;放在表达式里都需要添加引号&#xff0c;进行包裹。 通过 对象 的形式&a…

Git ---- Git 分支操作

Git ---- Git 分支操作1. 什么是分支2. 分支的好处3. 分支的操作1. 查看分支2. 创建分支3. 修改分支4. 切换分支5. 合并分支5. 产生冲突4. 创建分支和切换分支图解1. 什么是分支 在版本控制过程中&#xff0c;同时推进多个任务&#xff0c;为每个任务&#xff0c;我们就可以创…

【已解决】安装cv2时Building wheel for opencv-python终端卡死

目录1 问题背景2 问题探索3 问题解决4 告别Bug1 问题背景 环境&#xff1a; Ubuntu20.04Python3.6 现象&#xff1a;终端输出类似下面的命令&#xff0c;并卡住不动 Building wheel for opencv-python (PEP 517) ... 2 问题探索 首先&#xff0c;OpenCV较旧的Python版本不需要…

什么是自动化运维?为什么选择Python做自动化运维?

“Python自动化运维”这个词&#xff0c;想必大家都听说过&#xff0c;但是很多人对它并不了解&#xff0c;也不知道是做什么的&#xff0c;那么你对Python自动化运维了解多少呢?跟着蛋糕往下看。 什么是Python自动化运维? 随着技术的进步、业务需求的快速增长&#xff0c;…

网友爆料奇葩leader:日报要精确到0.5小时,每晚检查!每周写周计划,评审ABCD等级,午休不许刷手机、看视频、玩游戏!...

这样的leader你能接受吗&#xff1f;一位网友吐槽&#xff1a;一个团队6个人&#xff0c;加上leader一共7个人。leader要求每天写日报&#xff0c;并且要精确到0.5小时&#xff0c;格式必须正确&#xff0c;每天晚上都看&#xff0c;下班后各种问进度。每周一要写周计划&#x…

IM即时通讯构建企业协同生态链

在当今互联网信息飞速发展的时代&#xff0c;随着企业对协同办公要求的提高&#xff0c;协同办公的定义提升到了智能化办公的范畴。大多企业都非常重视构建连接用户、员工和合作伙伴的生态平台&#xff0c;利用即时通讯软件解决企业内部的工作沟通、信息传递和知识共享等问题。…

Pytorch 网络结构的可视化

在构建网络的过程中&#xff0c;需要查看网络结构&#xff0c;以便于优化&#xff0c;使用Pytorch常用的可视化工具有 1.Hidden layer myNet U_Net() print(myNet)# ## 可视化卷积神经网络,MyConvnet是定义的神经网络结构 hl_graph hl.build_graph(myNet, torch.zeros([1, 3…

国产蓝牙耳机哪个好用?国产好用的蓝牙耳机推荐

现如今&#xff0c;国产蓝牙耳机越来越受到人们关注&#xff0c;国产蓝牙耳机近几年的发展愈发迅猛&#xff0c;配置上相对于非国产蓝牙耳机来说也毫不逊色。那么&#xff0c;国产蓝牙耳机哪个好用&#xff1f;下面&#xff0c;我来给大家推荐几款好用的蓝牙耳机&#xff0c;一…

电脑应用程序在c盘怎么转移到d盘?建议先收藏

电脑应用程序在c盘怎么转移到d盘&#xff1f;很多小伙伴第一反应就是直接剪切&#xff0c;这种方法对于普通文件来说很简单、也很方便&#xff0c;只需执行CtrlX就能办到&#xff0c;然而对于已安装的应用程序&#xff0c;这并不是明智的做法。因为直接剪切粘贴后&#xff0c;应…

【概念辨析】二维数组传参的集中可能性

一、二维数组传参竟然不是用二级指针进行接收&#xff1f; 今天进行再一次的二级指针学习时&#xff0c;发现了一条以前没怎么注意过的知识点&#xff1a;二维数组进行传参只能用二维数组&#xff08;不能省略列&#xff09;进行接收或者是数组指针。 问题复现代码如下&#xf…

ChatGPT 编写模式:如何高效地将思维框架赋予 AI ?

如何理解 Prompt &#xff1f;Prompt Enginneeringprompt 通常指的是一个输入的文本段落或短语&#xff0c;作为生成模型输出的起点或引导。prompt 可以是一个问题、一段文字描述、一段对话或任何形式的文本输入&#xff0c;模型会基于 prompt 所提供的上下文和语义信息&#x…