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.rhkb.cn/news/131724.html

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

相关文章

重构优化第三方查询接口返回大数据量的分页问题

# 问题描述 用户线上查询其上网流量详单数据加载慢&#xff0c;且有时候数据没有响应全~ 1、经排除是调用第三方数据量达10w条响应会超时&#xff0c;数据没正常返回 2、现有线上缓存分页也是加载慢数据不能正常展示 3、第三方接口返回类似报文jsonj&#…

LVS负载均衡群集——LVS-NAT模式搭建和LVS-DR模式搭建

目录 lvs工作模式 1、NAT模式&#xff08;VS-NAT&#xff09; 2、直接路由模式&#xff08;VS-DR&#xff09; 3、IP隧道模式&#xff08;VS-TUN&#xff09; LVS调度算法 LVS群集类型 1&#xff09;负载均衡群集 LB 2&#xff09;高可用群集 HA 3&#xff09;高性能运…

C#获取屏幕的分辨率、工作区分辨率

运行结果如下; 由于屏幕的任务栏在侧面所以屏幕宽度变化。 代码如下 private void Form1_Load(object sender, EventArgs e){int SH Screen.PrimaryScreen.Bounds.Height; //1080int SW Screen.PrimaryScreen.Bounds.Width; //1920System.Drawing.Rectangle rec Screen.Get…

Nginx安装与常见命令

一、Nginx简介 官方文档&#xff1a;https://www.nginx.com/ Nginx中文文档&#xff1a;https://nginx.cn/doc/index.html Nginx由俄罗斯人&#xff08;Igor Sysoev&#xff09;编写的轻量级Web服务器&#xff0c;它的发音为 [ˈendʒɪnks] 。 Nginx 不仅是一款高性能的 HTTP服…

【C语言】找单身狗问题

一.找单身狗问题初阶 1.问题描述 一个数组中只有一个数字是出现一次,其他所有数字都出现了两次.编写一个函数,找出这个只出现一次的数字. 例如: 有数组的元素是:1,2,3,4,5,1,2,3,4 只有5出现了一次,要找出5. 2.解题思路 常规思路: 在常规思路中,我们首先想到的肯定是使用两层…

@DS注解方式springboot多数据源配置及失效场景解决

1.使用教程 导入依赖 <!--多数据源--><dependency><groupId>com.baomidou</groupId><artifactId>dynamic-datasource-spring-boot-starter</artifactId><version>3.5.0</version></dependency>配置数据源 datasource:…

stu04-快速生成HTML5文档结构

1.直接输入一个英文的感叹号“!”&#xff0c;然后按Tab键&#xff0c;自动生成 2.输入“html:5”&#xff0c;然后按Tab键自动生成 3.直接复制粘贴以下代码&#xff1a; <!doctype html> <html lang"en"> <head><meta charset"UTF-8&q…

“金钥匙”转动!安全狗成功护航第二十三届中国国际投资贸易洽谈会举办

9月8日至9月11日&#xff0c;为期4天的第二十三届中国国际投资贸易洽谈会在厦门顺利举办。 作为国内云原生安全领导厂商&#xff0c;安全狗凭借突出的安全综合实力&#xff0c;受委托并担任此次会议网络安保技术支撑单位。 厦门服云信息科技有限公司&#xff08;品牌名&#xf…

【C语言】每日一题(半月斩)——day1

目录 &#x1f60a;前言 一.选择题 1.执行下面程序&#xff0c;正确的输出是&#xff08;c&#xff09; 2.以下不正确的定义语句是&#xff08; &#xff09; 3.test.c 文件中包括如下语句&#xff0c;文件中定义的四个变量中&#xff0c;是指针类型的变量为【多选】&a…

ARM架构指令集--专用指令

四、状态寄存器专用指令 CPSR寄存器-N Z C V T为0时 为ARM状态 F为0时 为开启FIQ状态 I为0时 为开启IRQ状态 图1 图2 一开始都是SVC指令&#xff0c;因为在操作系统启动的时候&#xff0c;在做一些初始化的操作&#xff0c;不允许被打断 图3 复位后CPSR寄存器为0xD3--…

BUSMASTER使用记录(一):基本收发、报文过滤、报文录制和数据回放

目录 一、概述二、基本收发2.1 连接设备2.2 接收2.3 发送 三、DBC加载和转换DBF文件四、报文过滤4.1 新增过滤器4.2 使能 五、报文录制/回放报文录制数据回放 一、概述 以往使用过的CAN盒虽然厂家不一样&#xff0c;但都兼容周立功的CANPro。这次使用的BusMaster&#xff0c;需…

【Hive SQL 每日一题】统计用户连续下单的日期区间

文章目录 测试数据需求说明需求实现 测试数据 create table test(user_id string,order_date string);INSERT INTO test(user_id, order_date) VALUES(101, 2021-09-21),(101, 2021-09-22),(101, 2021-09-23),(101, 2021-09-27),(101, 2021-09-28),(101, 2021-09-29),(101, 20…

9月12日作业

作业代码 #include <iostream>using namespace std;class Shape { protected:double cir;double area; public://无参构造Shape() {cout<<"无参构造"<<endl;}//有参构造Shape(double c, double a):cir(c), area(a){cout<<"有参构造&quo…

弄懂软件设计模式(一):单例模式和策略模式

前言 软件设计模式和设计原则是十分重要的&#xff0c;所有的开发框架和组件几乎都使用到了&#xff0c;比如在这小节中的单例模式就在SpringBean中被使用。在这篇文章中荔枝将会仔细梳理有关单例模式和策略模式的相关知识点&#xff0c;其中比较重要的是掌握单例模式的常规写法…

朋友圈大佬都去读研了,这份备考书单我码住了

作者简介&#xff1a; 辭七七&#xff0c;目前大二&#xff0c;正在学习C/C&#xff0c;Java&#xff0c;Python等 作者主页&#xff1a; 七七的个人主页 文章收录专栏&#xff1a; 七七的闲谈 欢迎大家点赞 &#x1f44d; 收藏 ⭐ 加关注哦&#xff01;&#x1f496;&#x1f…

React如何实现国际化?

目录 一、Redux准备工作 commonTypes.js commonActions.js commonReducer.js rootReducer.js 二、然后定义SelectLang组件 index.js index.less 三、创建语言包 welcomeLocale.js index.js 四、使用 react的入口文件 App.js welcome.js 附 关于如何实现国际…

进程地址空间(Linux虚拟内存机制)

文章目录 一.Linux进程地址空间的结构二.Linux管理进程地址空间的方式三.Linux进程使用物理内存的模型四.进程地址空间的存在意义 本章理论基于32位平台的Linux–kernel 2.6.32版本内核 一.Linux进程地址空间的结构 为了保证内存安全,现代操作系统不允许应用程序(进程)直接访问…

Redis总结(二)

目录 Redis线程模型 Redis是单线程吗&#xff1f; Redis采用单线程为什么那么快&#xff1f; I/O多路复用模型 Redis持久化 Redis如何保证数据不丢失&#xff1f; AOF日志 AOF三种写回策略 AOF重写机制 触发机制 重写原理 RDB快照 执行快照时&#xff0c;数据能被…

实现 js 中所有对象的深拷贝(包装对象,Date 对象,正则对象)

通过递归可以简单实现对象的深拷贝&#xff0c;但是这种方法不管是 ES6 还是 ES5 实现&#xff0c;都有同样的缺陷&#xff0c;就是只能实现特定的 object 的深度复制&#xff08;比如数组和函数&#xff09;&#xff0c;不能实现包装对象 Number&#xff0c;String &#xff0…

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亿的参数量