目录
目录
一.事务
适用背景
由于一般的工作并不是单单一条命令就可以完成,而是由多条命令组成,而且根据任务需求,命令之间可能存在相关联性,意味着命令之间需要一次性都执行才可以,如果单条命令执行成功后面命令失败则会导致程序出现问题。比如说粉丝与视频博主之间的关系,有关注和被关注两种。当一个粉丝取关注一个视频博主时候,那么需要在粉丝的关注集合中加入博主的id,也要在博主对应被关注的集合中加入粉丝的id,缺一不可,一旦只有一个执行另一个不执行,那么都会出现数据不一致的问题。所以redis中就有事务 multi exec 出现
事务具有原子性即要么全部执行成功,要么全部取消执行。
步骤:
当使用 Redis 进行事务操作时,通常会按照以下步骤进行:
通过使用 MULTI 命令开始事务。命令格式为:
MULTI
。此时 Redis 进入事务模式。在事务中可以执行多条命令。将要执行的命令按顺序发送给 Redis,但不会立即执行。
执行命令后,Redis 将这些命令暂存起来,并返回一个 QUEUED 响应表示成功地将命令入队。
当所有命令都成功入队后,使用 EXEC 命令来执行事务中的所有命令。命令格式为:
EXEC
。Redis 依次执行事务中的所有命令,如果所有命令都执行成功,则返回事务中每个命令的执行结果。
如果事务中的任何一条命令执行失败,则整个事务将会被取消,Redis 将返回一个空值(nil)来表示事务执行失败。
举例:
错误处理:
1.语法错误
在输入指令时候语法有问题则会直接返回错误信息
2.运行错误
在没有语法错误的前提下执行事务如果出现了问题那么可以运行的会返回成功值,不能运行的将会报错
执行失败返回nil
二。Watch命令
适用背景
watch命令是一种乐观锁,即当很多人访问同一个数据并且对数据进行修改时候出现竞争问题,比如用户1对一个1进行加1然后获取这个计算后的值,但是在同时又有用户2在用户1获取计算值前也进行+1操作,那么用户1就会变成3,对他来说获取的数据就是异常的。所以可以通过Watch的命令监视一个key是否被修改,如果被修改的话,那么将停止下一个事务的执行。
步骤
使用 Watch 命令的步骤如下:
- 使用 WATCH 命令监听一个或多个键。例如:
WATCH key1 key2 ...
。- 开启事务(使用 MULTI 命令)。
- 在事务中对被监听的键进行操作,如读取、修改等。
- 执行 EXEC 命令来执行事务。
举例:
但需要注意的是,WATCH 命令并不能解决所有的并发问题,特别是在高并发的情况下。它只提供了一种简单的乐观锁机制,用于处理一些轻量级的并发场景。对于更复杂和高度并发的应用,可能需要使用更强大的分布式锁机制来确保数据的一致性和并发安全。
三.过期时间:
1.EXPIRE
由于内存是有有限空间的,并且数据也是有一个有效期的,比如演唱会门票,在演唱会开始举办前其都是有效的,但是一旦办理以后这张票就没有了进入演唱会的功能,变成垃圾数据。如果这些垃圾数据非常多的话,会严重占用资源。所以redis中存在命令EXPIRE 过期命令实现垃圾数据过时移动到回收站,最后定时清理的功能
使用 EXPIRE 命令:使用 EXPIRE 命令设置键的过期时间。该命令接受两个参数,第一个参数是键名,第二个参数是过期时间(以秒为单位)。例如,
EXPIRE key_name time_in_seconds
。等待时间段:在设置过期时间后,等待指定的时间段,让键在这段时间内保持有效。
检查过期状态:在指定的时间段之后,可以通过 TTL 命令来检查键的剩余过期时间。TTL 命令接受一个参数,即键名,返回键的剩余过期时间。如果返回结果为负值,表示键已经过期了。
处理过期键:当通过 TTL 命令发现键已经过期时,可以选择删除键或者执行其他相应的处理操作。如果要删除键,可以使用 DEL 命令,该命令接受一个或多个键名作为参数,删除指定的键。
举例:
需要注意的是,Redis 不会主动检查并删除过期的键,而是在访问键时检查是否过期,并在必要时将其删除。因此,在设置过期时间之后,你需要等待一段时间,或者在访问键时触发 Redis 的过期检查机制。
另外,需要注意的是,过期时间只适用于键本身,而不是键所对应的值。当键过期后,对该键执行 GET 命令将返回空值(nil)。
EXPIRE 对应的是秒,如果要更加具体划分则需要用到命令PEXPIRE
2.TTL
TTL(time to live)
这个命令可以用来查询键还有多久就会过期。例如
但是如果一个永久的键比如SET key1 1
这时候查看其TTL 那么将会返回 -1 即代表着永久
3.恢复或者更新过期时间
根据上面的例子来说,如果演唱会出现推迟一两天,但是过期时间缺没变的话就会导致演唱会必须制作新的票再将票与过期票兑换,但是这种操作将会非常浪费时间,而Redis中有PERSIST 命令可以将键值恢复到永久的有效期,再重新通过EXPIRE设置其新的过期时间
举例
四.排序
Sort命令,可以对列表,集合和有序集合进行排序
有人可能会疑惑为什么集合这些要排序,如果要排序为什么不用有序集合排序,其实有序集合申请的空间是要比集合大一些的,一两条数据是没什么影响,但是千万条数据那影响就会很大,所以在性能上考虑,有时候集合才是最佳的选择。比如学生的学号,如果按序号那需要有序集合,但是可以通过Sort命令也能得到一样的结果
使用步骤
选择需要排序的数据结构:首先确定要对哪个数据结构进行排序,可以是列表(List)、集合(Set)或有序集合(Sorted Set)。
设置排序参数:根据需要设置排序的参数,包括排序方式、排序规则和是否按照外部键进行排序。可以使用 SORT 命令的参数来进行设置。
执行排序命令:使用 SORT 命令对选择的数据结构进行排序。SORT 命令的语法如下:
SORT key [BY pattern] [LIMIT start end] [GET pattern [GET pattern ...]] [ASC|DESC] [ALPHA] [STORE destination]
key
:要排序的数据结构的键名。BY pattern
:可选项,基于指定的模式对外部键进行排序。LIMIT start end
:可选项,指定一个索引范围,只对该范围内的元素进行排序。GET pattern [GET pattern ...]
:可选项,用于获取指定模式的值,并将它们返回。ASC|DESC
:可选项,指定升序(默认)或降序排序。ALPHA
:可选项,用于对字符串进行按字母顺序的排序。STORE destination
:可选项,将排序后的结果保存到指定的键名中。例如,对列表进行升序排序可以使用命令
SORT mylist
,对有序集合按照外部键进行降序排序可以使用命令SORT myzset BY weight_* DESC
。处理排序结果:根据需要,可以选择获取排序结果或将其存储到另一个键中。如果使用了 GET 参数,则可以获取相应的值,否则仅返回排序后的元素。
需要注意的是,SORT 命令执行时是阻塞的,对于大型数据集可能需要一定时间。在排序期间,Redis 服务器可能会被阻塞无法响应其他请求,请确保在适当的时候使用 SORT 命令
举例:
通过by参数进行更自主的排序
实际的开发过程中肯定不是只有通过大小进行排序,可能还会通过时间,销量,热度等等进行特定的排序以达到给用户更好的服务。比如一个畅销榜单,需要按照各个商品的销量热度进行排序。
注意:设置销量必须和商品一 一对应并且顺序不能乱,如果销量少弄一个,那么最后的没有对应到的商品的值默认为0
get参数
在按照自己排序之后,并不是自己想要的数据,想要的数据可能是更加具体里面的其他值就需要用到GET参数,比如说文章评选系统,进行排序的是id,但是最后我要的是id对应的标题那么就需要用到get参数比如get对应哈希类型的key title
SORT 命令的 GET 参数用于指定在排序完成后,从被排序的元素中获取额外的数据。
在案例中,通过
SORT sales BY salesnumber:* DESC GET salesnumber:*
命令,可以将销量从高到低排序,并且获取每个商品对应的销量。具体来说,GET 参数的作用是:
获取对应键的值:通过指定 GET 参数为一个或多个键,可以在排序结果中获取这些键的值。在这个例子中,GET 参数设置为 "salesnumber:",表示要获取匹配 "salesnumber:" 模式的键的值。
获取多个键的值:你可以在 GET 参数中指定多个键,以获取多个额外的数据。例如,使用
GET salesnumber:* GET price:*
可以同时获取商品的销量和价格。请注意,GET 参数的位置应该在排序操作之后。
使用 GET 参数可以方便地从排序结果中获取与被排序元素相关联的其他数据,从而在畅销榜中显示商品名称以及其对应的销量等信息。
注:GET # 是返回自身
Store参数
当排序完之后如果想要将结果保存起来那么就需要用到store参数,其会将所有数据以列表形式储存起来
五.发布/订阅模式
redis中有发布订阅模式,该模式的主要功能就是发布者发布和订阅者的订阅,首先发布者可以发布一个节目,然后订阅者就可以对该节目进行订阅并且也可以订阅多个节目,发布者可以在节目中发送信息,订阅者也就能接受到对应的信息
步骤:
创建消息代理(Message Broker):发布-订阅模式基于消息代理来进行消息的传递。首先,你需要创建一个消息代理,例如使用 Redis 的 Pub/Sub 功能,或者使用专门的消息队列软件如 RabbitMQ。
定义主题(Topic):主题是发布-订阅模式中的标识,用于区分不同的消息类型或主题。你可以根据实际需求定义多个主题。
订阅主题:订阅者(Subscriber)通过向消息代理订阅感兴趣的主题来接收相关的消息。订阅者可以订阅一个或多个主题。
发布消息:发布者(Publisher)将消息发送到指定的主题。消息代理会负责将消息广播给所有订阅了该主题的订阅者。
接收消息:订阅者会接收到发布者发送的消息。每个订阅者只会接收到订阅了的主题下的消息。
处理消息:订阅者可以对接收到的消息进行处理,例如进行业务逻辑操作、更新数据等。
取消订阅:订阅者可以选择取消订阅某个或所有主题,不再接收相关的消息。
举例:
发布者:
订阅者:
过程解释:
首先发布者发布节目 channal1991节目 并发出消息test 由于此时没有用户订阅所以返回订阅人数为0,当用户订阅了该频道后,以前的数据将不会接收,只会接收订阅后发布者发布的消息。订阅后得到订阅成功的消息,然后发布者发布了一个hi 这时候 用户立刻就接收到message类节目为channal1991消息为hi。
接受者(订阅者)能接受到的信息有多种 在案例中可以看到有两种 一个是subscribe 一个是message 下面介绍三种类型信息
1.subscribe 表示成功订阅信息
2.message 表示接受的信息
3.unsubscribe 表示成功退出订阅的信息