news 2026/1/30 3:33:04

SpringBoot--Redis基础知识

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
SpringBoot--Redis基础知识

SpringBoot–Redis基础知识

文章目录

  • SpringBoot--Redis基础知识
    • 1.Redis简介
    • 2.Redis能做什么
    • 3.Redis安装(Windows系统)
      • 3.1启动Redis
      • 3.2修改密码
    • 4.SpringBoot项目中使用Redis
      • 4.1配置Redis
      • 4.2使用Spring封装的RedisTemplate操作redis
        • 4.2.1操作字符串 opsForValue
        • 4.2.2操作list opsForList
        • 4.2.3操作有序set opsForZSet
        • 4.2.4操作无序set opsForSet
        • 4.2.5操作hash opsForHash
      • 4.3StringRedisTemplate常用操作
    • 5.StringRedisTemplate与RedisTemplate区别

1.Redis简介

redis是一个key-value。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set–有序集合)和hash(哈希类型)。

Redis 内置了复制(replication),LUA脚本(Luascripting),LRU驱动事件(LRU eviction),事务(transactions)和不同级别的 磁盘持久化(persistence),并通过Redis哨兵(Sentinel)和自动分区(Cluster)提供高可用性(high availability)。

2.Redis能做什么

  • 缓存,毫无疑问这是Redis当今最为人熟知的使用场景。再提升服务器性能方面非常有效
  • 排行榜,利用Redis的SortSet数据结构能够非常方便搞定
  • 计算器/限速器,利用Redis中原子性的自增操作,我们可以统计类似用户点赞数、用户访问数等,这类操作如果用MySQL,频繁的读写会带来相当大的压力;限速器比较典型的使用场景是限制某个用户访问某个API的频率,常用的有抢购时,防止用户疯狂点击带来不必要的压力; 注:限速器也是对请求限流的一种实现方式
  • 好友关系,利用集合的一些命令,比如求交集、并集、差集等。可以方便搞定一些共同好友、共同爱好之类的功能
  • 简单消息队列,除了Redis自身的发布/订阅模式,我们也可以利用List来实现一个队列机制,比如:到货通知、邮件发送之类的需求,不需要高可靠,但是会带来非常大的DB压力,完全可以用List来完成异步解耦
  • Session共享,默认Session是保存在服务器的文件中,即当前服务器,如果是集群服务,同一个用户过来可能落在不同机器上,这就会导致用户频繁登陆;采用Redis保存Session后,无论用户落在那台机器上都能够获取到对应的Session信息

3.Redis安装(Windows系统)

  • 下载包 https://github.com/MicrosoftArchive/redis/releases
  • 解压到D盘目录下

3.1启动Redis

  • 在解压后的目录下cmd,直接输入命令redis-server.exe redis.windows.conf,即可启动redis

  • 新建记事本文件startup.bat, 输入redis-server.exe redis.windows.conf

3.2修改密码

  • Redis默认没有密码,若想设置密码解压目录下找到redis.windows.conf文件中requirepass 下添加requirepass 密码,保存,重新运行即可

4.SpringBoot项目中使用Redis

4.1配置Redis

  • 引入相关JAR

    <!--redis jar--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency>
  • 在application.yml文件中添加相关配置

    spring:redis:# Redis服务器地址host:127.0.0.1# Redis数据库端口(默认为6379)port:6379# Redis服务器连接密码(默认为空)password:123456# Redis数据库索引(默认为0)database:1
  • 完成后,SpringBoot自动在Spring容器中配置一个redisTemplate的Bean,所以可以直接使用redisTemplate

4.2使用Spring封装的RedisTemplate操作redis

常用方法

redisTemplate.opsForValue();//操作字符串

redisTemplate.opsForHash();//操作hash

redisTemplate.opsForList();//操作list

redisTemplate.opsForSet();//操作set

redisTemplate.opsForZSet();//操作有序set

4.2.1操作字符串 opsForValue
  • 创建opsForValue对象
@AutowiredprivateRedisTemplateredisTemplate;// 创建opsForValue对象ValueOperationsvalueOperations=redisTemplate.opsForValue();
  • 存储字符串
valueOperations.set("name","lisi");System.out.println(redisTemplate.opsForValue().get("name"));输出结果:lisi
  • 设置失效时间
    • TimeUnit.DAYS 天
    • TimeUnit.HOURS 小时
    • TimeUnit.MINUTES 分钟
    • TimeUnit.SECONDS 秒
    • TimeUnit.MILLISECONDS 毫秒
//设置有效期 10秒后过期valueOperations.set("name","amy",10000,TimeUnit.MILLISECONDS);// 设置10秒后过期 10秒后,输出nullSystem.out.println(redisTemplate.opsForValue().get("name"));
  • 支持整型与浮点型 (increment)
//自增 count=1valueOperations.increment("count",1);//自增 count=2valueOperations.increment("count",1);//输出count=2System.out.println(valueOperations.get("count"));
  • 追加字符串
// 追加字符串 name=lisiiii 如果name不存在则创建空字符串 因此APPEND在这种特殊情况下将类似于SETvalueOperations.append("name","iii");
  • 截取key所对应的value字符串
// 获取字符串的子串 0-2 包含0不包含2System.out.println(valueOperations.get("name",0,2));
  • 返回key所对应的value值的长度
System.out.println(valueOperations.size("name"));
  • 存储一个对象 (此类必须先序列化实现接口Serializable)
RedisSerializerrs=newStringRedisSerializer();redisTemplate.setStringSerializer(rs);Billbill=newBill();bill.setProductName("iphone");bill.setProductDesc("手机");bill.setProductUnit("个");//存储对象 bill 到 redis 中valueOperations.set("bill",bill);//获取对象Billbill1=(Bill)valueOperations.get("bill");;System.out.println(bill1);输出结果:Bill(id=null,billCode=null,productName=iphone,productDesc=手机,productUnit=,productCount=null,totalPrice=null,isPayment=null,providerId=null,provider=null)
4.2.2操作list opsForList
  • 将所有指定的值插入存储在键的列表的头部;如果键不存在,则在执行推送操作之前将其创建为空列表(从左边插入)
//添加数据到list的头部listOperations.leftPush("names","苏暮雨");listOperations.leftPush("names","苏昌河");listOperations.leftPush("names","苏喆");//[苏喆, 苏昌河, 苏暮雨]
  • 将所有指定的值插入存储在键的列表的头部。如果键不存在,则在执行推送操作之前将其创建为空列表。(从右边插入)
//添加数据到list的尾部listOperations.rightPush("names","白鹤淮");listOperations.rightPush("names","唐怜月");listOperations.rightPush("names","唐莲");
  • 返回存储在键中的列表的指定元素
//获取list的所有元素System.out.println(listOperations.range("names",0,-1));//输出结果:[苏喆, 苏昌河, 苏暮雨, 白鹤淮, 唐怜月, 唐莲]
  • 获取集合长度
System.out.println(listOperations.size("names")); //输出结果:6
  • 在列表中index的位置设置value值(如果index不存在则报错)
//修改list的第4个元素(索引从0开始) listOperations.set("names",3,"雷云鹤"); System.out.println(listOperations.range("names",0,-1)); 输出结果:[苏喆, 苏昌河, 苏暮雨, 雷云鹤, 唐怜月, 唐莲]
  • 批量将一个数组插入到列表中
//批量将一个数组插入到列表中String[]nameStr={"萧瑟","无心","苏雨墨"};listOperations.leftPushAll("names",nameStr);System.out.println(listOperations.range("names",0,-1));输出结果:[苏雨墨,无心,萧瑟,苏喆,苏昌河,苏暮雨,雷云鹤,唐怜月,唐莲,白鹤淮,唐怜月,唐莲]
  • 从存储在键中的列表中删除等于值的元素的第一个计数事件
    • count>O:删除等于从头到尾移动的值的元素
    • count<0:删除等于从尾到头移动的值的元素
    • count=O:删除等于value的所有元素
//删除从索引开始,遇到第一个匹配的元素,删除它listOperations.remove("names",1,"唐莲");//删除从尾部开始,遇到第一个匹配的元素,删除它listOperations.remove("names",-1,"白鹤淮");//删除所有value=唐怜月的的元素listOperations.remove("names",0,"唐怜月");
  • 根据下标获取列表中的值,下标是从0开始的
//获取list的第3个元素(索引从0开始) System.out.println(listOperations.index("names",2));
4.2.3操作有序set opsForZSet
  • 创建 opsForZSet对象
@AutowiredprivateRedisTemplateredisTemplate;@TestpublicvoidtestRedisTemplate(){ZSetOperationszSetOperations=redisTemplate.opsForZSet();}
  • 新增一个有序集合
zSetOperations.add("zset1","zhangsan",100);zSetOperations.add("zset1","lisi",88);zSetOperations.add("zset1","wangwu",99);
  • 从有序集合中移除一个或者多个元素
//从有序集合中移除一个或者多个元素zSetOperations.remove("zset1","lisi");//获取有序集合的所有元素System.out.println(zSetOperations.range("zset1",0,-1));输出结果:[wangwu,zhangsan]
  • 增加元素的score值,并返回增加后的值
//增加有序集合的元素的分数zSetOperations.incrementScore("zset1","lisi",1);//获取有序集合的元素的分数System.out.println(zSetOperations.score("zset1","lisi"));输出结果:89
  • 获取有序集合的元素在有序集合中范围(包含)的索引
//获取有序集合的元素在有序集合中范围(包含)的索引System.out.println(zSetOperations.rangeByScore("zset1",88,100));//获取有序集合的元素在有序集合中的数量System.out.println(zSetOperations.count("zset1",88,100));输出结果:[lisi,wangwu,zhangsan]3
  • 获取有序集合的成员数
//获取有序集合的成员数System.out.println(zSetOperations.size("zset1"));//3
4.2.4操作无序set opsForSet
  • 创建opsForSet对象
@AutowiredprivateRedisTemplateredisTemplate;@TestpublicvoidtestRedisTemplate(){//创建opsForSet对象SetOperationssetOperations=redisTemplate.opsForSet();}
  • 添加数据
//添加数据String[]strArrays=newString[]{"set1","set2","set3","set4"};//将元素添加到集合中setOperations.add("setTest",strArrays);
  • 获取集合中的元素
//获取集合中的元素System.out.println(setOperations.members("setTest"));
  • 删除数据
//获取集合中的元素System.out.println(setOperations.members("setTest"));//删除数据setOperations.remove("setTest","set1");System.out.println(setOperations.members("setTest"));输出结果:[set4,set3,set1,set2][set4,set3,set2]
  • 获取集合的长度
//获取集合的长度System.out.println(setOperations.size("setTest"));输出结果:3
  • 判断元素是否在集合中
//判断元素是否在集合中System.out.println(setOperations.isMember("setTest","set2"));输出结果:true
4.2.5操作hash opsForHash
  • 创建opsForHash对象
@AutowiredprivateRedisTemplateredisTemplate;@TestpublicvoidtestRedisTemplate(){//创建opsForHash对象HashOperationshashOperations=redisTemplate.opsForHash();}
  • 添加数据
//使用opsForHash对象操作哈希结构 添加数据hashOperations.put("users","name1","zhangsan");hashOperations.put("users","name2","lisi");hashOperations.put("users","name3","wangwu");
  • 删除数据
//使用opsForHash对象操作哈希结构 删除数据hashOperations.delete("users","name1");
  • 获取数据
//使用opsForHash对象操作哈希结构 获取数据System.out.println(hashOperations.get("users","name2"));
  • 批量添加数据
//使用opsForHash对象操作哈希结构 批量添加数据MapnewMap=newHashMap();newMap.put("map3","map3-3");newMap.put("map5","map5-5");hashOperations.putAll("users",newMap);

4.3StringRedisTemplate常用操作

@AutowiredprivateStringRedisTemplatestringRedisTemplate;@TestpublicvoidtestRedisTemplate(){//设置有效期 10分钟后过期stringRedisTemplate.opsForValue().set("test","909",600000,TimeUnit.MILLISECONDS);//60秒后,输出nullSystem.out.println(stringRedisTemplate.opsForValue().get("test"));//909//获得键test的剩余有效期 单位:秒System.out.println(stringRedisTemplate.getExpire("test"));//600//删除键teststringRedisTemplate.delete("test");//向指定key中存放set集合stringRedisTemplate.opsForSet().add("setTest","1","2","3");//获取集合setTest的所有元素System.out.println(stringRedisTemplate.opsForSet().members("setTest"));//[1, 2, 3]//判断元素是否在Set集合中System.out.println(stringRedisTemplate.opsForSet().isMember("setTest","1"));//true//获取集合的长度System.out.println(stringRedisTemplate.opsForSet().size("setTest"));//3//添加数据到hash结构中stringRedisTemplate.opsForHash().put("hashTest","name1","lisi");stringRedisTemplate.opsForHash().put("hashTest","name2","wangwu");stringRedisTemplate.opsForHash().put("hashTest","name3","zhangsan");//判断hash结构中是否存在指定的keySystem.out.println(stringRedisTemplate.hasKey("hashTest"));//true}

5.StringRedisTemplate与RedisTemplate区别

  • 两者的关系是StringRedisTemplate继承RedisTemplate
  • 两者的数据是不共通的。StringRedisTemplate只能管理StringRedisTemplate里面的数据,RedisTemplate只能管理RedisTemplate中的数据。
  • 两者的使用的序列化类不同。RedisTemplate使用的是JdkSerializationRedisSerializer存入数据会将数据先序列化成字节数组然后在存入Redis数据库。 StringRedisTemplate使用的是 StringRedisSerializer
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/1/27 2:29:56

27、趣味十足的Shell脚本游戏大揭秘

趣味十足的Shell脚本游戏大揭秘 1. 绞刑架猜词游戏 绞刑架猜词游戏是一种有趣的互动游戏,在Shell脚本中以“到绞刑架的步数”来替代传统的绞刑架图形。游戏会给出一些字母猜测的提示,如 guessed: eioum, steps from gallows: 5, word so far: -e--e--iou--- ,玩家需要不…

作者头像 李华
网站建设 2026/1/22 5:42:41

Realistic Vision V2.0:从零开始掌握AI图像生成核心技术

你是否曾经遇到过这样的情况&#xff1a;想要创作一张逼真的人物肖像&#xff0c;却苦于没有绘画功底&#xff1f;或者需要为项目制作概念图&#xff0c;但时间和成本都让你头疼&#xff1f;Realistic Vision V2.0正是为解决这些问题而生的人工智能图像生成解决方案。 【免费下…

作者头像 李华
网站建设 2026/1/28 11:49:37

语雀文档一键导出:5分钟掌握完整备份方案

随着语雀平台的策略调整&#xff0c;越来越多的用户开始寻找可靠的文档迁移方案。yuque-exporter作为一款专为语雀用户设计的开源工具&#xff0c;能够帮助您快速将云端文档批量导出为本地Markdown格式&#xff0c;实现数据的安全备份和灵活迁移。 【免费下载链接】yuque-expor…

作者头像 李华
网站建设 2026/1/27 6:44:09

Next.js 16与Shadcn UI后台管理系统实战指南

Next.js 16与Shadcn UI后台管理系统实战指南 【免费下载链接】next-shadcn-dashboard-starter Admin Dashboard Starter with Nextjs14 and shadcn ui 项目地址: https://gitcode.com/gh_mirrors/ne/next-shadcn-dashboard-starter 基于Next.js 16和Shadcn UI技术栈的现…

作者头像 李华
网站建设 2026/1/29 15:29:51

29、Linux系统安全防护指南

Linux系统安全防护指南 1. 避免以Root用户登录 Root用户拥有系统的最高权限,可执行所有操作。虽然使用Root账户能无限制地访问维护系统所需的所有命令,但一直使用它会使系统在危险操作即将发生时的警告机制失效。在正常情况下,系统会警告普通用户其没有执行某些功能的必要…

作者头像 李华
网站建设 2026/1/27 15:07:34

智能家居联动场景设计:5大核心模式与0故障部署策略

第一章&#xff1a;智能家居Agent联动场景的核心价值智能家居系统中的Agent联动机制&#xff0c;正在重新定义家庭自动化体验。通过多个智能设备代理&#xff08;Agent&#xff09;之间的协同决策与信息共享&#xff0c;用户不再需要手动逐个控制灯光、温控、安防等子系统&…

作者头像 李华