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

在SpringBoot操作Redis数据库:StringRedisTemplate

武飞扬头像
小白的救赎
帮助1

一、RedisTemplate与StringRedisTemplate

二、Redis的五大数据类型

String

List 

Hash 

Set

SortedSet


首先想要在SpringBoot中操作Redis数据库需要先在pom.xml中导入坐标/引入依赖

  1.  
    <dependency>
  2.  
    <groupId>org.springframework.boot</groupId>
  3.  
    <artifactId>spring-boot-starter-data-redis</artifactId>
  4.  
    </dependency>

并且在application.yml中配置操作redis

  1.  
    spring:
  2.  
    redis:
  3.  
    host: localhost
  4.  
    #password:我是没配置密码的
  5.  
    port: 6379
  6.  
    database: 6 #操作的是6号数据库
  7.  
    pool:
  8.  
    max-active: 8 #最大连接数
  9.  
    max-wait: -1 #连接池最大阻塞等待时间 -1表示无限
  10.  
    max-idle: 4 #连接池中的最大空闲连接
  11.  
    min-idle: 0 #连接池中的最小空闲连接

一、RedisTemplate与StringRedisTemplate

其次我要先声明关于RedisTemplate类与StringRedisTemplate类之间的关系。学新通 我们可以发现这个StringRedisTemplate是继承RedisTemplate的。当我们直接使用RedisTemplate这个类去操作Redis的话,会导致存放进去的Key的名字被序列化。如以下代码:学新通

学新通

如果我们使用StringRedisTemplate这个类去存放数据就可以在Redis中看到我们的Key。当然,也可以使用实现序列化接口将这个存放的key值序列化修改,但我觉得没差。所以这篇文章我会使用StringRedisTemplate这个类在存放数据。学新通学新通

具体在StringRedisTemplate中操作Redis的五种基本类型如下:

操作字符串是使用opsForValue()方法

操作hash是使用opsForHash()方法

操作list是使用opsForList()方法

操作set是使用opsForSet()方法

操作有序set即sortedSet是使用opsForZSet()方法

二、Redis的五大数据类型

String

  1.  
    @SpringBootTest
  2.  
    public class SpringDataRedis {
  3.  
    @Autowired
  4.  
    private StringRedisTemplate redisTemplate;
  5.  
     
  6.  
    /**
  7.  
    * 测试Redis的String数据结构
  8.  
    */
  9.  
    @Test
  10.  
    void testRedisString(){
  11.  
    ValueOperations<String, String> valueOperations = redisTemplate.opsForValue();
  12.  
     
  13.  
    //存入值以及获取值(set、get)
  14.  
    valueOperations.set("StringKey1","张三");
  15.  
    String key1 = valueOperations.get("StringKey1");
  16.  
    System.out.println(key1);//张三
  17.  
     
  18.  
    //获取指定字符串的长度
  19.  
    Long key1Length = valueOperations.size("StringKey1");
  20.  
    System.out.println(key1Length);//6
  21.  
     
  22.  
    //存入数据设置缓存时间 TimeUnit.SECONDS 单位:秒
  23.  
    valueOperations.set("StringKey2","李四",10l, TimeUnit.SECONDS);
  24.  
     
  25.  
    //如果不存在(因为key不能重复)则插入成功返回true 反之返回false
  26.  
    Boolean a = valueOperations.setIfAbsent("StringKey1", "张三");
  27.  
    Boolean b = valueOperations.setIfAbsent("StringKey1", "王五");
  28.  
    System.out.println(a);//false
  29.  
    System.out.println(b);//false
  30.  
     
  31.  
    //删除指定key 成功返回true 否则false
  32.  
    Boolean c = valueOperations.getOperations().delete("StringKey1");
  33.  
    System.out.println(c);//true
  34.  
    }
  35.  
    }
学新通

List 

Redis List是简单的字符串列表,按照插入顺序排序。

学新通

  1.  
    /**
  2.  
    * 测试Redis的List数据结构
  3.  
    */
  4.  
    @Test
  5.  
    void testRedisList(){
  6.  
    ListOperations<String, String> listOperations = redisTemplate.opsForList();
  7.  
     
  8.  
    //在变量左边添加元素值 如果key不存在会新建 添加成功返回添加后的总个数
  9.  
    Long leftPush = listOperations.leftPush("ListKey1", "ListValue1");
  10.  
    System.out.println(leftPush);//1
  11.  
     
  12.  
    //向左边批量添加参数元素 如果key不存在会新建 添加成功返回添加后的总个数
  13.  
    Long leftPushAll = listOperations.leftPushAll("ListKey1", "ListValue2", "ListValue3");
  14.  
    System.out.println(leftPushAll);//3
  15.  
     
  16.  
    //删除指定集合 返回true删除成功
  17.  
    Boolean listKey1 = listOperations.getOperations().delete("ListKey1");
  18.  
    System.out.println(listKey1);//true
  19.  
     
  20.  
    //向右边(批量)添加元素
  21.  
    listOperations.rightPush("ListKey2", "Value1");
  22.  
    listOperations.rightPushAll("ListKey2", "ListValue2", "ListValue3");
  23.  
     
  24.  
    //获取指定区间的所有值
  25.  
    List<String> list = listOperations.range("ListKey2", 0, -1);
  26.  
    System.out.println(list);//[Value1, ListValue2, ListValue3]
  27.  
     
  28.  
    //将集合最右边弹出元素并返回值
  29.  
    String a = listOperations.rightPop("ListKey2");
  30.  
    System.out.println(a);//ListValue3
  31.  
    //将集合最左边弹出元素并返回值
  32.  
    String b = listOperations.leftPop("ListKey2");
  33.  
    System.out.println(b);//ListValue2
  34.  
    }
学新通

Hash 

Redis Hash 是一个String类型的field和value的映射表,hash特别适用于存储对象。

学新通

  1.  
    /**
  2.  
    * 测试Redis的Hash数据结构
  3.  
    */
  4.  
    @Test
  5.  
    void testRedisHash(){
  6.  
    HashOperations<String, Object, Object> hashOperations = redisTemplate.opsForHash();
  7.  
     
  8.  
    //向key中添加kv键值对
  9.  
    hashOperations.put("Key","field","value");
  10.  
     
  11.  
    //以kv键值对形式存到key中
  12.  
    Map<String,String> map = new HashMap<>();
  13.  
    map.put("field1","value1");
  14.  
    map.put("field2","value2");
  15.  
    hashOperations.putAll("Key",map);
  16.  
     
  17.  
    //获取key中所有的HashKey
  18.  
    Set<Object> redisHashKey = hashOperations.keys("Key");
  19.  
    System.out.println(redisHashKey);//[field,field1,field2]
  20.  
     
  21.  
    //获取key中的所有的Value值
  22.  
    List<Object> redisHashValues = hashOperations.values("Key");
  23.  
    System.out.println(redisHashValues);//[value,value1,value2]
  24.  
     
  25.  
    //获取key中所有的键值对
  26.  
    Map<Object, Object> redisHashMap = hashOperations.entries("Key");
  27.  
    System.out.println(redisHashMap);//{field=value,field1=value1,field2=value2}
  28.  
     
  29.  
    //获取key中指定HashKey的value值
  30.  
    Object o = hashOperations.get("Key", "field");
  31.  
    System.out.println(o);//value
  32.  
     
  33.  
    //获取key中所有HashKey的个数
  34.  
    Long HashKeySize = hashOperations.size("Key");
  35.  
    System.out.println(HashKeySize);//3
  36.  
     
  37.  
    //根据key去删除HashMap根据HashKey 返回删除成功后的数量
  38.  
    Long a = hashOperations.delete("Key","field1","field2");
  39.  
    System.out.println(a);//2
  40.  
    }
学新通

Set

Redis Set是String类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据

学新通

  1.  
    /**
  2.  
    * 测试Redis的Set数据机构
  3.  
    */
  4.  
    @Test
  5.  
    void testRedisSet(){
  6.  
    SetOperations<String, String> setOperations = redisTemplate.opsForSet();
  7.  
     
  8.  
    //将元素添加到名为names的集合中
  9.  
    setOperations.add("names","张三","李四","王五");
  10.  
     
  11.  
    //随机获取集合内的某个元素
  12.  
    String names = setOperations.randomMember("names");
  13.  
    System.out.println(names);
  14.  
     
  15.  
    //获取集合内索引下标为1的值
  16.  
    List<String> namesList = setOperations.randomMembers("names", 1);
  17.  
    System.out.println(namesList);//[李四]
  18.  
     
  19.  
    //获取集合内的元素个数
  20.  
    Long nameLength = setOperations.size("names");
  21.  
    System.out.println(nameLength);//3
  22.  
     
  23.  
    //判断集合内是否有该元素
  24.  
    Boolean b1 = setOperations.isMember("names", "张三");
  25.  
    Boolean b2 = setOperations.isMember("names", "小七");
  26.  
    System.out.println(b1);//true
  27.  
    System.out.println(b2);//false
  28.  
     
  29.  
    //删除集合内的元素 可以删除单个或者多个
  30.  
    Long remove = setOperations.remove("names", "王五");
  31.  
    System.out.println(setOperations.size("names"));//2
  32.  
     
  33.  
    //再次创建一个集合
  34.  
    setOperations.add("namesTwo","阿三","李四","五五","赵六");
  35.  
     
  36.  
    //获取两个集合的差集(不同的元素)
  37.  
    Set<String> difference = redisTemplate.opsForSet().difference("names", "namesTwo");
  38.  
    System.out.println(difference);//[张三]
  39.  
     
  40.  
    //获取两个集合的相同集合元素
  41.  
    Set<String> intersect = redisTemplate.opsForSet().intersect("names", "namesTwo");
  42.  
    System.out.println(intersect);//[李四]
  43.  
     
  44.  
    //获取两个集合的并集(集合的全部元素)
  45.  
    Set<String> union = redisTemplate.opsForSet().union("names", "namesTwo");
  46.  
    System.out.println(union);//[赵六, 五五, 李四, 阿三, 张三]
  47.  
    }
学新通

SortedSet

Redis SortedSet有序集合是String类型元素的集合,且不允许重复的成员,每个元素都会关联一个double类型的分数(score)。Redis中正式通过分数来为集合中的成员进行从小到大排序。有序集合的成员是唯一的。但分数却可以重复。

学新通

  1.  
    /**
  2.  
    * 测试Redis的SortedSet数据结构
  3.  
    */
  4.  
    @Test
  5.  
    void testRedisSortedSet(){
  6.  
    ZSetOperations<String,String> zSetOperations = redisTemplate.opsForZSet();
  7.  
     
  8.  
    //第一种使用SortedSet集合添加元素的方法 添加成功与否并且判断返回布尔值
  9.  
    Boolean add = zSetOperations.add("zSet", "a", 2.5);
  10.  
    System.out.println(add);//true
  11.  
     
  12.  
    //第二种添加元素的方法需要传入key以及一个Set<TypedTuple<String>>
  13.  
    ZSetOperations.TypedTuple<String> typedTuple1 = new DefaultTypedTuple<>("b",0.1);
  14.  
    ZSetOperations.TypedTuple<String> typedTuple2 = new DefaultTypedTuple<>("c",3.0);
  15.  
    Set<ZSetOperations.TypedTuple<String>> set = new HashSet();
  16.  
    set.add(typedTuple1);
  17.  
    set.add(typedTuple2);
  18.  
    Long zSet = zSetOperations.add("zSet", set);
  19.  
    System.out.println(zSet);//2
  20.  
     
  21.  
    //获取其集合内的元素个数
  22.  
    Long size = zSetOperations.size("zSet");
  23.  
    System.out.println(size);//3
  24.  
     
  25.  
    //获取区间内的值 0到-1表示全部值
  26.  
    //因为是有序Set 所以按照升序排序:b为0.1 a为2.5 c为3.0
  27.  
    Set<String> zSetRange = zSetOperations.range("zSet", 0,-1);
  28.  
    System.out.println(zSetRange);//[b, a, c]
  29.  
     
  30.  
    //获取指定大小内的值
  31.  
    Set<String> zSetRangeByScore = zSetOperations.rangeByScore("zSet", 2, 3);
  32.  
    System.out.println(zSetRangeByScore);//[a,c]
  33.  
     
  34.  
    //返回集合中值在2-3的元素个数
  35.  
    Long zSetCount = zSetOperations.count("zSet", 2, 3);
  36.  
    System.out.println(zSetCount);//2
  37.  
     
  38.  
    //获得元素的下标
  39.  
    Long rank = zSetOperations.rank("zSet", "b");
  40.  
    System.out.println(rank);//0
  41.  
     
  42.  
    //获得元素的值
  43.  
    Double score = zSetOperations.score("zSet", "b");
  44.  
    System.out.println(score);//0.1
  45.  
     
  46.  
    //修改元素的分值(原先的值加上后面的值)
  47.  
    //此时集合内的元素升序排序为:b为0.1,c为3.0,a为2.5 3.5 = 6.0
  48.  
    Double d = zSetOperations.incrementScore("zSet", "a", 3.5);
  49.  
    System.out.println(d);//6.0
  50.  
     
  51.  
    //根据分值移除区间元素 返回删除的数量
  52.  
    //此时删除的是b元素 那么集合内剩下:c为3.0,a为6.0
  53.  
    Long removeRangeByScore =zSetOperations.removeRangeByScore("zSet", 0, 1);
  54.  
    System.out.println(removeRangeByScore);//1
  55.  
     
  56.  
    //将区间内的元素进行反转并且返回集合
  57.  
    Set<String> reverseRange = zSetOperations.reverseRange("zSet", 0, 1);
  58.  
    System.out.println(reverseRange);//[a, c]
  59.  
     
  60.  
    //批量移除元素根据元素值 返回删除的元素数量
  61.  
    Long remove = zSetOperations.remove("zSet", "a", "b");
  62.  
    System.out.println(remove);//1
  63.  
    }
学新通

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

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