• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

Springboot整合Redis使用RedisTemplate操作redis五大类型用法

武飞扬头像
雾林小妖
帮助1

1、案例说明

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

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

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

1、redisTemplate.opsForValuey用法

2、redisTemplate.opsForHash用法

3、

重点说明1:

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

情况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依赖文件信息

【包依赖信息】

  1.  
    <?xml version="1.0" encoding="UTF-8"?>
  2.  
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3.  
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  4.  
    <modelVersion>4.0.0</modelVersion>
  5.  
    <parent>
  6.  
    <groupId>org.springframework.boot</groupId>
  7.  
    <artifactId>spring-boot-starter-parent</artifactId>
  8.  
    <version>2.7.6</version>
  9.  
    <relativePath/> <!-- lookup parent from repository -->
  10.  
    </parent>
  11.  
    <groupId>com.txc</groupId>
  12.  
    <artifactId>springboot_redis</artifactId>
  13.  
    <version>0.0.1-SNAPSHOT</version>
  14.  
    <name>springboot_redis</name>
  15.  
    <description>Demo project for Spring Boot</description>
  16.  
    <properties>
  17.  
    <java.version>1.8</java.version>
  18.  
    </properties>
  19.  
    <dependencies>
  20.  
    <dependency>
  21.  
    <groupId>org.springframework.boot</groupId>
  22.  
    <artifactId>spring-boot-starter-data-redis</artifactId>
  23.  
    </dependency>
  24.  
    <dependency>
  25.  
    <groupId>org.springframework.boot</groupId>
  26.  
    <artifactId>spring-boot-starter-web</artifactId>
  27.  
    </dependency>
  28.  
     
  29.  
    <dependency>
  30.  
    <groupId>org.springframework.boot</groupId>
  31.  
    <artifactId>spring-boot-starter-test</artifactId>
  32.  
    <scope>test</scope>
  33.  
    </dependency>
  34.  
     
  35.  
    <dependency>
  36.  
    <groupId>redis.clients</groupId>
  37.  
    <artifactId>jedis</artifactId>
  38.  
    </dependency>
  39.  
    <!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
  40.  
    <dependency>
  41.  
    <groupId>com.alibaba</groupId>
  42.  
    <artifactId>fastjson</artifactId>
  43.  
    <version>1.2.75</version>
  44.  
    </dependency>
  45.  
     
  46.  
    </dependencies>
  47.  
     
  48.  
    <build>
  49.  
    <plugins>
  50.  
    <plugin>
  51.  
    <groupId>org.springframework.boot</groupId>
  52.  
    <artifactId>spring-boot-maven-plugin</artifactId>
  53.  
    </plugin>
  54.  
    </plugins>
  55.  
    </build>
  56.  
    </project>

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

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

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

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

【连接单击redis配置】

  1.  
    spring:
  2.  
    #redis配置
  3.  
    redis:
  4.  
    database: 0
  5.  
    host: 192.168.133.147
  6.  
    port: 6379
  7.  
    timeout: 5000
  8.  
    password: 123456

【连接redis集群配置】

  1.  
    spring:
  2.  
    redis:
  3.  
    cluster:
  4.  
    nodes:
  5.  
    - 192.168.133.149:9001
  6.  
    - 192.168.133.149:9002
  7.  
    - 192.168.133.149:9003
  8.  
    - 192.168.133.149:9004
  9.  
    - 192.168.133.149:9005
  10.  
    - 192.168.133.149:9006
  11.  
    max-redirects: 6 #节点数量
  12.  
    jedis:
  13.  
    pool:
  14.  
    max-active: 16 #最大的连接数
  15.  
    max-wait: 3000 #最大的等待时间
  16.  
    max-idle: 8 #最大空闲数
  17.  
    min-idle: 0 #最小空闲数

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

  1.  
    @Configuration
  2.  
    public class RedisConfig{
  3.  
    /*配置order,如果不配置添加数据,redis中的key和value乱码*/
  4.  
    @Bean
  5.  
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
  6.  
    RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
  7.  
    redisTemplate.setConnectionFactory(redisConnectionFactory);
  8.  
    // 创建一个json的序列化方式
  9.  
    GenericJackson2JsonRedisSerializer jackson2JsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
  10.  
    // 设置value用jackjson进行处理
  11.  
    redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
  12.  
    // 设置key用string序列化方式
  13.  
    redisTemplate.setKeySerializer(new StringRedisSerializer());
  14.  
    // 设置hash的键
  15.  
    redisTemplate.setHashKeySerializer(new StringRedisSerializer());
  16.  
    // 设置hash的value序列化
  17.  
    redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
  18.  
    redisTemplate.afterPropertiesSet();
  19.  
    return redisTemplate;
  20.  
    }
  21.  
    }

3、redisTemplate操作String类型的数据

【操作结果】

学新通

 【具体测试代码】

  1.  
    @Controller
  2.  
    public class TestController {
  3.  
    @Resource
  4.  
    private RedisTemplate redisTemplate;
  5.  
    //数据缓存值redis,String类型
  6.  
    @RequestMapping("/testString")
  7.  
    @ResponseBody
  8.  
    public void testString() throws Exception {
  9.  
    System.out.println("======132=========");
  10.  
    //创建操作字符串类型数据的对象
  11.  
    ValueOperations opsString=redisTemplate.opsForValue();
  12.  
    //使用1、添加一条key为username,值为shiyilang的String
  13.  
    opsString.set("username", "shiyilang");
  14.  
    //使用2、查询key为username的值
  15.  
    opsString.get("username");
  16.  
    //使用3:multiSet同时添加多个key和value
  17.  
    Map<String,Object> map=new HashMap<String,Object>();
  18.  
    map.put("a","123");
  19.  
    map.put("b","234");
  20.  
    opsString.multiSet(map);
  21.  
    //使用4:添加key:username,value:晓春qie数据有效期为30秒
  22.  
    opsString.set("username","xiaochun",3000,TimeUnit.SECONDS);
  23.  
    //使用6:getAndSet取值之后,重新赋值为大春
  24.  
    opsString.getAndSet("username","大春");
  25.  
    //使用7:为sex的值增加2
  26.  
    opsString.increment("sex",2);
  27.  
    //使用8:为sex的值增加减2
  28.  
    opsString.decrement("sex",3);
  29.  
    }
  30.  
    }

4、redisTemplate操作Hash类型数据

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

【测试结果】

学新通

【测试代码】

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

5、redisTemplate操作List类型数据

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

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

【测试结果】

学新通

 【测试代码】

  1.  
    @Controller
  2.  
    public class TestController {
  3.  
    @Resource
  4.  
    private RedisTemplate redisTemplate;
  5.  
     
  6.  
    //redsiTemplate操作List类型数据
  7.  
    @RequestMapping("/testList")
  8.  
    @ResponseBody
  9.  
    public void testList() throws Exception {
  10.  
    ListOperations<String,Object> opsList=redisTemplate.opsForList();
  11.  
    //用法1:向列表list左边添加值1
  12.  
    opsList.leftPush("list","1");
  13.  
    //用法2:向列表list左边添加多个值
  14.  
    String []a={"3","4","5"};
  15.  
    opsList.leftPushAll("list",a);
  16.  
    //用法3:向列表list右边边添加值
  17.  
    opsList.rightPush("list","1");
  18.  
    //用法4:向列表list右边添加多个值
  19.  
    String []b={"7","8","9"};
  20.  
    opsList.rightPushAll("list",b);
  21.  
    //用法5:从集合的左边弹出三个数,并从结合中删除这三个元素,如:[5, 4, 3]
  22.  
    List<Object> mvalue=opsList.leftPop("list",3);
  23.  
    System.out.println(mvalue);
  24.  
    //用法6:从集合的右边弹出三个数,并从结合中删除这三个元素
  25.  
    opsList.rightPop("list",3);
  26.  
    //用法7:将集合list右边的值弹出,移动到list1的左边
  27.  
    opsList.rightPopAndLeftPush("list","list");
  28.  
    }
  29.  
    }

 6、redisTemplate操作set类型数据

数据不重复且没有顺序

【测试结果】

学新通

 【测试代码】

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

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、具体应用

【测试结果】

学新通

 【测试代码】

  1.  
    @Controller
  2.  
    public class TestController {
  3.  
    @Resource
  4.  
    private RedisTemplate redisTemplate;
  5.  
     
  6.  
    //redsiTemplate操作set类型数据
  7.  
    @RequestMapping("/testZSET")
  8.  
    @ResponseBody
  9.  
    public void testZSET(){
  10.  
    ZSetOperations<String,Object> opsZSET= redisTemplate.opsForZSet();
  11.  
    //用法1:向集合zset中添加值java,且分数score设置为1
  12.  
    opsZSET.add("zset","java",1);
  13.  
    //用法2:获取java的score
  14.  
    Double score1=opsZSET.score("zset","java");
  15.  
    //用法3:获取zset中成员的数量
  16.  
    long count=opsZSET.zCard("zset");
  17.  
    //用法4:删除zset集合中的java
  18.  
    String []arr={"java"};
  19.  
    opsZSET.remove("zset");
  20.  
    //按用法5:照范围删除,-1表示最后
  21.  
    opsZSET.removeRange("zset",0,-1);
  22.  
    //用法6:删除集合zset中score在20-30的所有数据
  23.  
    opsZSET.removeRangeByScore("zset",20,30);
  24.  
    //用法7:按照score从到小返回数据
  25.  
    Set<Object> sets=opsZSET.reverseRange("zset",0,-1);
  26.  
    Iterator<Object> ites= sets.iterator();
  27.  
    while(ites.hasNext()){
  28.  
    System.out.println(ites.next());
  29.  
    }
  30.  
    //用法8:返回集合zset中20-30的数据,且按照从低到高排序
  31.  
    opsZSET.rangeByScore("zset",20,30);
  32.  
    //用法9:为集合zset中java的score值增加5
  33.  
    opsZSET.incrementScore("zset","java",5);
  34.  
    //用法10:获取分数在20-30之间的成员
  35.  
    opsZSET.count("zset",20,30);
  36.  
    //用法11:按照从小到大规则,返回java在集合zset中的排名
  37.  
    opsZSET.rank("zset","java");
  38.  
    //用法12:按照从大到小规则,返回java在集合zset中的排名
  39.  
    opsZSET.reverseRank("zset","java");
  40.  
    }
  41.  
    }

8、redisTemplate的通用命令

  1.  
    @Controller
  2.  
    public class TestController {
  3.  
    @Resource
  4.  
    private RedisTemplate redisTemplate;
  5.  
    //redsiTemplate操作,通用命令
  6.  
    @RequestMapping("/testGe")
  7.  
    @ResponseBody
  8.  
    public void testGe() {
  9.  
    //用法1:获取指定的keyz值,如*,??list,keys*
  10.  
    redisTemplate.keys("");
  11.  
    //用法2:删除指定的key
  12.  
    redisTemplate.delete("");
  13.  
    //用法3:给key重命名
  14.  
    redisTemplate.rename("","");
  15.  
    //用法4:设置key的有效期
  16.  
    redisTemplate.expire("username",3000,TimeUnit.SECONDS);
  17.  
    //用法5:获取key的有效期
  18.  
    redisTemplate.getExpire("username",TimeUnit.SECONDS);
  19.  
    //用法6:清楚key的有效期
  20.  
    redisTemplate.persist("username");
  21.  
    //用法7:判断key的类型
  22.  
    redisTemplate.type("");
  23.  
    }

9、源码下载

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

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhfhhffi
系列文章
更多 icon
同类精品
更多 icon
继续加载