当前位置:首页 > 经验 >

redis入门教程免费(redis 菜鸟教程)

来源:原点资讯(www.yd166.com)时间:2022-10-31 23:04:26作者:YD166手机阅读>>

由于 SETNX 指令操作简单,且是原子性的,所以初期的时候经常被人们作为分布式锁,我们在应用的时候,可以在某个共享资源区之前先使用 SETNX 指令,查看是否设置成功。

如果设置成功则说明前方没有客户端正在访问该资源,如果设置失败则说明有客户端正在访问该资源,那么当前客户端就需要等待。

但是如果真的这么做,就会存在一个问题,因为 SETNX 是长久存在的,所以假设一个客户端正在访问资源,并且上锁,那么当这个客户端结束访问时,该锁依旧存在,后来者也无法成功获取锁,这个该如何解决呢?

由于 SETNX 并不支持传入 EXPIRE 参数,所以我们可以直接使用 EXPIRE 指令来对特定的 Key 来设置过期时间。

用法:

EXPIRE key seconds

redis入门教程免费,redis 菜鸟教程(9)

程序:

RedisService redisService = SpringUtils.getBean(RedisService.class); long status = redisService.setnx(key,"1"); if(status == 1){ redisService.expire(key,expire); doOcuppiedWork(); }

这段程序存在的问题:假设程序运行到第二行出现异常,那么程序来不及设置过期时间就结束了,则 Key 会一直存在,等同于锁一直被持有无法释放。

出现此问题的根本原因为:原子性得不到满足。

解决:从 Redis 2.6.12 版本开始,我们就可以使用 Set 操作,将 SETNX 和 EXPIRE 融合在一起执行,具体做法如下:

  • EX second:设置键的过期时间为 Second 秒。
  • PX MilliSecond:设置键的过期时间为 MilliSecond 毫秒。
  • NX:只在键不存在时,才对键进行设置操作。
  • XX:只在键已经存在时,才对键进行设置操作。

SET KEY value [EX seconds] [PX milliseconds] [NX|XX]

注:SET 操作成功完成时才会返回 OK,否则返回 nil。

有了 SET 我们就可以在程序中使用类似下面的代码实现分布式锁了:

RedisService redisService = SpringUtils.getBean(RedisService.class); String result = redisService.set(lockKey,requestId,SET_IF_NOT_EXIST,SET_WITH_EXPIRE_TIME,expireTime); if("OK.equals(result)"){ doOcuppiredWork(); }

如何实现异步队列

①使用 Redis 中的 List 作为队列

使用上文所说的 Redis 的数据结构中的 List 作为队列 Rpush 生产消息,LPOP 消费消息。

redis入门教程免费,redis 菜鸟教程(10)

此时我们可以看到,该队列是使用 Rpush 生产队列,使用 LPOP 消费队列。

在这个生产者-消费者队列里,当 LPOP 没有消息时,证明该队列中没有元素,并且生产者还没有来得及生产新的数据。

缺点:LPOP 不会等待队列中有值之后再消费,而是直接进行消费。

弥补:可以通过在应用层引入 Sleep 机制去调用 LPOP 重试。

②使用 BLPOP key [key…] timeout

BLPOP key [key …] timeout:阻塞直到队列有消息或者超时。

redis入门教程免费,redis 菜鸟教程(11)

redis入门教程免费,redis 菜鸟教程(12)

栏目热文

redis简单入门和实例(redis使用场景及实例)

redis简单入门和实例(redis使用场景及实例)

原文 :https://www.cnblogs.com/Java3y/p/15921480.html我是3y,一年 CR...

2022-10-31 22:56:49查看全文 >>

香菇肉包素馅(鲜肉香菇包馅的做法)

香菇肉包素馅(鲜肉香菇包馅的做法)

香菇油菜包,一款经典的素菜包,以鲜香而惹人喜爱,以营养丰富健康而被称为是“素馅包子”的代表。上周末带家人去济南,晚上到达...

2022-10-31 23:22:38查看全文 >>

干香菇猪肉包子馅的做法(干香菇猪肉包子馅的做法大全)

干香菇猪肉包子馅的做法(干香菇猪肉包子馅的做法大全)

最近广东的天气也开始冷了,热气腾腾的中式面点大受欢迎!独角兽馒头在家里大受好评!某娃刚吃完馒头就开始预约下一次,因为她平...

2022-10-31 23:20:32查看全文 >>

香菇大肉包子馅做法大全(香菇包子馅要先炒熟吗)

香菇大肉包子馅做法大全(香菇包子馅要先炒熟吗)

哈喽,大家好,我是绿江味道。今天我家孩子想吃包子,我给大家带来了香菇肉包子,听着是不是就流口水?蒸好的香菇肉包子首先准备...

2022-10-31 23:21:01查看全文 >>

香菇猪肉包子馅最简单做法(正宗的香菇包子馅做法)

香菇猪肉包子馅最简单做法(正宗的香菇包子馅做法)

身为北方人的小姿特别爱吃面食,什么面条,大饼,包子,饺子,一周不吃就馋得慌。饺子又是所有面食中最常出现的一种,逢年过节,...

2022-10-31 22:52:33查看全文 >>

redis入门教程超详细(redis详细图解)

redis入门教程超详细(redis详细图解)

【redis是什么】redis是一个开源的、使用C语言编写的、支持网络交互的、可基于内存也可持久化的Key-Value数...

2022-10-31 23:27:04查看全文 >>

redis菜鸟教程学习笔记(redis入门教程超详细)

redis菜鸟教程学习笔记(redis入门教程超详细)

一、Redis为什么那么快QPS达到10万/秒用C语言实现基于内存单线程,不用线程上下文切换及加锁二、redis数据类型...

2022-10-31 23:08:58查看全文 >>

redis的正确使用方法(redis的常见使用场景)

redis的正确使用方法(redis的常见使用场景)

redis使用规范建议key命名规范把业务名作为前缀, 然后用冒号分隔,再加上具体的业务数据名比如,存储页面1991的u...

2022-10-31 22:40:31查看全文 >>

redis从零开始教程(redis新手入门知识)

redis从零开始教程(redis新手入门知识)

前言自己在搭建redis服务的时候碰到一些问题,好多人只告诉你怎么成功搭建,但是并没有整理过程中遇到的问题,所有楼主就花...

2022-10-31 23:17:49查看全文 >>

redis详细图解(redis面试必问的三大问题)

redis详细图解(redis面试必问的三大问题)

Redis服务器是一个事件驱动的程序,有以下两类事件:文件事件:Redis服务器通过套接字与客户端或者其他的Redis服...

2022-10-31 23:16:12查看全文 >>

文档排行