Reids 的整合 Spring Data Redis使用

news2024/7/6 20:20:36

大家好 , 我是苏麟 , 今天带来强大的Redis .

REmote DIctionary Server(Redis) 是一个由 Salvatore Sanfilippo 写的 key-value 存储系统,是跨平台的非关系型数据库。

Redis 是一个开源的使用 ANSI C 语言编写、遵守 BSD 协议、支持网络、可基于内存、分布式、可选持久性的键值对(Key-Value)存储数据库,并提供多种语言的 API。

Redis 通常被称为数据结构服务器,因为值(value)可以是字符串(String)、哈希(Hash)、列表(list)、集合(sets)和有序集合(sorted sets)等类型。

官方网站 :  雷迪斯 (redis.io)

好用的可视化工具 :  Quickredis 

 下载地址 : QuickRedis 发行版 - Gitee.com

 好用的可视化工具 :  RedisDesktopManager

官方网站 :  https://redisdesktop.com/download

 Spring Data Redis 的使用方式

 

开始使用 :

引入依赖

        <!--springbot 整合 redis-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

Redis配置 端口号默认6379 库默认0

  #redis 配置
  redis:
    port: 6379
    database: 0 
    host: localhost

序列化

/**
 * 序列化 让JDK原生序列化转成JSON
 */
@Configuration
public class RedisConfig {

    @Bean
    @SuppressWarnings("all")
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {

        RedisTemplate<String, Object> objectObjectRedisTemplate = new RedisTemplate<>();
        objectObjectRedisTemplate.setConnectionFactory(redisConnectionFactory);

        //设置KEY 序列化使用 String 字符串
        objectObjectRedisTemplate.setKeySerializer(RedisSerializer.string());
        objectObjectRedisTemplate.setHashKeySerializer(RedisSerializer.string());

        GenericJackson2JsonRedisSerializer jsonRedisSerializer = new GenericJackson2JsonRedisSerializer();

        //设置Value 序列化 格式
        objectObjectRedisTemplate.setValueSerializer(jsonRedisSerializer);
        objectObjectRedisTemplate.setHashValueSerializer(jsonRedisSerializer);

        return objectObjectRedisTemplate;
    }
}

操作


/**
 * 目标 : 在JAVA中操作redis   spring date redis
 * spring date redis 中提供了一个高度封装了的一个类 RedisTemple 针对jedis客户端api进行了分类封装,将同一种类型封装成Operation接口
 * ValueOperation : 简单K-V操作
 * SetOperation : set类型数据操作
 * ZSetOperation : zset类型数据操作
 * HashOperation : Hash类型数据操作
 * ListOperation : List类型数据操作
 */

@SpringBootTest
class ItslRedisApplicationTests {

    @Autowired
    RedisTemplate redisTemplate;

    /**
     * 目标 : 对5中不同类型数据进行操作
     * opsForValue
     * opsForHash
     * opsForList
     * opsForSet
     * opsForZSet
     */


    /**
     * 操作String类型数据
     */
    @Test
    void testString() {

        //set操作
        redisTemplate.opsForValue().set("sl", "sl");

        //get操作
        System.out.println(redisTemplate.opsForValue().get("sl"));

        //setex操作 命令为指定的 key 设置值及其过期时间。
        //如果 key 已经存在, SETEX 命令将会替换旧的值。
        redisTemplate.opsForValue().set("ty", "sl", 100, TimeUnit.SECONDS);

        //setnx操作  命令在指定的 key 不存在时,为 key 设置指定的值。
        Boolean aBoolean = redisTemplate.opsForValue().setIfAbsent("ty", "ty");
        System.out.println(aBoolean);

    }

    /**
     * 目标 : 操作Hash数据类型
     */
    @Test
    void testHash() {
        HashOperations hashOperations = redisTemplate.opsForHash();

        //存值
        hashOperations.put("002", "name", "sl");
        hashOperations.put("002", "age", 20);

        //取值
        System.out.println(hashOperations.get("002", "age"));
        System.out.println(hashOperations.get("002", "name"));


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

        //获得hash结构中的所有值
        List values = hashOperations.values("002");
        for (Object value : values) {
            System.out.println(value);
        }
    }

    /**
     * 目标 : 操作List数据类型
     */
    @Test
    void testList() {
        ListOperations listOperations = redisTemplate.opsForList();

        //存值
        listOperations.leftPush("ykList", "a");
        listOperations.leftPushAll("ykList", "s", "b", "s", "t");

        //取值
        List ykList = listOperations.range("ykList", 0, -1);
        for (Object o : ykList) {
            System.out.println(o);
        }

        //获取长度
        int size = ykList.size();
        for (int i = 0; i < size; i++) {
            //出队
            Object ykList1 = listOperations.rightPop("ykList");
            System.out.println("出队的是 : " + ykList1);
        }
    }

    /**
     * 目标 : 操作Set数据类型
     */
    @Test
    void testSet() {
        SetOperations setOperations = redisTemplate.opsForSet();

        //存值
        setOperations.add("ty", "a", "b", "v", "b");

        //取值
        Set ty = setOperations.members("ty");
        for (Object o : ty) {
            System.out.println("删除前 : " + o);
        }

        //删除成员
        setOperations.remove("ty", "a");

        //取值
        Set tys = setOperations.members("ty");
        for (Object o : tys) {
            System.out.println("删除后  : " + o);
        }
    }

    /**
     * 目标 : 操作ZSet数据类型
     */
    @Test
    void testZSet() {
        ZSetOperations zSetOperations = redisTemplate.opsForZSet();

        //存值
        zSetOperations.add("myZset", "a", 10.1);
        zSetOperations.add("myZset", "b", 11.1);
        zSetOperations.add("myZset", "c", 12.1);
        zSetOperations.add("myZset", "d", 13.1);

        //取值
        Set myZset = zSetOperations.range("myZset", 0, -1);
        for (Object o : myZset) {
            System.out.println("删除前 : " + o);
        }

        //修改分数
        zSetOperations.incrementScore("myZset", "d", 25.4);

        //删除成员
        zSetOperations.remove("myZset", "a", "b");

        //取值
        Set myZsets = zSetOperations.range("myZset", 0, -1);
        for (Object os : myZsets) {
            System.out.println("删除后  : " + os);
        }
    }


    /**
     * 目标 : 通用操作
     */
    @Test
    void testCommon() {

        //获取Redis中所有的key
        Set<String> keys = redisTemplate.keys("*");
        for (String key : keys) {
            System.out.println(key);
        }

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

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

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

    }
}

使用小技巧 : 

登录态自动存储Redis中

开发中一个小用处 在分布式登录的时候用Seesion保存登录态 实现共享存储

第一步 :

引入依赖

        <!--spring-session 整合 redis -->
        <dependency>
            <groupId>org.springframework.session</groupId>
            <artifactId>spring-session-data-redis</artifactId>
        </dependency>

第二步 : 

在yml中配置

spring:
 session:
   #存储时间 86400 二个月
   timeout: 86400
   #自动存储到reids
   store-type: redis

这样就完成自动存储到Redis中!

这期就到这里下期再见 !

拜拜!

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

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

相关文章

如何使用CSS实现一个拖拽排序效果?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 实现拖拽排序效果的CSS和JavaScript示例⭐ HTML 结构⭐ CSS 样式 (styles.css)⭐ JavaScript 代码 (script.js)⭐ 实现说明⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦…

【HCIP】02.MSTP

运行RSTP/STP&#xff0c;局域网内所有的VLAN共享一棵生成树&#xff0c;被阻塞后的链路将不承载任何流量&#xff0c;无法在VLAN间实现数据流量的负载均衡&#xff0c;导致链路带宽利用率、设备资源利用率较低。802.1S,MSTP兼容STP和RSTP&#xff0c;通过建立多棵无环路的树&a…

论文及代码详解——HRNet

文章目录 论文详解 &#xff08;High-Resolution Networks&#xff09;Parallel Multi-Resolution ConvolutionsRepeated Multi-Resolution FusionsRepresentation Head 代码详解 论文&#xff1a;《Deep High-Resolution Representation Learning for Visual Recognition》 代…

MySQL报错:Incorrect integer value: ‘None‘ for column ‘managerId‘ at row 1

错误如下&#xff1a; 今天在建表的时候突然报错 上网查询了原因&#xff0c;把None改成NULL就行了。 5以上的版本如果是空值应该要写NULL&#xff0c;这种问题一般mysql 5.x上出现。 改完后就运行正常了

07 mysql5.6.x docker 启动, 无 config 目录导致客户端连接认证需要 10s

前言 呵呵 最近再一次 环境部署的过程中碰到了这样的一个问题 我基于 docker 启动了一个 mysql 服务, 然后 挂载出了 数据目录 和 配置目录, 没有手动复制配置目录出来, 所以配置目录是空的 然后 我基于 docker 启动了一个 nacos, 配置数据库设置为上面的这个 mysql 然后 启…

【2023年11月第四版教材】《第6章-项目管理概论》(第二部分)

《第6章-项目管理概论》&#xff08;第二部分&#xff09; 3 项目经理的角色3.1 项目经理的影响力范围3.2 项目经理领导力风格 4 价值驱动的项目管理知识体系4.1 开发生命周期类型 5 五大过程组6 五个过程组和十大知识领域 3 项目经理的角色 3.1 项目经理的影响力范围 范围影…

从业务层的代码出发,去排查通用框架代码崩溃的问题

目录 1、问题说明 1.1、Release下崩溃&#xff0c;Debug下很难复现 1.2、用Windbg打开dump文件&#xff0c;发现崩溃在通用的框架代码中 2、进一步分析 2.1、使用IDA查看汇编代码尝试寻找崩溃的线索 2.2、在Windbg中查看相关变量的值 2.3、查看最近代码的修改记录&#…

渗透和红队快速打点工具

&#x1f525; POC-bomber &#x1f984; POC bomber 是一款漏洞检测/利用工具&#xff0c;旨在利用大量高危害漏洞的POC/EXP快速获取目标服务器权限 本项目收集互联网各种危害性大的 RCE 任意文件上传 反序列化 sql注入 等高危害且能够获取到服务器核心权限的漏洞POC/EXP…

【C++STL基础入门】深入浅出string类的比较(compare)、复制(copy)

文章目录 前言一、比较1.比较运算符2.compare函数 二、复制1.copy函数 总结 前言 本系列STL使用VS2022C20版本 在C标准库中&#xff0c;string类是一个功能强大的字符串处理类&#xff0c;提供了丰富的操作函数。本文将详细介绍string类的比较、复制、查找字串、返回字串、交…

d3dx9_43.dll如何修复?找不到d3dx9_43.dll怎么办

d3dx9_43.dll文件通常与DirectX 9运行时库一起安装在用户的计算机上。当用户运行需要DirectX 9支持的应用程序时&#xff0c;操作系统会自动加载d3dx9_43.dll文件&#xff0c;并提供所需的功能。如果缺少或损坏了该文件&#xff0c;用户可能会遇到无法运行应用程序、崩溃或显示…

如何使用CSS实现一个全屏滚动效果(Fullpage Scroll)?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 实现全屏滚动效果的CSS和JavaScript示例⭐ HTML 结构⭐ CSS 样式 (styles.css)⭐ JavaScript 代码 (script.js)⭐ 实现说明⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦…

深入理解Linux内核--Ext2和Ext3文件系统

Ext2的一般特征 类Unix操作系统使用多种文件系统。尽管所有这些文件系统都有少数POSIX API(如state())所需的共同的属性子集&#xff0c;但每种文件系统的实现方式是不同的。 Linux的第一个版本是基于MINIX文件系统的。当Linux成熟时&#xff0c;引入了扩展文件系统(Extended …

深入理解CAS和Atomic工具类

CAS CAS&#xff08;Compare And Swap&#xff0c;比较交换&#xff09;指的是对于一个变量&#xff0c;比较它的内存的值与期望值是否相同&#xff0c;如果相同则将内存值修改为新的指定的值。即CAS包括两个步骤&#xff1a;1.比较内存值与期望值是否相同&#xff1b;2.相同则…

【校招VIP】前端基础之post和get

考点介绍&#xff1a; get和post 是网络基础&#xff0c;也是每个前端同学绕不过去的小问题&#xff0c;但是在校招面试中很多同学在基础回答中不到位&#xff0c;或者倒在引申问题里&#xff0c;就丢分了。 『前端基础之post和get』相关题目及解析内容可点击文章末尾链接查看…

7个改变玩法规则的ChatGPT应用场景

ChatGPT因各种原因受到了广泛关注&#xff1a;ChatGPT可以充当各种改善生活改进工作的小助手&#xff0c;如内容写手、客户支持、语言翻译、编码专家等等。只需在你的聊天内容中添加适当的提示&#xff0c;人工智能将为你提供各项支持。[1] 1.ChatGPT作为内容写手 通过AI的帮助…

《Linux从练气到飞升》No.16 Linux 进程地址空间

&#x1f57a;作者&#xff1a; 主页 我的专栏C语言从0到1探秘C数据结构从0到1探秘Linux菜鸟刷题集 &#x1f618;欢迎关注&#xff1a;&#x1f44d;点赞&#x1f64c;收藏✍️留言 &#x1f3c7;码字不易&#xff0c;你的&#x1f44d;点赞&#x1f64c;收藏❤️关注对我真的…

掌握AI助手的魔法工具:解密Prompt(提示)在AIGC时代的应用「上篇」

在当今的AIGC时代&#xff0c;我们面临着越来越多的人工智能技术和应用。其中一个引人注目的工具就是Prompt&#xff08;提示&#xff09;。它就像是一种魔法&#xff0c;可以让我们与AI助手进行更加互动和有针对性的对话。那么&#xff0c;让我们一起来了解一下Prompt&#xf…

QA

1. 这是什么意思&#xff1f; label_viz[:,:,::-1] 这段代码看起来像是Python中处理图像的代码片段。让我来为您解释一下&#xff1a; 1. label_viz&#xff1a;这可能是一个二维数组&#xff08;通常是NumPy数组&#xff09;&#xff0c;代表图像上的标签或类别信息的可视化…

线程面试题-1

看的博客里面总结的线程的八股文 1、线程安全的集合有哪些&#xff1f;线程不安全的呢&#xff1f; 线程安全的&#xff1a; Hashtable&#xff1a;比HashMap多了个线程安全。 ConcurrentHashMap:是一种高效但是线程安全的集合。 Vector&#xff1a;比Arraylist多了个同步化…

Ubuntu本地快速搭建web小游戏网站,并使用内网穿透将其发布到公网上

文章目录 前言1. 本地环境服务搭建2. 局域网测试访问3. 内网穿透3.1 ubuntu本地安装cpolar内网穿透3.2 创建隧道3.3 测试公网访问 4. 配置固定二级子域名4.1 保留一个二级子域名4.2 配置二级子域名4.3 测试访问公网固定二级子域名 前言 网&#xff1a;我们通常说的是互联网&am…