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;可做毕业设计和课程…

js的filter函数

在JavaScript中&#xff0c;filter() 是一个数组方法&#xff0c;它创建一个新数组&#xff0c;其包含通过提供的函数实现的测试的所有元素。换句话说&#xff0c;filter() 函数遍历数组中的每个元素&#xff0c;并只将那些使测试函数返回 true 的元素包含在新数组中。 这里有…

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 …

h5增加的属性、标签和api

新增的属性&#xff1a; data-*属性&#xff1a;用于在HTML元素上存储自定义数据。placeholder属性&#xff1a;用于在表单元素中提供占位符文本。required属性&#xff1a;标记表单元素是否为必填项。autocomplete属性&#xff1a;控制表单元素的自动完成行为。download属性&…

短视频的11个流量密码

01原始欲望 每一个人都想着住豪宅、开豪车、吃大餐、赚大钱、看帅哥美女等&#xff0c;所以当你的视频里出现大量别人没有去过的美景&#xff0c;没有吃过的大餐&#xff0c;没有见过的金钱&#xff0c;和性感妖娆的美女&#xff0c;就会有人想点击去看。 对于男性来说&#…

Unity Android Release-Notes

&#x1f308;Android Release-Notes 收集的最近几年 Unity各个版本中 Android的更新内容 &#x1f4a1;WebGL Release-Notes 2023 &#x1f4a1;WebGL Release-Notes 2022 &#x1f4a1;WebGL Release-Notes 2021

单链表的冒泡,选择和插入排序

今天我们来看看单链表排序中的冒泡排序&#xff0c;插入排序&#xff0c;选择排序。 文章目录 冒泡排序交换值交换节点 插入排序交换节点 选择排序交换值交换节点 冒泡排序 交换值 首先我们来看看不交换节点&#xff0c;只进行值交换的形式&#xff0c;与数组下的实现思路一…

文本检索粗读

一.前情提要 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…

最短响应时间负载均衡算法Golang实现

最短响应时间负载均衡算法&#xff08;Least Response Time Load Balancing Algorithm&#xff09;&#xff0c;顾名思义&#xff0c;它的主要目标是最小化用户的响应时间。在这种算法下&#xff0c;负载均衡器会跟踪后端服务器的历史响应时间&#xff0c;并将新的连接请求分配…

【菜狗学前端】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;都赚了一…

【AcWing】蓝桥杯集训每日一题Day15|并查集|528.奶酪(C++)

528.奶酪 528. 奶酪 - AcWing题库难度&#xff1a;简单时/空限制&#xff1a;1s / 128MB总通过数&#xff1a;3800总尝试数&#xff1a;10480来源&#xff1a;NOIP2017提高组算法标签并查集BFSDFS 题目内容 现有一块大奶酪&#xff0c;它的高度为 ℎ&#xff0c;它的长度和宽…

Java并发编程和JUC

Java并发编程、JUC&#xff08;java.util.concurrent包&#xff09; 参考&#xff1a;JUC详解 概念辨析 进程、线程、管程 进程 进程&#xff1a;进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。 它是操作系统动态执行的基本单元&#xff0c;是操作系统…

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

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

2024.04.01校招 实习 内推 面经

绿*泡*泡VX&#xff1a; neituijunsir 交流*裙 &#xff0c;内推/实习/校招汇总表格 1、校招 | 2024届零跑汽车春季校园招聘正式启动&#xff08;内推&#xff09; 校招 | 2024届零跑汽车春季校园招聘正式启动&#xff08;内推&#xff09; 2、校招 & 实习 | 航天二院2…

了解 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…