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命令:setops.set("k1", "100");// 设置过期时间,等价于redis命令:setexops.set("k2", "200", 2, TimeUnit.SECONDS);// key不存在,则设置,等价于redis命令:setnxops.setIfAbsent("k3", "300");ops.set("k4", "this is a string.");// 追加内容,等价于redis命令:appendops.append("k4", "redis string");// 获取长度,等价于redis命令:strlenLong k4 = ops.size("k4");// 自增1,等价于redis命令:incrops.increment("k1");// 自增指定步长,等价于redis命令:incrbyops.increment("k1", 10);// 自减1,等价于redis命令:decrops.decrement("k3");// 自减指定步长,等价于redis命令:decrbyops.decrement("k3", 20);Map<String, String> map = new HashMap<>();map.put("kk1", "vv100");map.put("kk2", "vv200");// 等价于redis命令:msetops.multiSet(map);List<String> keys = new ArrayList<>();keys.add("kk1");keys.add("kk2");// 等价于redis命令:mgetList list = ops.multiGet(keys);map = new HashMap<>();map.put("kk1", "vv100");map.put("kk3", "vv300");// 等价于redis命令:msetnxBoolean aBoolean = ops.multiSetIfAbsent(map);// 等价于redis命令:getObject k1 = ops.get("k1");// 等价于redis命令:getsetObject obj = ops.getAndSet("kk1", "bak_vv100");// 等价于redis命令:getrangeString kk2 = ops.get("kk2", 0, 1);// 等价于redis命令:delBoolean k3 = ops.getOperations().delete("k3");
}

(2)操作List集合类型

public void demo02() {ListOperations ops = redisTemplate.opsForList();// 左边添加元素,等价于redis命令:lpushops.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命令:rpushops.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命令:lpopObject k2 = ops.leftPop("k2");// 等价于redis命令:rpopObject k22 = ops.rightPop("k22");// 等价于redis命令:rpoplpushObject push = ops.rightPopAndLeftPush("k22", "k2");// 等价于redis命令:lrangeList k21 = ops.range("k2", 0, -1);// 等价于redis命令:lindexObject k221 = ops.index("k22", 1);// 等价于redis命令:llenLong k33 = ops.size("k33");// 等价于redis命令:lremLong k3 = ops.remove("k3", 1, "100");// 等价于redis命令:lsetops.set("k33", 2, "new_200");
}

(3)操作Set集合类型

public void demo03() {SetOperations ops = redisTemplate.opsForSet();// 等价于redis命令:saddops.add("k1", "100", "200", "300");// 等价于redis命令:smembersSet k1 = ops.members("k1");// 等价于redis命令:sismemberBoolean k11 = ops.isMember("k1", "400");// 等价于redis命令:sacrdLong k12 = ops.size("k1");// 等价于redis命令:sremLong k13 = ops.remove("k1", "100", "300");// 等价于redis命令:spopObject k14 = ops.pop("k1");List k15 = ops.pop("k1", 2);// 等价于redis命令:srandmemberObject k16 = ops.randomMember("k1");List k17 = ops.randomMembers("k1", 2);// 等价于redis命令:smoveBoolean move = ops.move("k1", "v100", "k2");// 等价于redis命令:sinterList<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命令:sunionSet union = ops.union(keyLists);// 求k1和k2的并集,然后将结果保存到k3中Long aLong1 = ops.unionAndStore("k1", "k2", "k3");// 等价于redis命令:sdiffSet difference = ops.difference(keyLists);// 求k1和k2的差集,然后将结果保存到k3中Long aLong = ops.differenceAndStore("k1", "k2", "k3");
}

(4)操作Hash类型

public void demo04() {HashOperations ops = redisTemplate.opsForHash();// 等价于redis命令:hsetops.put("k1", "h1", "v100");// 等价于redis命令:hgetObject o = ops.get("k1", "h2");// 等价于redis命令:hkeysSet k11 = ops.keys("k1");// 等价于redis命令:hvalsList k1 = ops.values("k1");// 等价于redis命令:hmsetMap<String, String> map = new HashMap<>();map.put("h1", "v100");map.put("h2", "v200");ops.putAll("k2", map);// 等价于redis命令:hdelLong delete = ops.delete("k1", "h1", "h3");// 等价于redis命令:hsetnxBoolean aBoolean = ops.putIfAbsent("k1", "h2", "v200");// 等价于redis命令:hincrbyLong increment = ops.increment("k1", "h1", 10);Long increment1 = ops.increment("k1", "h2", -20);
}

(5)操作ZSet类型

public void demo05() {ZSetOperations ops = redisTemplate.opsForZSet();// 等价于redis命令:zaddBoolean 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命令:zrangeSet k1 = ops.range("k1", 0, -1);Set k11 = ops.rangeWithScores("k1", 0, -1);// 等价于redis命令:zrangebyscoreSet k12 = ops.rangeByScore("k1", 10.0, 52.0);Set k13 = ops.rangeByScoreWithScores("k1", 10.0, 52.0);// 等价于redis命令:zrevrangebyscoreSet k21 = ops.reverseRangeByScore("k2", 100.0, 30.0);Set k22 = ops.reverseRangeByScoreWithScores("k2", 100.0, 30.0);// 等价于redis命令:zincrbyDouble aDouble = ops.incrementScore("k1", "v100", 10);Double aDouble1 = ops.incrementScore("k1", "v200", -20);// 等价于redis命令:zremLong remove = ops.remove("k1", "v100", "v300");// 等价于redis命令:zcountLong k14 = ops.count("k1", 10.0, 52.0);// 等价于redis命令:zrankLong rank = ops.rank("k1", "v100");
}

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

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

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

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

相关文章

第二届数据安全大赛暨首届“数信杯”数据安全大赛数据安全积分争夺赛-东区预赛wp

附件下载地址&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1tClZrup28n4fUe5Kpa7mgQ?pwdkbd6 文章目录 数据安全题re_ds001Homooo0 数据分析题数据分析1-1数据分析1-2数据分析1-3数据分析2-1数据分析2-2数据分析2-3数据分析3-1数据分析3-2数据分析3-3数据分析5-1数据…

【AI基本模型】简化生成对抗网络 (GAN)

目录 一、说明 二、GAN的工作 三、如何手动计算生成对抗网络&#xff08;GAN&#xff09;&#xff1f;✍️ 四、GAN的应用 一、说明 生成对抗网络 &#xff08;GAN&#xff09; 是一种机器学习算法&#xff0c;可以生成与现实世界数据几乎无法区分的合成数据。它们的工作原理是…

【计算机毕业设计】基于Java+SSM的实战开发项目150套(附源码+演示视频+LW)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f9e1;今天给大家分享150的Java毕业设计&#xff0c;基于ssm框架&#xff0c;这些项目都经过精心挑选&#xff0c;涵盖了不同的实战主题和用例&#xff0c;可做毕业设计和课程…

python画神经网络图

代码1(画神经网络连接图&#xff09; from math import cos, sin, atan import matplotlib.pyplot as plt # 注意这里并没有用到这个networkx这个库&#xff0c;完全是根据matploblib这个库来画的。 class Neuron():def __init__(self, x, y,radius,nameNone):self.x xself.y …

文本检索粗读

一.前情提要 1.本文理论为主&#xff0c;并且仅为个人理解&#xff0c;能力一般&#xff0c;不喜勿喷 2.本文理论知识较为散碎 3.如有需要&#xff0c;以下是原文&#xff0c;更为完备 Neural Corpus Indexer 文档检索【论文精读47】_哔哩哔哩_bilibili 二.正文 &#xf…

CommunityToolkit.Mvvm笔记1---Instruction

CommunityToolkit.Mvvm是一个官方社区套件(Windows Community Toolkit)&#xff0c;延续了MVVMLight的风格&#xff0c;是一个现代、快速和模块化的 MVVM 库。 它是 .NET 社区工具包的一部分。 第一&#xff1a;入门安装 1&#xff0c;用NuGget安装&#xff0c;搜索Community…

【菜狗学前端】ES6+笔记(包含Promise及async、await等)

老样子。复制上来的图片都没了&#xff0c;想看原版可以移步对应资源下载(资源刚上传&#xff0c;还在审核中) &#xff08;免费&#xff09;菜狗学前端之ES6笔记https://download.csdn.net/download/m0_58355897/89135424 一 解构赋值 解构赋值 解构指的是把一个数据…

马上拥有“钞能力”!!24个Python接单平台,赶紧码住!!

学Python能兼职挣米吗&#xff1f;怎么挣&#xff1f; 一、Python兼职种类&#xff1a; 接私活刚学会python那会&#xff0c;就有认识的朋友介绍做一个网站的私活&#xff0c;当时接单赚了4K&#xff0c;后又自己接过开发网站后台接口、做数据处理等事情&#xff0c;都赚了一…

【机器学习300问】66、均方误差与交叉熵误差,两种损失函数的区别?

一、均方误差&#xff08;Mean Squared Error, MSE&#xff09; 假设你是一个教练&#xff0c;在指导学生射箭。每次射箭后&#xff0c;你可以测量子弹的落点距离靶心的差距&#xff08;误差&#xff09;。MSE就像是计算所以射击误差的平方后的平均值。它强调了每一次偏离靶心的…

了解 Vue 工程化开发中的组件通信

目录 1. 组件通信语法 1.1. 什么是组件通信&#xff1f; 1.2. 为什么要使用组件通信&#xff1f; 1.3. 组件之间有哪些关系&#xff08;组件关系分类&#xff09;&#xff1f; 1.4. 组件通信方案有哪几类 &#xff1f; 2. 父子通信流程图 3. 父传子 3.1. 父传子核心流程…

力扣练习题(2024/4/14)

1接雨水 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 示例 1&#xff1a; 输入&#xff1a;height [0,1,0,2,1,0,1,3,2,1,2,1] 输出&#xff1a;6 解释&#xff1a;上面是由数组 [0,1,0,2,1,0,1,3,2…

SpringBoot 整合RocketMQ

目录 一、引入依赖 二、配置文件 三、生产者 四、消费者 五、结果 一、引入依赖 <dependency><groupId>org.apache.rocketmq</groupId><artifactId>rocketmq-spring-boot-starter</artifactId><version>2.2.0</version> </d…

leetcode热题100.爬楼梯(从二进制到快速幂)

Problem: 70. 爬楼梯 文章目录 题目思路Code复杂度 题目 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 示例 1&#xff1a; 输入&#xff1a;n 2 输出&#xff1a;2 解释&#xff1a;有两种方…

numpy学习笔记(5),其他实用函数

8. 更多函数 8.1 随机数 8.1.1 常用随机数 8.1.1.1 numpy.random.rand(d0, d1, …, dn) 返回[0.0, 1.0)随机浮点数&#xff0c;即大于等于0.0&#xff0c;小于1.0。d0, d1, …, dn&#xff1a;返回的数组形状 # 使用numpy.random.rand函数 import numpy as np np.random.r…

每日一题:无重复字符的最长子串

给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的 最长子串的长度。 示例 1: 输入: s "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是"abc"&#xff0c;所以其长度为 3。示例 2: 输入: s "bbbbb" 输出: 1 解释: 因为无重…

2009-2021年上市公司僵尸企业识别数据(含原始数据+计算代码+计算结果)

2009-2021年上市公司僵尸企业识别数据&#xff08;含原始数据计算代码计算结果&#xff09; 1、时间&#xff1a;2009-2021年 2、指标&#xff1a; 证券代码 、证券简称、上市日期、year、净利润、政府补助、流动负债合计、负债合计、财务费用明细利息支出、资产总计、长期负…

(Oracle)SQL优化案例:隐式转换优化

项目场景 项目现场的某个kettle模型执行非常缓慢&#xff0c;原因在于某个SQL执行效率非常的低。甲方得知此事要求公司赶紧优化&#xff0c;负责该模块的同事对SQL优化并不熟悉。所以作为一个立志成为优秀DBA的ETL工程师&#xff0c;我自告奋勇&#xff1a;不是DBA&#xff0c;…

ES6 关于Class类的继承 extends(2024-04-10)

1、简介 类Class 可以通过extends关键字实现继承&#xff0c;让子类继承父类的属性和方法。extends 的写法比 ES5 的原型链继承&#xff0c;要清晰和方便很多。 class Foo {constructor(x, y) {this.x x;this.y y;console.log(父类构造函数)}toString() {return ( this.x …

《由浅入深学习SAP财务》:第2章 总账模块 - 2.7 总账模块报表 -2.7.1 对外报表:资产负债表及利润表

总账模块报表既包括对外报告的资产负债表、损益表、现金流量表&#xff0c;也包括企业自身用于查询和分析的各类报表&#xff0c;如科目余额表等。 2.7.1 对外报表&#xff1a;资产负债表及利润表 在SAP中&#xff0c;出具资产负债表和利润表的标准方法是先在后台建立一套“会…

971: 统计利用先序遍历创建的二叉树的深度

解法&#xff1a; 1.先序遍历创建二叉树链表形式 2.求二叉树的深度 用后序遍历实现&#xff1a; 1.后序遍历求节点A左右子树高度 2.对节点A&#xff1a; 1.取左右子树较大高度 2.返回高度1&#xff08;即以节点A为根节点的子树的最大深度&#xff09; 例如 #include <ios…