RedisTemplate对象中方法的使用

系列文章目录


文章目录

  • 系列文章目录
  • 前言


前言

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。
在这里插入图片描述


Redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。
在这里插入图片描述
RedisTemplate的两种使用方式,分别是:

opsFor的方式

bound的方式

Redis中有五种基础数据类型,RedisTemplate对象针对不同的数据类型,进行了不同的封装,将相同类型操作封装为Operation接口,分别如下所示:
在这里插入图片描述
另外,考虑到每次操作都需要指定对应的【key】名称,所以为了简化指定【key】名称的操作,RedisTemplate对象也提供了绑定key的Operations接口,分别如
在这里插入图片描述
通过opsFor操作redis
下面就介绍一下通过opsFor的方式操作各种数据类型的方法。

(1)操作string字符串类型

public void demo01() {
    // 操作字符串
    ValueOperations ops = redisTemplate.opsForValue();
    // 设置key-value,等价于redis命令:set
    ops.set("k1", "100");
    // 设置过期时间,等价于redis命令:setex
    ops.set("k2", "200", 2, TimeUnit.SECONDS);
    // key不存在,则设置,等价于redis命令:setnx
    ops.setIfAbsent("k3", "300");
    ops.set("k4", "this is a string.");
    // 追加内容,等价于redis命令:append
    ops.append("k4", "redis string");
    // 获取长度,等价于redis命令:strlen
    Long k4 = ops.size("k4");
    // 自增1,等价于redis命令:incr
    ops.increment("k1");
    // 自增指定步长,等价于redis命令:incrby
    ops.increment("k1", 10);
    // 自减1,等价于redis命令:decr
    ops.decrement("k3");
    // 自减指定步长,等价于redis命令:decrby
    ops.decrement("k3", 20);
    Map<String, String> map = new HashMap<>();
    map.put("kk1", "vv100");
    map.put("kk2", "vv200");
    // 等价于redis命令:mset
    ops.multiSet(map);
    List<String> keys = new ArrayList<>();
    keys.add("kk1");
    keys.add("kk2");
    // 等价于redis命令:mget
    List list = ops.multiGet(keys);
    map = new HashMap<>();
    map.put("kk1", "vv100");
    map.put("kk3", "vv300");
    // 等价于redis命令:msetnx
    Boolean aBoolean = ops.multiSetIfAbsent(map);
    // 等价于redis命令:get
    Object k1 = ops.get("k1");
    // 等价于redis命令:getset
    Object obj = ops.getAndSet("kk1", "bak_vv100");
    // 等价于redis命令:getrange
    String kk2 = ops.get("kk2", 0, 1);
    // 等价于redis命令:del
    Boolean k3 = ops.getOperations().delete("k3");
}

(2)操作List集合类型

public void demo02() {
    ListOperations ops = redisTemplate.opsForList();
    // 左边添加元素,等价于redis命令:lpush
    ops.leftPush("k1", "100");
    ops.leftPushAll("k2", "100", "200", "300");
    List<Integer> addList = new ArrayList<>();
    addList.add(100);
    addList.add(200);
    ops.leftPushAll("k3", addList);
    // 右边添加元素,等价于redis命令:rpush
    ops.rightPush("k11", "100");
    ops.rightPushAll("k22", "100", "200", "300");
    List<Integer> addList2 = new ArrayList<>();
    addList2.add(100);
    addList2.add(200);
    ops.rightPushAll("k33", addList2);
    // 等价于redis命令:lpop
    Object k2 = ops.leftPop("k2");
    // 等价于redis命令:rpop
    Object k22 = ops.rightPop("k22");
    // 等价于redis命令:rpoplpush
    Object push = ops.rightPopAndLeftPush("k22", "k2");
    // 等价于redis命令:lrange
    List k21 = ops.range("k2", 0, -1);
    // 等价于redis命令:lindex
    Object k221 = ops.index("k22", 1);
    // 等价于redis命令:llen
    Long k33 = ops.size("k33");
    // 等价于redis命令:lrem
    Long k3 = ops.remove("k3", 1, "100");
    // 等价于redis命令:lset
    ops.set("k33", 2, "new_200");
}

(3)操作Set集合类型

public void demo03() {
    SetOperations ops = redisTemplate.opsForSet();
    // 等价于redis命令:sadd
    ops.add("k1", "100", "200", "300");
    // 等价于redis命令:smembers
    Set k1 = ops.members("k1");
    // 等价于redis命令:sismember
    Boolean k11 = ops.isMember("k1", "400");
    // 等价于redis命令:sacrd
    Long k12 = ops.size("k1");
    // 等价于redis命令:srem
    Long k13 = ops.remove("k1", "100", "300");
    // 等价于redis命令:spop
    Object k14 = ops.pop("k1");
    List k15 = ops.pop("k1", 2);
    // 等价于redis命令:srandmember
    Object k16 = ops.randomMember("k1");
    List k17 = ops.randomMembers("k1", 2);
    // 等价于redis命令:smove
    Boolean move = ops.move("k1", "v100", "k2");
    // 等价于redis命令:sinter
    List<String> keyLists = new ArrayList<>();
    keyLists.add("k1");
    keyLists.add("k2");
    Set intersect = ops.intersect(keyLists);
    // 求k1和k2的交集,然后将结果保存到k3中
    Long aLong2 = ops.intersectAndStore("k1", "k2", "k3");
    // 等价于redis命令:sunion
    Set union = ops.union(keyLists);
    // 求k1和k2的并集,然后将结果保存到k3中
    Long aLong1 = ops.unionAndStore("k1", "k2", "k3");
    // 等价于redis命令:sdiff
    Set difference = ops.difference(keyLists);
    // 求k1和k2的差集,然后将结果保存到k3中
    Long aLong = ops.differenceAndStore("k1", "k2", "k3");
}

(4)操作Hash类型

public void demo04() {
    HashOperations ops = redisTemplate.opsForHash();
    // 等价于redis命令:hset
    ops.put("k1", "h1", "v100");
    // 等价于redis命令:hget
    Object o = ops.get("k1", "h2");
    // 等价于redis命令:hkeys
    Set k11 = ops.keys("k1");
    // 等价于redis命令:hvals
    List k1 = ops.values("k1");
    // 等价于redis命令:hmset
    Map<String, String> map = new HashMap<>();
    map.put("h1", "v100");
    map.put("h2", "v200");
    ops.putAll("k2", map);
    // 等价于redis命令:hdel
    Long delete = ops.delete("k1", "h1", "h3");
    // 等价于redis命令:hsetnx
    Boolean aBoolean = ops.putIfAbsent("k1", "h2", "v200");
    // 等价于redis命令:hincrby
    Long increment = ops.increment("k1", "h1", 10);
    Long increment1 = ops.increment("k1", "h2", -20);
}

(5)操作ZSet类型

public void demo05() {
    ZSetOperations ops = redisTemplate.opsForZSet();
    // 等价于redis命令:zadd
    Boolean add = ops.add("k1", "v100", 100);
    DefaultTypedTuple<String> dtt1 = new DefaultTypedTuple<>("v100", 100.0);
    DefaultTypedTuple<String> dtt2 = new DefaultTypedTuple<>("v200", 200.0);
    Set<DefaultTypedTuple<String>> set = new HashSet<>();
    set.add(dtt1);
    set.add(dtt2);
    Long k2 = ops.add("k2", set);
    // 等价于redis命令:zrange
    Set k1 = ops.range("k1", 0, -1);
    Set k11 = ops.rangeWithScores("k1", 0, -1);
    // 等价于redis命令:zrangebyscore
    Set k12 = ops.rangeByScore("k1", 10.0, 52.0);
    Set k13 = ops.rangeByScoreWithScores("k1", 10.0, 52.0);
    // 等价于redis命令:zrevrangebyscore
    Set k21 = ops.reverseRangeByScore("k2", 100.0, 30.0);
    Set k22 = ops.reverseRangeByScoreWithScores("k2", 100.0, 30.0);
    // 等价于redis命令:zincrby
    Double aDouble = ops.incrementScore("k1", "v100", 10);
    Double aDouble1 = ops.incrementScore("k1", "v200", -20);
    // 等价于redis命令:zrem
    Long remove = ops.remove("k1", "v100", "v300");
    // 等价于redis命令:zcount
    Long k14 = ops.count("k1", 10.0, 52.0);
    // 等价于redis命令:zrank
    Long rank = ops.rank("k1", "v100");
}

通过Bound操作redis
通过opsFor的方式来操作redis,可以发现有一个缺点,就是每次都需要我们指定要操作哪个【key】的数据,如果项目中,存在很多地方,那么就需要指定多次【key】名称,这就容易导致【key】名称不一致的情况,假设某个地方不小心写错了,也很难发现问题出在哪里,所以,为了解决这个问题,同时简化代码的编写,redisTemplate提供了绑定【key】的方式来操作redis。

opsFor和bound两种方式对比:
在这里插入图片描述
从上面可以看出,通过bound方式操作redis,只需要一个地方指定【key】名称即可。bound的操作方式只是简化了opsFor中key名称的,其余的方法都是和opsFor的操作方法名称一致的,这里就不再黏贴多余的代码了。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Java探索之旅】方法重载 递归

&#x1f3a5; 屿小夏 &#xff1a; 个人主页 &#x1f525;个人专栏 &#xff1a; Java编程秘籍 &#x1f304; 莫道桑榆晚&#xff0c;为霞尚满天&#xff01; 文章目录 &#x1f4d1;前言一、方法重载1.1 为什么要有方法重载1.2 方法重载的概念与使用1.3 方法签名 二、递归2…

车机系统与Android的关系

前言&#xff1a;搞懂 Android 系统和汽车到底有什么关系。 文章目录 一、基本概念1、Android Auto1&#xff09;是什么2&#xff09;功能 2、Google Assistant3、Android Automotive1、Android Auto 和 Android Automotive 的区别 4、App1&#xff09;App 的开发2&#xff09;…

【生产案例面试题】JVM调优

写作目的 最近上线了一个需求&#xff0c;遇到了一个JVM报警的问题&#xff0c;很荣幸能遇到&#xff0c;在此分享一下整个调优的过程。 背景 我们是中台服务&#xff0c;我们的甲方就是上游不同的业务。中台原则上是业务和能力分离&#xff0c;但是不可避免的是分不开&…

网络通信三要素:IP、端口和协议

IP&#xff1a;设备在网络中的地址&#xff0c;是唯一的标识 IP&#xff1a;全程”互联网协议地址“&#xff0c;是分配给上网设备的唯一标志 IP地址有两种形式&#xff1a; IPv4&#xff1a;32位 IPv6&#xff1a;共128位。分成8段表示&#xff0c;每取四位编码成一个16进制…

全新付费进群系统源码 带定位完整版 附教程

搭建教程 Nginx1.2 PHP5.6-7.2均可 最好是7.2 第一步上传文件程序到网站根目录解压 第二步导入数据库&#xff08;dkewl.sql&#xff09; 第三步修改/config/database.php里面的数据库地址 第四步修改/config/extra/ip.php里面的域名 第四步设置伪静态thinkphp 总后台账…

大厂Java笔试题之百钱买百鸡问题

题目&#xff1a;公元五世纪&#xff0c;我国古代数学家张丘建在《算经》一书中提出了"百鸡问题"&#xff1a;鸡翁一值钱五&#xff0c;鸡母一值钱三&#xff0c;鸡雏三值钱一。 百钱买百鸡&#xff0c;问鸡翁、鸡母、鸡雏各几何&#xff1f; 现要求你打印出所有花一…

HarmonyOS实战开发-如何实现wlan激活和关闭、扫描和连接WIFI功能

介绍 本示例通过ohos.wifiManager 相关API实现wlan激活和关闭、扫描和连接WIFI等功能。 效果预览 使用说明 启动应用后会判断WLAN是否激活&#xff0c;如果是激活状态&#xff0c;会扫描并展示可用WiFi列表&#xff0c;同时获取已连接WiFi信息并展示&#xff1b;点击界面的S…

跨平台桌面应用 Electron 入门学习

本文章主要为该视频的学习笔记&#xff0c;如果侵权会速删。 Electron 01 课程介绍_哔哩哔哩_bilibiliElectron 01 课程介绍, 视频播放量 3046、弹幕量 0、点赞数 75、投硬币枚数 43、收藏人数 179、转发人数 2, 视频作者 极客丶张德龙, 作者简介 当你的能力还不足以撑起自己的…

基于博客系统的功能测试和性能测试

目录 项目介绍 项目功能 设计测试用例 功能测试--自动化测试 测试代码 登录测试 博客详情页测试 发布博客测试 删除博客测试 退出账号测试 性能测试 项目介绍 1.博客系统采用前后端分离的方法来实现&#xff0c;同时使用了数据库来存储相关的数据&#xff0c;同时将…

【一刷《剑指Offer》】面试题 3:二维数组中的查找

力扣对应题目链接&#xff1a;240. 搜索二维矩阵 II - 力扣&#xff08;LeetCode&#xff09; 核心考点&#xff1a;数组相关&#xff0c;特性观察&#xff0c;时间复杂度把握。 一、《剑指Offer》对应内容 二、分析题目 正常查找的过程本质就是排除的过程&#xff0c;谁排除…

AIGC专栏10——EasyAnimate 一个新的类SORA文生视频模型 轻松文生视频

AIGC专栏10——EasyAnimate 一个新的类SORA文生视频模型 &#x1f4fa;轻松文生视频 学习前言源码下载地址技术原理储备&#xff08;DIT/Lora/Motion Module&#xff09;什么是Diffusion Transformer (DiT)LoraMotion Module EasyAnimate简介EasyAnimate原理界面展示快速启动云…

RUM 最佳实践-交互延迟的探索与发现

FID 在互联网高速发展的时代&#xff0c;用户体验已成为企业竞争的关键所在。网页性能作为用户体验的重要组成部分&#xff0c;直接影响着用户的满意度和工作效率。First Input Delay&#xff08;FID&#xff09;作为衡量网页性能的重要指标&#xff0c;越来越受到业界关注。今…

万字长文深入理解Docker镜像分层原理、容器数据卷、网络通信架构(Docker系列第2章,共3章)

镜像分层的简单直观体现 在执行docker pull时&#xff0c;会发现多个Pull complete 字样&#xff0c;就能体现分层&#xff0c;如果是一个文件&#xff0c;只会有一个Pull complete 。 docker pull redis Using default tag: latest latest: Pulling from library/redis a2ab…

数据治理专家岗位的能力模型

数据治理专家的角色要求其具备全方位的专业素养与技能&#xff0c;不仅要有深厚的业务理解与数据技术功底&#xff0c;还需展现出卓越的领导力、团队协作与沟通能力&#xff0c;以驱动组织内部数据治理工作的高效运行与持续优化。以下是对数据治理专家各项能力的深入解读&#…

STM32H743VIT6使用STM32CubeMX通过I2S驱动WM8978(5)

接前一篇文章&#xff1a;STM32H743VIT6使用STM32CubeMX通过I2S驱动WM8978&#xff08;4&#xff09; 本文参考以下文章及视频&#xff1a; STM32CbueIDE Audio播放音频 WM8978 I2S_stm32 cube配置i2s录音和播放-CSDN博客 STM32第二十二课&#xff08;I2S&#xff0c;HAL&am…

C++学习进阶:哈希思想的进一步体现

目录 前言 1.位图 1.1.位图的实现与原理 1.2.如何使用位图处理海量数据 2.布隆过滤器 2.1.知识引入 2.2.布隆过滤器的实现 2.3.布隆过滤器的应用 3.哈希切割 前言 我们在之前对哈希表的学习&#xff0c;明白了哈希的本质就是一种映射&#xff01;&#xff01;&#xf…

安达发|APS智能优化排产软件之模具约束

在制造业中&#xff0c;模具是生产过程中不可或缺的重要工具。然而&#xff0c;由于模具的制造周期长、成本高以及生产过程中的复杂性&#xff0c;如何合理安排模具的使用和生产计划成为了一个关键问题。为了解决这个问题&#xff0c;许多企业开始采用APS&#xff08;高级计划与…

主干网络篇 | YOLOv8更换主干网络之VanillaNet | 华为方舟实验室提出全新轻量级骨干架构

前言:Hello大家好,我是小哥谈。华为方舟实验室所提出的VanillaNet架构克服了固有复杂性的挑战,使其成为资源受限环境的理想选择。其易于理解和高度简化的架构为高效部署开辟了新的可能性。广泛的实验表明,VanillaNet提供的性能与著名的深度神经网络和vision transformers相…

深度剖析Java中的String类

目录 引言 String类的特性 String类的部分实现代码&#xff1a; 不可变性&#xff1a; 补充&#xff1a; 常量池&#xff1a; 不可变性的好处 创建String对象 创建String对象的常用的三种方法如下&#xff1a; 使用常量串构造&#xff08;最常用&#xff09;&#xf…

帝国cms仿《鳄鱼下载站》网站源码

仿《鳄鱼下载站》网站源码手机安卓软件网站模版 PHP网站源码 帝国cms内核 采用帝国cms7.5 环境PHPmysql 恢复数据库后如何修改密码: 双击表&#xff0c;进入对应的详细数据表&#xff0c;然后找到&#xff1a;www_96kaifa_com_enewsuser这个表&#xff0c;双击打开修改&…