spring boot+redis整合基础入门

文章目录

  • 前言
  • 准备
    • 依赖项
    • 配置文件
    • redis模板类注入设置序列化方式
  • 实施
    • 基础字符串操作、超时设置
    • Hash操作
      • hash的使用场景以及优缺点
    • 列表操作
      • 列表操作的应用场景以及优缺点
    • Set的基础操作
      • Set类型的业务场景以及优缺点
      • Demo地址
  • 总结

前言

最近项目中有用到redis进行一些数据的缓存,于是就想写一篇springboot集成redis的基础入门,也是给自己留一个可查看的地方,时刻能够提醒自己吧,后续应该会写一下进阶的redis的使用

准备

准备上redis的服务,以及搭建一个springboot项目框架,引入依赖

依赖项

		<!--redis的依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency>

配置文件

spring:redis:host: localhostport: 6379lettuce:timeout: 5000 #(连接超时时间,单位为毫秒)database: 1#   集群配置
#    spring:
#      redis:
#        password: 123456  #根据情况而定,看你的redis有没有密码设置
#        cluster:
#          nodes: 10.255.144.115:7001,10.255.144.115:7002,10.255.144.115:7003,10.255.144.115:7004,10.255.144.115:7005,10.255.144.115:7006
#          max-redirects: 3# 连接池方式
#spring:
#  redis:
#    host: 10.255.144.111
#    port: 6379
#    password: 123456
#    database: 0
#    lettuce:
#      pool:
#        max-idle: 16
#        max-active: 32
#        min-idle: 8

redis模板类注入设置序列化方式

    @Beanpublic RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {// 我们为了自己开发方便,一般直接使用 <String, Object>RedisTemplate<String, Object> template = new RedisTemplate<String, Object>();template.setConnectionFactory(connectionFactory);// Json序列化配置Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);ObjectMapper om = new ObjectMapper();om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);jackson2JsonRedisSerializer.setObjectMapper(om);// String 的序列化StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();// key采用String的序列化方式template.setKeySerializer(stringRedisSerializer);// hash的key也采用String的序列化方式template.setHashKeySerializer(stringRedisSerializer);// value序列化方式采用jacksontemplate.setValueSerializer(jackson2JsonRedisSerializer);// hash的value序列化方式采用jacksontemplate.setHashValueSerializer(jackson2JsonRedisSerializer);template.afterPropertiesSet();return template;}

实施

基础字符串操作、超时设置

  //String 插入@Testvoid contextLoads() {String key = "zszxz";String value = "知识追寻者";redisTemplate.opsForValue().set(key, value);}// string 读取@Testpublic void testForValue(){String key = "zszxz";Object value = redisTemplate.opsForValue().get(key);// 知识追寻者System.out.println(value);}// string key过期时间入库@Testpublic void testForValueTimeOut(){String key = "today";String value = "周六";long time = 60;redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS);}// 测试 key 是否存在@Testpublic void testKeyIsExist(){String key = "zszxz";Boolean exist = redisTemplate.hasKey(key);// trueSystem.out.println(exist);}// 设置 key 过期时间@Testpublic void testIsTimeOut(){String key = "zszxz";long time = 60;redisTemplate.expire(key, time, TimeUnit.SECONDS);}// 获取key过期时间@Testpublic void testGetKeyTimeOut(){String key = "zszxz";Long expire = redisTemplate.getExpire(key, TimeUnit.SECONDS);// 7System.out.println(expire);}// 删除key@Testpublic void testDeleteKey(){String key = "zszxz";redisTemplate.delete(key);}

Hash操作

   // 放入一个 hash ( key value )@Testpublic void testPushHash(){String key = "zszxz";String item = "name";String value = "知识追寻者";redisTemplate.opsForHash().put(key, item, value);}// 向hash中存放一个map@Testpublic void testPushMap(){String key = "feature";Map<String, Object> map = new HashMap<>();map.put("name", "知识追寻者");map.put("age", "18");redisTemplate.opsForHash().putAll(key, map);}// 获取一个hash 的 所有key-value@Testpublic void testGekHashAllData(){String key = "feature";Map<Object, Object> entries = redisTemplate.opsForHash().entries(key);// {name=知识追寻者, age=18}System.out.println(entries);}// 获取一个hash 的 指定key 的value@Testpublic void testGetHashByKey(){String key = "feature";String item = "name";Object value = redisTemplate.opsForHash().get(key, item);// 知识追寻者System.out.println(value);}// 删除指定 hash key 的value@Testpublic void testDeleteHashByKey(){String key = "zszxz";String item = "name";redisTemplate.opsForHash().delete(key, item);}// 是否存在 指定 hash 的key@Testpublic void testIsHashKeyExist(){String key = "zszxz";String item = "name";Boolean exist = redisTemplate.opsForHash().hasKey(key, item);// falseSystem.out.println(exist);}

hash的使用场景以及优缺点

Redis 中的 Hash 数据类型适用于以下业务场景:

  1. 对象存储:当需要存储和访问复杂对象时,可以将对象的属性作为 Hash 的字段,字段值作为对应属性的值。这样可以将一个完整对象存储在一个 Hash 中,方便操作和管理。

  2. 缓存场景:在缓存中存储一些结构化的数据,例如用户信息、配置项等。通过 Hash 可以有效地组织和管理这些数据,减少缓存键的数量,提高查询效率。

  3. 统计和计数器:使用 Hash 可以方便地存储和更新统计数据和计数器,例如网站的访问次数、文章的点赞数等。通过 Hash 提供的自增和自减操作,可以高效地实现计数功能。

  4. 表示关系:在需要表示关系的场景中,可以将关联关系存储为 Hash 的字段,字段值表示关系的描述或其他附加信息。这样可以清晰地表示不同实体之间的关系。

Hash 的优点包括:

  • 结构清晰:Hash 存储的数据结构清晰,字段名和字段值之间有明确的映射关系,方便理解和操作。
  • 灵活性高:Hash 可以存储不同类型的字段和值,支持各种复杂的数据结构和对象存储需求。
  • 查询效率高:通过字段名直接访问字段值,查询操作的时间复杂度为 O(1)。

Hash 的缺点包括:

  • 存储空间占用相对较高:由于每个 Hash 对象都需要存储字段名和字段值的映射关系,因此占用的存储空间较多。
  • 不支持单字段更新:当需要更新 Hash 中的某一个字段时,需要先获取整个 Hash 对象并进行修改,然后再写回数据库。
  • 不适用于大规模数据存储:当 Hash 中的字段数量很多时,操作和维护都会变得复杂,不适合存储大规模的数据。

列表操作

// 列表右推入
@Test
public void testRightPush(){String key = "zszxz";String value = "知识追寻者";redisTemplate.opsForList().rightPush(key, value);
}// 列表左推入
@Test
public void testLeftPush(){String key = "zszxz";String value = "晴雨天";redisTemplate.opsForList().leftPush(key, value);
}
// 列表左弹出
@Test
public void testLeftPop(){String key = "zszxz";Object value = redisTemplate.opsForList().leftPop(key);// 晴雨天System.out.println(value);}
// 列表右弹出
@Test
public void testRightPop(){String key = "zszxz";Object value = redisTemplate.opsForList().rightPop(key);// 知识追寻者System.out.println(value);
}// 将list右推入列表
@Test
public void testListRightPushAll(){List<Object> list = new ArrayList<>();list.add(12);list.add(22);list.add(32);String key = "number";redisTemplate.opsForList().rightPushAll(key, list);//根据key获取key对应的集合信息List<Object> listValue = redisTemplate.opsForList().range(key, 0, -1);for (Object o:listValue)System.out.println(o);
}// 修改列表指定索引的值
@Test
public void testUpdateByIndex(){String key = "number";int index = 0;int value = 666;redisTemplate.opsForList().set(key, index, value);
}
// 获取列表指定索引的值
@Test
public void testByIndex(){String key = "number";int index = 0;Object value = redisTemplate.opsForList().index(key, index);// 666System.out.println(value);
}

列表操作的应用场景以及优缺点

Redis 中的列表数据类型适用于以下业务场景:

  1. 消息队列:通过列表实现消息队列,将任务或消息存储在列表尾部,消费者从列表头部获取任务或消息并进行处理。由于 Redis 提供了多种阻塞式读取列表的方法,因此可以实现高效的异步任务处理和发布订阅功能。

  2. 实时排名:通过列表存储用户访问次数、商品销量等排名信息,使用 Redis 提供的自增和排序操作可以快速地更新和查询排名数据。

  3. 时间轴:通过列表存储和查询时间轴上的事件数据,例如聊天室中的历史消息、微博中的动态等。通过 Redis 提供的切片操作,可以实现按照时间范围查询数据和分页显示等功能。

  4. 历史记录:通过列表存储用户的搜索记录、浏览记录等历史数据,并可以通过 Redis 提供的去重、分页等操作进行查询和展示。

列表的优点包括:

  • 可以方便地支持队列、栈等多种数据结构。
  • 可以支持快速的随机访问和遍历操作。
  • 无须预先定义长度,支持动态增长和缩容。
  • 支持多种操作,如插入、删除、修剪、合并、排序、查询等。

列表的缺点包括:

  • 在插入和删除操作频繁的场景中,列表的性能可能会有影响。
  • 在查询和遍历大型列表时,需要消耗大量内存和网络资源。
  • 列表数据无法持久化到磁盘中,重启后数据将被清空。

Set的基础操作

    // set 中存储值@Testpublic void testSetPush(){String key = "zszxz";String value1 = "晴雨天";String value2 = "公众号:知识追寻者";redisTemplate.opsForSet().add(key, value1, value2);}// 从 set 中取值@Testpublic void testGetValue(){String key = "zszxz";Set<Object> members = redisTemplate.opsForSet().members(key);// [晴雨天, 公众号:知识追寻者]System.out.println(members);}// 判定 set 中是否存在 key-value@Testpublic void testSetIsExist(){String key = "zszxz";String value = "晴雨天";Boolean member = redisTemplate.opsForSet().isMember(key, value);// trueSystem.out.println(member);}

Set类型的业务场景以及优缺点

Redis 中的集合数据类型(Set)适用于以下业务场景:

  1. 标签和分类:使用集合可以方便地管理标签或分类信息。每个元素表示一个标签或分类,可以进行添加、删除、查询等操作,同时还可以计算交集、并集、差集等集合运算。

  2. 好友关系:通过集合可以表示用户之间的好友关系。每个集合表示一个用户的好友列表,可以使用集合操作来实现添加好友、查找共同好友、推荐好友等功能。

  3. 去重:集合中的元素是唯一的,因此可以用于对数据进行去重操作。将需要去重的数据存储在集合中,可以方便地去除重复数据并保留唯一值。

  4. 兴趣爱好:使用集合可以表示用户的兴趣爱好。每个集合表示一个用户的兴趣集合,可以进行集合运算来计算用户之间的相似度或偏好匹配。

集合的优点包括:

  • 支持快速的元素查找和判断是否存在。
  • 提供了多种集合操作,如并集、交集、差集等,方便对多个集合进行操作和计算。
  • 集合中的元素是唯一的,可以方便地进行去重操作。
  • 集合操作的时间复杂度为 O(n),适用于大规模数据的处理。

集合的缺点包括:

  • 不支持按照特定顺序排序元素。
  • 集合操作的性能随着元素数量增加而降低,当集合中元素过多时,操作可能会变慢。
  • 集合数据无法持久化到磁盘中,重启后数据将被清空。

可以使用RedisDesktopManager查看redis中的存储情况
在这里插入图片描述

Demo地址

总结

对于redis的简单使用springboot已经帮助我们做了集成,给我们封装了很多的api,只要借助提供的api就可以快速入门,但是到入土还需要一些时间。

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

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

相关文章

导数公式及求导法则

目录 基本初等函数的导数公式 求导法则 有理运算法则 复合函数求导法 隐函数求导法 反函数求导法 参数方程求导法 对数求导法 基本初等函数的导数公式 基本初等函数的导数公式包括&#xff1a; C0(x^n)nx^(n-1)(a^x)a^x*lna(e^x)e^x(loga(x))1/(xlna)(lnx)1/x(sinx)cos…

阿里云服务器配置怎么选择?几核几G?带宽系统盘怎么选?

阿里云服务器配置选择_CPU内存/带宽/存储配置_小白指南&#xff0c;阿里云服务器配置选择方法包括云服务器类型、CPU内存、操作系统、公网带宽、系统盘存储、网络带宽选择、安全配置、监控等&#xff0c;阿小云分享阿里云服务器配置选择方法&#xff0c;选择适合自己的云服务器…

用selenium webdriver获取网站cookie后,实现免登录上网站

以csdn为例&#xff0c;代码分为两部分。 一、csdn_get_cookies.py为半手动登录网站后获取cookies 二、csdn_use_cookies.py为使用获取到的cookies免登录上网站 #获取登录cookiesfrom selenium import webdriver import jsoncsdn_driver webdriver.Chrome() url "htt…

ChatGPT OpenAI 完成Excel组合函数Vlookup+match多条件查找

ChatGPT OpenAI 现在已经助力职场办公。 我们现在有这样一个Excel需求: 根据姓名与科目查找对应的分数。可以使用Vlookup+match组合函数一起来实现 。 我们将公式复制到Excel中来进行验证。 ChatGPT生成的Excel函数公式可以直接进行使用。 更多实战内容。

Android:使用命令行发现keytool不是内部命令解决办法

一、前言&#xff1a;最近在搞引入高德地图的SDK&#xff0c;发现需要给app签名打包。记录一下。 二、当我在命令行中输入keytool的时候说keytool不是内部命令 解决方案&#xff1a; 找到系统属性--------高级----------点击环境变量 双击点开 找到java\jre1.8.0_202\bin新建…

CSS3技巧36:backdrop-filter 背景滤镜

CSS3 有 filter 滤镜属性&#xff0c;能给内容&#xff0c;尤其是图片&#xff0c;添加各种滤镜效果。 filter 滤镜详见博文&#xff1a;CSS3中强大的filter(滤镜)属性_css3滤镜_stones4zd的博客-CSDN博客 后续&#xff0c;CSS3 又新增了 backdrop-filter 背景滤镜。 backdr…

SAP SD之定义装运点OVL2

什么是装运点&#xff1f; 装运点是一个独立的组织实体&#xff0c;其中进行货物的发行和交付处理。 可以为每个订单商品确定一个装运点。 确定装运点取决于以下三个因素&#xff1a; 客户主记录中的运输条款和条件&#xff08;运输屏幕&#xff09;。 例如&#xff0c;公司与…

180B参数的Falcon登顶Hugging Face,vs chatGPT 最好开源大模型使用体验

文章目录 使用地址使用体验test1:简单喜好类问题test2:知识性问题test3:开放性问题test4:中文支持test5:问题时效性test6:学术问题使用地址 https://huggingface.co/spaces/tiiuae/falcon-180b-demo 使用体验 相比Falcon-7b,Falcon-180b拥有1800亿的参数量

程序员面试逻辑题

红白帽子推理 答案&#xff1a; 这个题有点像数学归纳法&#xff0c;就是假设有 A A A和 B B B两个人是黑色的帽子&#xff0c;这样的话第一次开灯&#xff0c; A A A看到 B B B是黑色的&#xff0c;其他人都是白色的&#xff0c;那么 A A A会觉得 B B B是那个黑色的&#xff0…

第28章_瑞萨MCU零基础入门系列教程之基于面向对象的工程结构

本教程基于韦东山百问网出的 DShanMCU-RA6M5开发板 进行编写&#xff0c;需要的同学可以在这里获取&#xff1a; https://item.taobao.com/item.htm?id728461040949 配套资料获取&#xff1a;https://renesas-docs.100ask.net 瑞萨MCU零基础入门系列教程汇总&#xff1a; ht…

c刷题(四)

获得月份天数 获得月份天数_牛客题霸_牛客网 这道题可以用switch case语句解&#xff0c;不过这道题更简单的方法是数组&#xff0c;关键点在于判断是否为闰年。 #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include<assert.h> int year_run(int n) …

算法-27.移除元素-⭐

给你一个数组 nums 和一个值 val&#xff0c;你需要 原地 移除所有数值等于 val 的元素&#xff0c;并返回移除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须仅使用 O(1) 额外空间并 原地 修改输入数组。 元素的顺序可以改变。你不需要考虑数组中超出新长度后面…

【基于Cocos Creator 3.5的赛车游戏】8.引入触摸屏幕事件并简单的控制小车

转载知识星球 | 深度连接铁杆粉丝&#xff0c;运营高品质社群&#xff0c;知识变现的工具 项目地址&#xff1a;赛车小游戏-基于Cocos Creator 3.5版本实现: 课程的源码&#xff0c;基于Cocos Creator 3.5版本实现 上一张您已经对Cocos的坐标系有了了解。这一章我们将让小车能…

【经典小练习】JavaSE—拷贝文件夹

&#x1f38a;专栏【Java小练习】 &#x1f354;喜欢的诗句&#xff1a;天行健&#xff0c;君子以自强不息。 &#x1f386;音乐分享【如愿】 &#x1f384;欢迎并且感谢大家指出小吉的问题&#x1f970; 文章目录 &#x1f384;效果&#x1f33a;代码&#x1f6f8;讲解&#x…

微信管理系统在教育行业中的应用

随着教育行业越来越注重科技创新&#xff0c;对微信scrm工具的需求也会越来越大&#xff0c;微信scrm工具在教育行业的市场前景非常广阔&#xff0c;也为教育行业带来更多的发展机遇。 微信SCRM系统由监管、运营两大核心应用组成。能帮助培训机构实现从招生引流、销售管理、再…

【Android知识笔记】UI体系(四)

事件分发原理 屏幕事件会由Linux通过JNI传给WMS(WindowManagerService),然后由WMS传给Activity,最终经过PhoneWindow->DecorView开始往下分发。 View的事件分发 View的事件分发核心源码为 dispatchTouchEvent() 方法: public boolean dispatchTouchEvent(MotionEvent …

导数的应用、单调性、极值、最大最小值

函数的单调性 函数的单调性是一个重要的性质&#xff0c;它描述了函数在某个区间上的变化趋势。如果函数在某个区间上单调递增&#xff0c;那么在这个区间上&#xff0c;随着自变量的增大&#xff0c;函数值也会增大&#xff1b;反之&#xff0c;如果函数在某个区间上单调递减&…

【halcon】halcon字符识别——OCR

前言 OCR&#xff08;Optical Character Recongnition&#xff09;光学字符识别。 halcon 的OCR&#xff0c;提供了几种方式&#xff0c;我们应该如何选择&#xff1f; 自动文本阅读器&#xff08;find_text&#xff09;手动文本阅读器&#xff08;find_text&#xff09;自己…

数据结构基础7:二叉树【链式结构】实现和递归思想。

二叉树的链式结构实现 一.二叉树链式结构的实现&#xff1a;1.前置说明&#xff1a;1.创建二叉树&#xff1a;2.二叉树的结构&#xff1a; 2.二叉树的遍历&#xff1a;1.二叉树的前中后序遍历&#xff1a;2.内容拓展&#xff1a; 二.二叉树链式(题目)题目一&#xff1a;计算节点…

【Axure高保真原型】日历日期原型模板

今天和大家分享日历日期的原型模板&#xff0c;包括月计划、周计划、日计划的原型案例&#xff0c;以及日期、时间、月份、区间选择器……具体效果可以点击下方视频观看 【原型预览及下载地址】 Axure 原型 备用地址&#xff1a;Untitled Document 【原型效果】 【原型效果…