1、案例说明

springboot整合redis之后,提供了操作redis的简便方式

通过通用对象redisTemplate方式操作String,Hash,List,Set SortSet五大数据类型

本案例中使用springboot连接Redis集群的方式操作,同时也提供了非集群了解配置。

1、redisTemplate.opsForValuey用法

2、redisTemplate.opsForHash用法

3、

重点说明1:

很多人redis集群已经配置成功了,并且可以正常使用,但是springboot工程无法连接。

情况1:linux系统没有开发端口,需要开放端口:centos7中设置端口放行(centos7防火墙配置端口放行)_centos7端口放行_雾林小妖的博客-CSDN博客

情况2:在redis.conf的配置中,bind的属性设置成bind 0.0.0.0,需要设置成bind 192.168.133.149

重点说明2:如果没有成功搭建redis集群请卡下面的连接:

redis集群配置连接:https://blog.csdn.net/tangshiyilang/article/details/129890028

2、环境搭建

2.1、创建工程引入引入相关依赖

引入:springboot2.7.9 +jdk1.8+ Redis6.2.5+jedis(集群连接工具)

2.2、项目pom.xml依赖文件信息

【包依赖信息】

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.6</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.txc</groupId><artifactId>springboot_redis</artifactId><version>0.0.1-SNAPSHOT</version><name>springboot_redis</name><description>Demo project for Spring Boot</description><properties><java.version>1.8</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId></dependency><!-- https://mvnrepository.com/artifact/com.alibaba/fastjson --><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.75</version></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>
</project>

2.3、在application.yml文件中加入连接redis配置参数

配置说明:主要做了数据库连接配置,redis连接配置

mybatis配置没有配置,全部使用默认配置

redis.host:写你自己的主机地址,linux中地址ip查看命令:ifconfig

【连接单击redis配置】

spring:#redis配置redis:database: 0host: 192.168.133.147port: 6379timeout: 5000password: 123456

【连接redis集群配置】

spring:redis:cluster:nodes:- 192.168.133.149:9001- 192.168.133.149:9002- 192.168.133.149:9003- 192.168.133.149:9004- 192.168.133.149:9005- 192.168.133.149:9006max-redirects: 6  #节点数量jedis:pool:max-active: 16   #最大的连接数max-wait: 3000   #最大的等待时间max-idle: 8      #最大空闲数min-idle: 0       #最小空闲数

2.4、创建操作Redis配置配置类

@Configuration
public class RedisConfig{/*配置order,如果不配置添加数据,redis中的key和value乱码*/@Beanpublic RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();redisTemplate.setConnectionFactory(redisConnectionFactory);// 创建一个json的序列化方式GenericJackson2JsonRedisSerializer jackson2JsonRedisSerializer = new GenericJackson2JsonRedisSerializer();// 设置value用jackjson进行处理redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);// 设置key用string序列化方式redisTemplate.setKeySerializer(new StringRedisSerializer());// 设置hash的键redisTemplate.setHashKeySerializer(new StringRedisSerializer());// 设置hash的value序列化redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);redisTemplate.afterPropertiesSet();return redisTemplate;}
}

3、redisTemplate操作String类型的数据

【操作结果】

【具体测试代码】

@Controller
public class TestController {@Resourceprivate RedisTemplate redisTemplate;//数据缓存值redis,String类型@RequestMapping("/testString")@ResponseBodypublic  void testString() throws Exception {System.out.println("======132=========");//创建操作字符串类型数据的对象ValueOperations opsString=redisTemplate.opsForValue();//使用1、添加一条key为username,值为shiyilang的StringopsString.set("username", "shiyilang");//使用2、查询key为username的值opsString.get("username");//使用3:multiSet同时添加多个key和valueMap<String,Object> map=new HashMap<String,Object>();map.put("a","123");map.put("b","234");opsString.multiSet(map);//使用4:添加key:username,value:晓春qie数据有效期为30秒opsString.set("username","xiaochun",3000,TimeUnit.SECONDS);//使用6:getAndSet取值之后,重新赋值为大春opsString.getAndSet("username","大春");//使用7:为sex的值增加2opsString.increment("sex",2);//使用8:为sex的值增加减2opsString.decrement("sex",3);}
}

4、redisTemplate操作Hash类型数据

将一个对象以json字符串的形式存储在redis中,此时修改其中的一个字段,就必须将这个的json字符串重新转了一下,然后重新存储,势必会造成性能上的消耗。使用hash可以解决只修改一个值。

【测试结果】

【测试代码】

@Controller
public class TestController {@Resourceprivate RedisTemplate redisTemplate;
//添加hash类型的参数及过期时间
@RequestMapping("/testHash")
@ResponseBody
public void testHash() {HashOperations opsHash=redisTemplate.opsForHash();//用法1:put->添加一条hash参数,key为id,value为1001opsHash.put("stu1","id","1001");Map<String,Object> map=new HashMap<String,Object>();map.put("id","123");map.put("name","晓春");map.put("sex","1");//用法2:putAll->:同时向stu1中添加多条数据opsHash.putAll("stu1",map);//用法3:get->获取stu1中key为name的值opsHash.get("stu1","name");//用法4:increment->为stu1中sex的值增加2opsHash.increment("stu1","sex",2);//用法5:delete->删除stu1中的nameopsHash.delete("stu1","name");//用法6:获取stu1中所有的key和valueMap<String,Object> allKeyAndValue=opsHash.entries("stu1");//用法7:multiGet->获取stu1中,id和name的值List<String> list=opsHash.multiGet("stu1",Arrays.asList("id","name"));System.out.println(list);//用法8:putIfAbsent->id存在就返回false且不执行任何动作,id不存在就添加id和valueboolean flag=opsHash.putIfAbsent("stu1","id","123");System.out.println(flag);//用法9:expire->设置stu1的有效为30秒redisTemplate.expire("stu1",30000,TimeUnit.SECONDS);//用法10:randomEntry->随机弹出stu1中的一个键值对,如name=晓春或sex=1String key1=opsHash.randomEntry("stu1").toString();//用法11:size->查询stu1中键值对的数量opsHash.size("stu1");
}
}

5、redisTemplate操作List类型数据

list可以存储一个有序的字符串列表,常用的操作是向列表两端添加数据,或者获得列表的某个片段。

列表类型内部都是使用双向列表实现的,所有向列表两端添加元素的时间复杂度为0,获取越相近两端的的元素速度就越快,这就意味着即使是一个有几千万个元素的列表,获取头部或者尾部的记录都是非常快的。

【测试结果】

【测试代码】

@Controller
public class TestController {@Resourceprivate RedisTemplate redisTemplate;//redsiTemplate操作List类型数据@RequestMapping("/testList")@ResponseBodypublic  void testList() throws Exception {ListOperations<String,Object> opsList=redisTemplate.opsForList();//用法1:向列表list左边添加值1opsList.leftPush("list","1");//用法2:向列表list左边添加多个值String []a={"3","4","5"};opsList.leftPushAll("list",a);//用法3:向列表list右边边添加值opsList.rightPush("list","1");//用法4:向列表list右边添加多个值String []b={"7","8","9"};opsList.rightPushAll("list",b);//用法5:从集合的左边弹出三个数,并从结合中删除这三个元素,如:[5, 4, 3]List<Object> mvalue=opsList.leftPop("list",3);System.out.println(mvalue);//用法6:从集合的右边弹出三个数,并从结合中删除这三个元素opsList.rightPop("list",3);//用法7:将集合list右边的值弹出,移动到list1的左边opsList.rightPopAndLeftPush("list","list");
}
}

6、redisTemplate操作set类型数据

数据不重复且没有顺序

【测试结果】

【测试代码】

//redsiTemplate操作set类型数据
@RequestMapping("/testSet")
@ResponseBody
public  void testSet() throws Exception {SetOperations<String,Object> opsSet=redisTemplate.opsForSet();//用法1:向test中添加三个参数String []arr={"a","b","c"};opsSet.add("test",arr);//用法2:移出rest中的a值String []arr1={"a"};opsSet.remove("test",arr1);//用法3:查询出test中的所有数据,并通过迭代器遍历数据Set<Object> sets=opsSet.members("test");Iterator<Object> ites= sets.iterator();while(ites.hasNext()){System.out.println(ites.next());}//用法4:随机获取test中的两个值,但是不删除元数据opsSet.randomMembers("test",2);//用法5:计算出test和test1的差运算值opsSet.difference("test","test1");//用法6:将test和test1的差值存入test2中opsSet.differenceAndStore("test","test1","test2");//用法7:计算test和test1的交集opsSet.intersect("test","test1");//用法8:将test和test1的交集存入test2中opsSet.intersectAndStore("test","test1","test2");//用法9:计算test和test1的并集opsSet.union("test","test1");//用法10:将test和test1的并集存入test2中opsSet.unionAndStore("test","test1","test2");//用法11:获取test中u安苏的个数opsSet.size("test");//用法12:从test中随机弹出一个数,且删除元数据opsSet.pop("test",1);//用法13:将test中的a值移入到test1中opsSet.move("test","a","test1");//用法14:从集合中随机弹出两个数,不删除元数据opsSet.randomMembers("test",2);
}

7、redisTemplate操作zset类型数据

sortedset和set类型极为类似,它们都是字符串的集合,都不允许重复的成员出现在一个set集合中。它们之间的主要差别是sortedset中的每一个成员都会有一个分数(score)与之关联,redis正是通过分数来为集合指那个的成员进行从大到小的排序。然而需要额外指出的是尽管sortedset中的成员必须是唯一的,但是分数却是可以重复的。

在sortedset中添加、删除或更新一个成员都是非常快速的操作。其时间复杂度为集合中成员数量的对数。由于sortedset中的成员在集合中的位置是有序的。因此,即便是访问位于集合中部的成员也仍然是非常高效的。

7.1、zset的应用场景

1、排名,网站流量统计,微博热点,分数的统计排行

2、游戏的积分排行榜,通过zadd更新玩家分数,然后通过zrange命令获取集合topten的用户信息

3、rted-set还可以用户构建索引数据

4、销售排行榜

7.2、具体应用

【测试结果】

【测试代码】

@Controller
public class TestController {@Resourceprivate RedisTemplate redisTemplate;//redsiTemplate操作set类型数据@RequestMapping("/testZSET")@ResponseBodypublic  void  testZSET(){ZSetOperations<String,Object> opsZSET= redisTemplate.opsForZSet();//用法1:向集合zset中添加值java,且分数score设置为1opsZSET.add("zset","java",1);//用法2:获取java的scoreDouble score1=opsZSET.score("zset","java");//用法3:获取zset中成员的数量long count=opsZSET.zCard("zset");//用法4:删除zset集合中的javaString []arr={"java"};opsZSET.remove("zset");//按用法5:照范围删除,-1表示最后opsZSET.removeRange("zset",0,-1);//用法6:删除集合zset中score在20-30的所有数据opsZSET.removeRangeByScore("zset",20,30);//用法7:按照score从到小返回数据Set<Object> sets=opsZSET.reverseRange("zset",0,-1);Iterator<Object> ites= sets.iterator();while(ites.hasNext()){System.out.println(ites.next());}//用法8:返回集合zset中20-30的数据,且按照从低到高排序opsZSET.rangeByScore("zset",20,30);//用法9:为集合zset中java的score值增加5opsZSET.incrementScore("zset","java",5);//用法10:获取分数在20-30之间的成员opsZSET.count("zset",20,30);//用法11:按照从小到大规则,返回java在集合zset中的排名opsZSET.rank("zset","java");//用法12:按照从大到小规则,返回java在集合zset中的排名opsZSET.reverseRank("zset","java");}
}

8、redisTemplate的通用命令

@Controller
public class TestController {@Resourceprivate RedisTemplate redisTemplate;//redsiTemplate操作,通用命令@RequestMapping("/testGe")@ResponseBodypublic  void  testGe() {//用法1:获取指定的keyz值,如*,??list,keys*redisTemplate.keys("");//用法2:删除指定的keyredisTemplate.delete("");//用法3:给key重命名redisTemplate.rename("","");//用法4:设置key的有效期redisTemplate.expire("username",3000,TimeUnit.SECONDS);//用法5:获取key的有效期redisTemplate.getExpire("username",TimeUnit.SECONDS);//用法6:清楚key的有效期redisTemplate.persist("username");//用法7:判断key的类型redisTemplate.type("");}

9、源码下载

https://download.csdn.net/download/tangshiyilang/87665205

RedisTemplate操作redis五大类型用法详解(springboot整合redis版本)相关推荐

  1. 详解SpringBoot整合Redis

    SpringBoot整合Redis 在SpringBoot中一般使用RedisTemplate提供的方法来操作Redis.那么使用SpringBoot整合Redis 需要那些步骤呢. 1.JedisP ...

  2. springboot整合mysql5.7_详解SpringBoot整合MyBatis详细教程

    1. 导入依赖 首先新建一个springboot项目,勾选组件时勾选Spring Web.JDBC API.MySQL Driver 然后导入以下整合依赖 org.mybatis.spring.boo ...

  3. Redis设计与实现详解二:Redis数据库实现

    Redis设计与实现详解一:数据结构与对象 Redis设计与实现详解三:多机功能实现 Redis设计与实现详解四:其他单机功能 数据库 服务器中的数据库 Redis服务器将所有数据库都保存在服务器状态 ...

  4. java jedis_Java操作Redis之Jedis用法详解

    Redis(Remote Dictionary Server,远程数据字典服务器)是一个开源的高性能内存数据库,常用作缓存缓存服务器使用,也已做消息队列使用.因其高性能.丰富的数据类型.可扩展等特性受 ...

  5. java分布式会话redis_详解springboot中redis的使用和分布式session共享问题

    对于分布式使用Nginx+Tomcat实现负载均衡,最常用的均衡算法有IP_Hash.轮训.根据权重.随机等.不管对于哪一种负载均衡算法,由于Nginx对不同的请求分发到某一个Tomcat,Tomca ...

  6. RabbitMq详解+SpringBoot整合RabbitMq快速入门

    1概述: 1.1.什么是MQ 消息队列(Message Queue,简称MQ),从字面意思上看,本质是个队列,FIFO先入先出,只不过队列中存放的内容是message而已. 其主要用途:不同进程Pro ...

  7. 2023新版图文详解SpringBoot整合SSM框架(附源码)

    版权声明 本文原创作者:谷哥的小弟 作者博客地址:http://blog.csdn.net/lfdfhl 教程概述 本教程以图文形式详细讲解SpringBoot整合SSM框架的流程以及具体步骤及其注意 ...

  8. WordPress 数据库操作WPDB对象($wpdb)用法详解

    使用wordpress的时候,如果想直接使用WP里封装的数据库操作的类(wp-db.php),将wp-blog-header.php包含到代码中就可以使用了. define('PATH', dirna ...

  9. Redis中事务用法详解

    在关系型数据库中,事务是指一组命令的集合,这组命令构成了一个原子操作,这个操作要么全部执行成功,要么全部执行失败.而在非关系型数据库 Redis 中并非这样- Redis 中的事务同样也是一组命令的集 ...

最新文章

  1. Python基本语法_强制数据类型转换
  2. 【剑指Offer】28、数组中出现次数超过一半的数字
  3. ASP.Net MVC开发基础学习笔记(5):区域、模板页与WebAPI初步
  4. sqlserver 导入/导出Excel
  5. Express全系列教程之(五):Express的中间件
  6. jquery实现多行滚动效果
  7. navicat循环执行上下两行相减sql语句_SQL太难?你离完全理解SQL就差这10步!
  8. MATLAB警告: 矩阵为奇异工作精度
  9. 机器学习降维算法三:LLE (Locally Linear Embedding) 局部线性嵌入
  10. Xilinx FPGA单端时钟设计方法
  11. linux ----Inode的结构图
  12. java图片对比度调整
  13. 技嘉z77主板msata速度_技嘉小雕、微星迫击炮、华硕电竞特工三款主板对比
  14. Linux实时查看日志,访问前10IP 和相关命令
  15. 详解 HTTPS 移动端对称加密套件优
  16. 前端导出 xlsx文件
  17. 数据库大实验展示(上)
  18. 如何用电脑模拟手机屏幕滑动 Total Control帮您实现
  19. 每次发版都搞到晚上11点,我们能不能……
  20. 阴阳师自动御魂觉醒超鬼王脚本

热门文章

  1. 获微博战略投资后,有信CEO刘子正内部邮件说了啥?
  2. 使用SurfaceView实现手机息屏状态下的静默拍照保存,上传服务器
  3. 【阿里聚安全·安全周刊】阿里安全潘多拉实验室完美越狱iOS11.2.1|Janus漏洞修改安卓app而不影响签名
  4. 「项目管理工具」进度猫如何实现可视化?
  5. 基于SSH的宾馆管理系统系统结构图_ER图_数据字典
  6. 2021年茶艺师(中级)及茶艺师(中级)实操考试视频
  7. Dijkstra经典言论
  8. C语言实现剪刀石头布小游戏
  9. 凄凉午夜那些,心碎的味道:伤感日志
  10. 人工智能研究,一共可以划分为几个分支?