Redis 数据类型之字符串和列表(二)|学习笔记

简介: 快速学习 Redis 数据类型之字符串和列表(二)

开发者学堂课程【Redis 入门实战演练 Redis 数据类型之字符串和列表(二)】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/653/detail/10836


Redis 数据类型之字符串和列表(二)


 4、批量创建、查询以及删除多个 key:

127.o.o.1:6379>NSET key1 value1 key2 value2

OK

127.0.0.1:6379>MGET key1 valuel key2 value2

OK

删除多个 key 以及创建多个 key,例如在有些时候可能会有一些其他因素需要考虑,因此在创建数据的时候,包括获取数据的时候,不希望在一条获取指令或者一条查询语句里面,而需要进行多条信息查询的业务和公司业务相关联。程序在向 redis 查询数据的时候,希望一次性查询多该用户或者某些其他相关场合的数据,比如针对用户的级别,可能包括用户的姓名、用户的年龄以及用户的爱好等等相关的类似数据,这时候按照传统的方式需要进行查询三次,比如第一次查年龄,第二次查姓名,第三次查爱好,虽然这种方式也可以完成查询任务,但是在无形之中增加了查询的时间和查询的连接。所以为了优化,我们可以一次性查询三个数据,即在一次连接当中,一条语句里面去查三个数据,这三个数据在 redis 当中是通过127.0.0.1:6379>MGET key1 valuel key2 value2命令来完成,MGET 表示查询多个数据,MSET 表示写入多个数据。使用MSET的一次性生成多个数据,比如姓名叫做 linux39,然后年龄写作20等等,后面其他的数据依照上述方式可以在 MSET 指令后面写入 Key 的名称,然后在跟上 key 的值,可以写入多个不同的数据,这样就可以一次写入多个 key 值,和 set 命令两次写入的效果是完全一样的,这个时候依然可以使用 get 去依次获取数据。当然还需要查询,如果有两个 key,需要查询两次,三个 key 就需要进行三次查询,如果想一次性查询出来,就需要使用 MGET,即在上述所讲单次查询的命令前面加上 M,输入MGET name或者是年龄(age)等等,就可以一次性把他们全部查询出来。如果不使用命令去查询,而是使用Java去查,返回值会使用变量,把他们复制给变量名,然后那个变量名将会被其他程序调用,比如在Java里面把变量获取到,然后变量在 web 上进行显示,这种方式的选择和业务与服务相关。

5、追加数据;

127.0.0.1:6379>APPEND key1 append

(integer) 12

127.0.0.1:6379> get key1

"value1append"

追加数据就是想要对 key 做修改,但是修改至少分为两种场合,第一种就是对数据进行全部修改,全部修改的意思就是对刚才年龄、姓名。爱好等全部数据都进行修改,例如将上述的 name linux39 修改为 magedu 这种情况是完全形式的修改;第二种是部分修改,部分修改就是之前内容不动,然后在后面追加数据,追加可能是由于之前少写了部分内容,比如 Linux39 的值可能是 Linux391、Linux92,需要在后面追加内容,需要利用 append 命令。如果是全部修改,直接重新 set 即可。追加使用 append key 的名字,比如给 name 进行追加一个10,代码就为 Append name 10,追加完成之后返回一个值:9,这个9表示的是给 name value 加上10即两个字符串之后成为了9个字符串。可以进行查看,l是一个,i是一个,n是一个,u是一个,x是一个,3是一个,9是一个,所以是在七个字符串的基础上增加了两个字符串。使用get name可以看到已经把十追加到之前 key 的后面。如果是全部的修改,比如把name进行重新写,就是值重新赋予,将 linux39修改为 magediu,直接输入SET name magediu,使用 get name 可以看到 name 修改成了magediu。

6、数值递增

127.0.0.1:6379> set num 10

OK

127.0.o.1:6h79>INCR num

(integer) 11

127. o.0.1:6379> get num

"11”"

数值递减:

127.0.0.1:6379> set num 10

OK

127.0.0.1:6379>DECR num

(integer) 9

127.0.0.1:6379> get num

"9""

数值的递增和递减和之前讲过的一个例子有关,这个例子就是:A在朋友圈里发了一条动态,然后会有好多个朋友进行点赞,第一个人点赞之后,数据是在0的基础上加1,加完之后又有人点进行点赞,此时数据就应该在1的基础上加1,有时会对朋友圈的内容进行误点,比如我们不想对别人的炫富等进行点赞,这时候点赞是可以撤销掉。如果说我们把这个数据直接写入数据库也是可以的,直接写入数据会在点击的时候会触发一条程序,如何这个操作会交给这个程序,这个程序或是直接写入数据库,或是直接改为缓存,改成 Linux 里的缓存值。若要写入数据,首先要查出来当前的值是多少,因为需要在当前值的基础上加1,计算完成之后再返回数据给这个程序,基于查询过了值的基础上加一,加完之后才能写入进去,这时候相当于交互了三次,查一次数据库返回给这个程序,在返回值基础之上,比如说返回值简称为 number,然后这个程序就要去和 number 加一,加完之后得到新的 number=number+1,加完之后才将其写入数据库里,这样才能完成一次或是说一个用户点赞评论的数目,若是同时之间有N多用户同时拥进来,这个时候肯定就要进行排队,因为一套语句执行完成之后才能执行下一套语句,否则会出现数据不一致的情况。所以对于这种场合,尤其像新浪微博,他们会大量使用redis,尤其是明星的微博上的粉丝特别多,可以达到上百万甚至上千万,如果发布了某明星出轨、离婚的某些爆炸性事件,粉丝数众多,所以评论数据就会很大,可能瞬间就可以达到几百万或者几十万的评论或点赞,相当于几十个请求突然要对数据库读写几十万次,极其容易导致服务器崩溃。这个时候可以直接写redis,redis语句的书写相对来说就简单很多了,一条语句就可以完成,但是还是需要程序,在redis中是用户访问到某个业务,就是一条微博,访问完成之后,在微博上进行点赞或者评论,就会触发获得一个语句,这个语句就是一个程序执行的,那个程序要么直接读取微博数据库,要么就触发 redis 的某个操作。而redis操作也是一次性可以完成,其语义就是 set 一个 number,这个 number 之前是有数值的,如果没有数值默认是0,比如某个明星发布了一篇微博,刚发出去的时候没有任何人点赞、没有任何人评论,点赞和评论默认都是零,如果在0的基础上递增和递减,递减就是之前点了赞,后来又想取消,那就在原有的基础上减1,递增就是很多粉丝不断地评论点赞以后,这个数就会是一直加1。递增的加使用 INCR,redis 字符串有这样的特性,命令 INCR 可以在原有的基础之上自动加一。比如 set number,假设此时 number 为0,就是明星刚刚发了微博,还没有任何人评论点赞过,就直接 在 redis 内存里面设个默认数值0,此时如果有人进行点赞评论,程序直接在 redis 中执行 INCR,redis 就会将这个数值上在0的基础上直接加1,这时候就不需要 redis 再把这个数返回给程序进行数值的递增,自己完成数值的增。使用 get num,可以看到此时 number 的数据为0,执行一次 INCR,对于 number 这个 key 执行 INCR,其代码为 INCR num,会对基础数据进行自动加一,再次 get sum,得到结果为1,当 redis 执行了该语句后,其数据发生自动改变,改变之后微博的数据就会改变,自然而然变成了1,如果再有人进行点赞评论,还会触发那条写入的语句,又在 redis 中执行了一次INCR的指令,这个数据就变成2了,这种方法的运行速度就远远高于普通方式的运行速度。当然我们可以从 redis 中将该数据查询出来,类似于将数据从数据库查出。递减就是取消之前的点赞或评论行为,递减采用的命令是DECR,可以在原有数的基础之上减一,执行一次该命令数据就会自动减少一个数。内存对象存储对象。

7、返回字符串 key 长度:

127.0.0.1:6379>STRLEN key1

(integer) 12

返回字符串 key 的长度,即需要确定 key 的 value 有多长,比如刚才所举的例子, set 了一个 key,其 name 设置为 linux39,对值长度的统计一般出现在文档型的数据,文档型的数据它的值是一些文章,或者是一些很长的内容,此时需要获得值的长度,就要使用 STRLEN 命令,输入STRLEN linux39 name,redis 会将 name 值的长度返回出来,显示数值7。

8、判断 key 是否存在:

127.0.0.1:6379> EXISTS key1

(integer) 1

127.0.0.1:6379>EXISTS key2

(integer) 0

判断key是否存在,这些使用都是针对开发来说的,尤其是在第一次进行类似查询数据的时候要去判断 key 是否存在,,如果 key 存在,就直接在 key 的基础之上做 haodou,如果 ke 不存在,就把它其写入,即创建一个 key。比如说微博中要查询一个 key,首先要确定有没有创建该 key,如果该 key 存在,就直接进行查询,如果该 key 不存在就要去创建 key。例如一个明星刚刚发了微博,此时进行查询, redis 里面可能还没有默认为0的两个值,这两个默认值就有可能是由这个程序到 redis 进行执行查询,如果没有就传入默认的,如果有就直接返回,所以这种业务有一些依赖关系或者是说逻辑关系,这种逻辑关系在公司有不同的使用场景或不同的解决方案。判断key是否存在使用的命令是 EXISTS,s 输入EXISTS name,可以看到 name 的返回值,如果值为1,就表示 name 的值是存在的;如果判断两个 key,比如 name 和 age,如果这两个都存在就是2,有一个不存在返回值为1。

相关文章
|
4天前
|
数据采集 人工智能 安全
|
13天前
|
云安全 监控 安全
|
5天前
|
自然语言处理 API
万相 Wan2.6 全新升级发布!人人都能当导演的时代来了
通义万相2.6全新升级,支持文生图、图生视频、文生视频,打造电影级创作体验。智能分镜、角色扮演、音画同步,让创意一键成片,大众也能轻松制作高质量短视频。
1093 152
|
18天前
|
机器学习/深度学习 人工智能 自然语言处理
Z-Image:冲击体验上限的下一代图像生成模型
通义实验室推出全新文生图模型Z-Image,以6B参数实现“快、稳、轻、准”突破。Turbo版本仅需8步亚秒级生成,支持16GB显存设备,中英双语理解与文字渲染尤为出色,真实感和美学表现媲美国际顶尖模型,被誉为“最值得关注的开源生图模型之一”。
1770 9
|
10天前
|
人工智能 自然语言处理 API
一句话生成拓扑图!AI+Draw.io 封神开源组合,工具让你的效率爆炸
一句话生成拓扑图!next-ai-draw-io 结合 AI 与 Draw.io,通过自然语言秒出架构图,支持私有部署、免费大模型接口,彻底解放生产力,绘图效率直接爆炸。
701 152
|
12天前
|
人工智能 安全 前端开发
AgentScope Java v1.0 发布,让 Java 开发者轻松构建企业级 Agentic 应用
AgentScope 重磅发布 Java 版本,拥抱企业开发主流技术栈。
663 13
|
7天前
|
SQL 自然语言处理 调度
Agent Skills 的一次工程实践
**本文采用 Agent Skills 实现整体智能体**,开发框架采用 AgentScope,模型使用 **qwen3-max**。Agent Skills 是 Anthropic 新推出的一种有别于mcp server的一种开发方式,用于为 AI **引入可共享的专业技能**。经验封装到**可发现、可复用的能力单元**中,每个技能以文件夹形式存在,包含特定任务的指导性说明(SKILL.md 文件)、脚本代码和资源等 。大模型可以根据需要动态加载这些技能,从而扩展自身的功能。目前不少国内外的一些框架也开始支持此种的开发方式,详细介绍如下。
458 5