在SpringBoot中操作Redis数据库之StringRedisTemplate

news2024/12/26 10:51:44

一、RedisTemplate与StringRedisTemplate

二、Redis的五大数据类型

String

List 

Hash 

Set

SortedSet


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

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

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

spring:
  redis:
    host: localhost
    #password:我是没配置密码的
    port: 6379
    database: 6 #操作的是6号数据库
    pool:
      max-active: 8 #最大连接数
      max-wait: -1 #连接池最大阻塞等待时间 -1表示无限
      max-idle: 4 #连接池中的最大空闲连接
      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

@SpringBootTest
public class SpringDataRedis {
    @Autowired
    private StringRedisTemplate redisTemplate;

    /**
     * 测试Redis的String数据结构
     */
    @Test
    void testRedisString(){
        ValueOperations<String, String> valueOperations = redisTemplate.opsForValue();

        //存入值以及获取值(set、get)
        valueOperations.set("StringKey1","张三");
        String key1 = valueOperations.get("StringKey1");
        System.out.println(key1);//张三

        //获取指定字符串的长度
        Long key1Length = valueOperations.size("StringKey1");
        System.out.println(key1Length);//6

        //存入数据设置缓存时间 TimeUnit.SECONDS 单位:秒
        valueOperations.set("StringKey2","李四",10l, TimeUnit.SECONDS);

        //如果不存在(因为key不能重复)则插入成功返回true 反之返回false
        Boolean a = valueOperations.setIfAbsent("StringKey1", "张三");
        Boolean b = valueOperations.setIfAbsent("StringKey1", "王五");
        System.out.println(a);//false
        System.out.println(b);//false

        //删除指定key 成功返回true 否则false
        Boolean c = valueOperations.getOperations().delete("StringKey1");
        System.out.println(c);//true
    }
}

List 

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

    /**
     * 测试Redis的List数据结构
     */
    @Test
    void testRedisList(){
        ListOperations<String, String> listOperations = redisTemplate.opsForList();

        //在变量左边添加元素值 如果key不存在会新建 添加成功返回添加后的总个数
        Long leftPush = listOperations.leftPush("ListKey1", "ListValue1");
        System.out.println(leftPush);//1

        //向左边批量添加参数元素 如果key不存在会新建 添加成功返回添加后的总个数
        Long leftPushAll = listOperations.leftPushAll("ListKey1", "ListValue2", "ListValue3");
        System.out.println(leftPushAll);//3

        //删除指定集合 返回true删除成功
        Boolean listKey1 = listOperations.getOperations().delete("ListKey1");
        System.out.println(listKey1);//true

        //向右边(批量)添加元素
        listOperations.rightPush("ListKey2", "Value1");
        listOperations.rightPushAll("ListKey2", "ListValue2", "ListValue3");

        //获取指定区间的所有值
        List<String> list = listOperations.range("ListKey2", 0, -1);
        System.out.println(list);//[Value1, ListValue2, ListValue3]

        //将集合最右边弹出元素并返回值
        String a = listOperations.rightPop("ListKey2");
        System.out.println(a);//ListValue3
        //将集合最左边弹出元素并返回值
        String b = listOperations.leftPop("ListKey2");
        System.out.println(b);//ListValue2
    }

Hash 

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

    /**
     * 测试Redis的Hash数据结构
     */
    @Test
    void testRedisHash(){
        HashOperations<String, Object, Object> hashOperations = redisTemplate.opsForHash();

        //向key中添加kv键值对
        hashOperations.put("Key","field","value");

        //以kv键值对形式存到key中
        Map<String,String> map = new HashMap<>();
        map.put("field1","value1");
        map.put("field2","value2");
        hashOperations.putAll("Key",map);

        //获取key中所有的HashKey
        Set<Object> redisHashKey = hashOperations.keys("Key");
        System.out.println(redisHashKey);//[field,field1,field2]

        //获取key中的所有的Value值
        List<Object> redisHashValues = hashOperations.values("Key");
        System.out.println(redisHashValues);//[value,value1,value2]

        //获取key中所有的键值对
        Map<Object, Object> redisHashMap = hashOperations.entries("Key");
        System.out.println(redisHashMap);//{field=value,field1=value1,field2=value2}

        //获取key中指定HashKey的value值
        Object o = hashOperations.get("Key", "field");
        System.out.println(o);//value

        //获取key中所有HashKey的个数
        Long HashKeySize = hashOperations.size("Key");
        System.out.println(HashKeySize);//3

        //根据key去删除HashMap根据HashKey 返回删除成功后的数量
        Long a = hashOperations.delete("Key","field1","field2");
        System.out.println(a);//2
    }

Set

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

    /**
     * 测试Redis的Set数据机构
     */
    @Test
    void testRedisSet(){
        SetOperations<String, String> setOperations = redisTemplate.opsForSet();

        //将元素添加到名为names的集合中
        setOperations.add("names","张三","李四","王五");

        //随机获取集合内的某个元素
        String names = setOperations.randomMember("names");
        System.out.println(names);

        //获取集合内索引下标为1的值
        List<String> namesList = setOperations.randomMembers("names", 1);
        System.out.println(namesList);//[李四]

        //获取集合内的元素个数
        Long nameLength = setOperations.size("names");
        System.out.println(nameLength);//3

        //判断集合内是否有该元素
        Boolean b1 = setOperations.isMember("names", "张三");
        Boolean b2 = setOperations.isMember("names", "小七");
        System.out.println(b1);//true
        System.out.println(b2);//false

        //删除集合内的元素 可以删除单个或者多个
        Long remove = setOperations.remove("names", "王五");
        System.out.println(setOperations.size("names"));//2

        //再次创建一个集合
        setOperations.add("namesTwo","阿三","李四","五五","赵六");

        //获取两个集合的差集(不同的元素)
        Set<String> difference = redisTemplate.opsForSet().difference("names", "namesTwo");
        System.out.println(difference);//[张三]

        //获取两个集合的相同集合元素
        Set<String> intersect = redisTemplate.opsForSet().intersect("names", "namesTwo");
        System.out.println(intersect);//[李四]

        //获取两个集合的并集(集合的全部元素)
        Set<String> union = redisTemplate.opsForSet().union("names", "namesTwo");
        System.out.println(union);//[赵六, 五五, 李四, 阿三, 张三]
    }

SortedSet

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

    /**
     * 测试Redis的SortedSet数据结构
     */
    @Test
    void testRedisSortedSet(){
        ZSetOperations<String,String> zSetOperations = redisTemplate.opsForZSet();

        //第一种使用SortedSet集合添加元素的方法 添加成功与否并且判断返回布尔值
        Boolean add = zSetOperations.add("zSet", "a", 2.5);
        System.out.println(add);//true

        //第二种添加元素的方法需要传入key以及一个Set<TypedTuple<String>>
        ZSetOperations.TypedTuple<String> typedTuple1 = new DefaultTypedTuple<>("b",0.1);
        ZSetOperations.TypedTuple<String> typedTuple2 = new DefaultTypedTuple<>("c",3.0);
        Set<ZSetOperations.TypedTuple<String>> set = new HashSet();
        set.add(typedTuple1);
        set.add(typedTuple2);
        Long zSet = zSetOperations.add("zSet", set);
        System.out.println(zSet);//2

        //获取其集合内的元素个数
        Long size = zSetOperations.size("zSet");
        System.out.println(size);//3

        //获取区间内的值 0到-1表示全部值
        //因为是有序Set 所以按照升序排序:b为0.1 a为2.5 c为3.0
        Set<String> zSetRange = zSetOperations.range("zSet", 0,-1);
        System.out.println(zSetRange);//[b, a, c]

        //获取指定大小内的值
        Set<String> zSetRangeByScore = zSetOperations.rangeByScore("zSet", 2, 3);
        System.out.println(zSetRangeByScore);//[a,c]

        //返回集合中值在2-3的元素个数
        Long zSetCount = zSetOperations.count("zSet", 2, 3);
        System.out.println(zSetCount);//2

        //获得元素的下标
        Long rank = zSetOperations.rank("zSet", "b");
        System.out.println(rank);//0

        //获得元素的值
        Double score = zSetOperations.score("zSet", "b");
        System.out.println(score);//0.1

        //修改元素的分值(原先的值加上后面的值)
        //此时集合内的元素升序排序为:b为0.1,c为3.0,a为2.5 + 3.5 = 6.0
        Double d = zSetOperations.incrementScore("zSet", "a", 3.5);
        System.out.println(d);//6.0

        //根据分值移除区间元素 返回删除的数量
        //此时删除的是b元素 那么集合内剩下:c为3.0,a为6.0
        Long removeRangeByScore =zSetOperations.removeRangeByScore("zSet", 0, 1);
        System.out.println(removeRangeByScore);//1

        //将区间内的元素进行反转并且返回集合
        Set<String> reverseRange = zSetOperations.reverseRange("zSet", 0, 1);
        System.out.println(reverseRange);//[a, c]

        //批量移除元素根据元素值 返回删除的元素数量
        Long remove = zSetOperations.remove("zSet", "a", "b");
        System.out.println(remove);//1
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/102480.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

“一体两翼”能否帮助贝壳穿越行业周期?

2022年的房地产行业处于逆周期中&#xff0c;供需双弱和融资困难笼罩在行业上空。数据显示&#xff0c;前三季度&#xff0c;国内百强房企全口径销售金额5.31万亿元&#xff0c;同比下降 45.8%&#xff1b;权益口径销售3.71万亿元&#xff0c;同比下降 46.3%。传统的销售旺季“…

前端:vue-element-admin 搭建踩坑笔记

❤️作者主页&#xff1a;IT技术分享社区 ❤️作者简介&#xff1a;大家好,我是IT技术分享社区的博主&#xff0c;从事C#、Java开发九年&#xff0c;对数据库、C#、Java、前端、运维、电脑技巧等经验丰富。 ❤️个人荣誉&#xff1a; 数据库领域优质创作者&#x1f3c6;&#x…

【MySQL基础教程】MySQL概述、安装与数据模型

前言 本文为 【MySQL基础教程】 相关内容介绍&#xff0c;下边将对MySQL概述&#xff0c;MySQL数据库介绍与安装&#xff08;包括&#xff1a;MySQL数据库版本、MySQL数据库下载、MySQL数据库安装、MySQL启动与停止、客户端连接&#xff09;&#xff0c;数据模型&#xff08;包…

深入浅出学习Linux

Linux作为自由软件有两个特点&#xff1a;一是它免费提供源代码&#xff0c;二是爱好者可以根据自己的需要自由修改、复制和发布源码 Linux的发行版说简单点就是将Linux内核与应用软件做一个打包。 1、Red Hat Linux&#xff08;小红帽&#xff09;&#xff1a;创作于1993年 2…

程序人生与世界杯的火花

卡塔尔世界杯 文章目录1.第一次了解世界杯2.世界杯使用了哪些新技术3.AI 艺术画4.Python代码画了个球状5.踢球和软件团队开发软件有什么异同6.体育是一种国际语言1.第一次了解世界杯 2010年南非世界杯&#xff0c;那会好像记得上大二&#xff0c;学校包车去的五棵松体育馆&…

CSAPP Architecture Lab PartC满分

CSAPP Architecture Lab 此lab涉及Y86-64的实现&#xff0c;具体Y86的内容可查看CSAPP第四章,做完本实验可以提高你对处理器设计以及软件与硬件的理解。 从CMU官网下载完所需实验包后&#xff0c;参考实验所给的官方文档simguide.pdf&#xff0c;首先建立实验环境&#xff0c…

Zookeeper生产常用命令大全(最新3.8.0版本)

文章目录官方文档一、服务端二、客户端1、连接客户端2、help3、create1> 创建持久节点2> 创建临时节点3> 创建持久有序节点4> 创建临时有序节点5> 创建ttl节点6> 创建容器节点4、get5、set6、ls7、stat8、删除节点1> delete2> deleteall8、其他命令二、…

PID算法控制

文章目录一、PID算法二、控制方法对比PID的手动整定PID衰减曲线整定PID调节器各校正环节的作用是&#xff1a;计算注意事项PID算法的一般表达式是&#xff1a;一、PID算法 PID控制是最早发展的自动控制策略之一&#xff0c;是微机化控制系统的一个重要组成部分&#xff0c;整个…

大数据必学Java基础(一百一十五):Session域监听器

文章目录 Session域监听器 一、Session域共有四个监听器接口 二、监听器代码 Session域监听器

学好Python的未来7大就业方向,月薪不低于2w!

最近很多人都有一个问题&#xff1a;“ 我想学 Python&#xff0c;但是学完 Python 后都能干啥 &#xff1f;” “ 现在学 Python&#xff0c;哪个方向最简单&#xff1f;哪个方向最吃香 &#xff1f;” “ …… ” 相信不少 Python 的初学者&#xff0c;都会遇到上面的这些…

[ 数据结构 -- 手撕排序算法第六篇 ] 快速排序(非递归版本)

文章目录前言一、常见的排序算法二、快速排序的非递归版本三、具体步骤四、非递归的代码实现五、时间复杂度4.1最好情况4.2最坏情况六、总结前言 手撕排序算法第六篇&#xff1a;快速排序&#xff01; 从本篇文章开始&#xff0c;我会介绍并分析常见的几种排序&#xff0c;例如…

143744-88-1,标记肽Dansyl-GCVLS

法尼基二磷酸法尼基转移酶(FTase)的荧光底物。该五肽基于H-Ras的c端区域&#xff0c;其n端有一个丹酚基团。由于半胱氨酸巯基的法尼化作用&#xff0c;丹酚基从极性分子环境变为非极性分子环境&#xff0c;伴随而来的是荧光增强和丹酚基向较低波长发射最大值的转移。该产物的完…

【设计模式】代理模式 (六)

文章目录5.1 代理模式5.1.1 概述5.1.2 结构5.1.3 静态代理5.1.4 JDK动态代理5.1.5 CGLIB动态代理5.1.6 三种代理的对比5.1.7 优缺点5.1.8 使用场景5.1 代理模式 5.1.1 概述 由于某些原因需要给某对象提供一个代理以控制对该对象的访问。这时&#xff0c;访问对象不适合或者不…

程序员现状分析,什么时候是进入IT行业的黄金时期?千万注意了

近些来&#xff0c;程序员成为了很多人就业的首选。但是大多数人对于程序员的了解仅仅停留在了薪资待遇上&#xff0c;但是他们对于程序员的工作却所知甚少。甚至有不少人只听说了程序员的工资很高&#xff0c;并不知道程序员的工资会高到什么地步。 其实近些年来&#xff0c;随…

Mysql窗口函数 (知识点梳理+题目解析+面试实战)(四万字长文,一文读懂,建议收藏后食用)

前言&#xff1a; 本文章是原创50篇时开启的纪念作&#xff0c;之前的文章基本5000字&#xff0c;而本篇约4.5万字&#xff0c;真一篇顶九篇。 窗口函数作为Mysql 8的新特性以及面试笔试的重点&#xff0c;掌握并且进行来练习是非常有必要的。本文章详细介绍窗口函数的方…

uni-app app分享到朋友和朋友圈

app分享到朋友和朋友圈 uni.share(OBJECT) uni-app的App引擎封装了微信、QQ、微博的分享SDK&#xff0c;开发者可以直接调用相关功能 可以分享到微信、QQ、微博&#xff0c;每个社交平台被称为分享服务提供商&#xff0c;即provider。 可以分享文字、图片、图文、音乐、视频…

热门技术中的应用:微服务相关协议-第32讲-RPC协议综述:远在天边,近在眼前

前面我们讲了容器网络如何实现跨主机互通,以及微服务之间的相互调用。 网络是打通了,那服务之间的互相调用,该怎么实现呢?你可能说,咱不是学过Socket吗。服务之间分调用方和被调用方,我们就建立一个TCP或者UDP的连接,不就可以通信了? 你仔细想一下,这事儿没这么简单。…

[附源码]计算机毕业设计Python高校商铺管理系统论文(程序+源码+LW文档)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等…

微服务框架 SpringCloud微服务架构 微服务面试篇 54 微服务篇 54.3 Nacos 如何支撑数十万服务注册压力?

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式&#xff0c;系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 微服务面试篇 文章目录微服务框架微服务面试篇54 微服务篇54.3 Nacos 如何支撑数十万服务注册压力&#xff1f;54.3.1 Nacos 服务端源码54 微…

信息提取 Information Extraction

定义 信息提取任务是从一组非结构化自然语言文本中的每个文本中识别有关实体、关系或事件的预定义类的信息&#xff0c;并通过以下任一方式以结构化形式记录此信息&#xff1a; • 注释源文本&#xff0c;使用 XML 标签 • 填写与文本分开的数据结构&#xff0c;例如模板或数据…