redissetnx的简单介绍

本篇文章给大家谈谈redissetnx,以及对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

Springboot使用redis的setnx和getset实现并发锁、分布式锁

在日常开发中,很多业圆搏务场景必须保证原子性。举几个例子:

如果你只有一台服务器,只运行一个Java程序,那么可以使用Java语言自身的一些锁来实现原子性。但如果我们有多台服务器,甚至不同服务器上跑的是不同的语言。那这时候,我们就需要一个跨平台、跨语言的加锁方式。redis就是其中最方便的一种。

使用redis实现并发锁,主要是靠两个redis的命令:setnx和getset。

那我们的设计思路就是:

上面的代码使用了一个RedisService的类薯升,里面主要是简单封装了一数腔老下redis的操作,你可以替换为自己的service。代码如下:

以上代码有任何疑问,可以点击右侧边栏联系作者。收费5毛~交个朋友,欢迎来撩!

版权声明:《Springboot使用redis的setnx和getset实现并发锁、分布式锁》为CoderBBB作者「ʘᴗʘ」的原创文章,转载请附上原文出处链接及本声明。

原文链接:

Redis | Redis 字符串相关命令

Redis 支持多种数据结构,比如 字符串、列表、集合、有序集合 和 哈希 等数据结构。本次我整理了关于 字符串 相关的命令,也就是关于 Strings 相关的命令,如下图。

上图中用红色圈中的部分,就是关于 字符串 相关的命令。如果想要在 Redis 中查看相关的命令也可以使用 help 命令来进行查看,命令如下。

在按下回车后,可以看到相应分类命令的说明,如下图。

图中就是部分关于 Strings 相关的部分命令。

常用 Strings 相关命令

为了大家能够直接复制命令进行测试,下面我就不截图了。

1、set 命令

set 命令的作用是 设置一个 key 的 value 值

设置 key 对应的字符串类型

上面的命令分别对 key1 设置为 value1,对 key2 设置为 value2。

set 命令除了基本的用法外,还有几个参数,先来说一下 nx 和 xx 两个参数。

nx 表示 key 不存在时,执行操作

xx 表示 Key 存在时,执行操作

命令 set k1 v1 nx 表示,当 k1 不存在时,给 k1 设置字符串值为 v1,此时 k1 并不存卜衡在,因此该命令被执行;

命令 set k2 v2 xx 表示,当 k2 存在时,给 k2 设置谨尺字符串值为 v2,此时 k2 并不存在,因此该命令没有被执行

再介绍另外两个参数,分别是 ex 和 px,ex 和 px 是在进行 set 命令时可以设置过期时间的命令

ex 表示 设置的过期时间以秒为单位

px 表示 设置的过期时间以毫秒为单位

2、setnx 命令

setnx 命令的作用是 当指定的键不存在时给该键设置一个值

该命令类似 set 命令附带了 nx 参数

在上面的命令中,setnx k1 value1,由于 k1 存在,因此命令没有被执行,setnx k2 value2,由于 k2 不存在,因此命令被执行。

当命令执行成功,返回值为 1

当命令执行不成功,返回值为 0

3、get 命令

get 命令的作用是 获取指定 key 的值

该命令已经被多次使用了,演示如下:

4、getset 命令

getset 命令的作用是 设置一个 key 的 value,并获取设置前的值

该命令相当于 先对指定的 key 进行一次 get 操作,再执行一次 set 操作,两个命令合并,可以保证原子性。

5、mget 命令

mget 命令的作用是 一次获取多个 key 的值,如果 key 不存在则返回 nil

可以看到,key3 是不存在型晌做的,因此 key3 返回的值是 nil

6、mset 命令

mset 命令的作用是 设置多个key value

7、msetnx 命令

msetnx 命令的作用是 设置多个key value,仅当key不存在时

可以看出,msetnx k4 vv4 k5 vv5 时,此时不存在 k4 和 k5 因此该命令执行成功,在执行 msetnx k4 v4 k5 v5 k6 v6 时,由于 k4 和 k5 已经存在,则使得这条命令执行失败,因此 k4 和 k5 的值仍然是 vv4 和 vv5,并且没有 k6 这个 key。

8、incr 命令

incr 命令的作用是 执行原子加1操作

9、decr 命令

decr 命令的作用是 整数原子减1

10、incrby 命令

incrby 命令的作用是 执行原子增加一个整数

11、decrby 命令

decrby 命令的作用是 原子减指定的整数

12、incrbyfloat 命令

incrbyfloat 命令的作用是 执行原子增加一个浮点数

13、setrange 命令

setrange 命令的作用是 修改字符串指定偏移的值

字符串的偏移从 0 开始,hello 的长度为 5,最后 1 个下标为 4,当我们 setrange kstr 6 x 时,我们将 kstr 下标 6 的位置设置为了 x,因此在下标 5 的位置处给了一个 \x00,即 ASCII 码的 0。

14、getrange 命令

getrange 命令的作用是 获取存储在key上的值的一个子字符串

下标 -1 为最后一个下标,下标 -2 为倒数第二个下标

15、append 命令

append 命令的作用是 追加一个值到key上

总结

这些基础的命令当中,除了可以当作基础的操作 字符串 的命令来用,也有其他方面的用处,比如在高并发当中可以用来设置锁等。把今天整理的命令完善了一个思维导图,图片如下。

redis setnx会读从库吗

redis是会读从库的。

在redis里,所谓纤模setnx,是「SET if Not eXists」的缩写,也就是只有不存在的时候才设置,可以利用它来实现锁耐启的效果,而要实现锁的效果毁亩缓就必须读取从库。

Redis的Setnx命令实现分布式锁

首先,分布式锁和我们平常讲到的锁原理基本一样,目的就是确保在多个线程并发时,只有一个线程在同一刻操作这个业务或者说方法、变量。

在一个进程中,也就是一个jvm或者说应用中,我们很容易去处理控制,在 java.util 并发包中已经为我们提供了这些方法去加锁,比如 synchronized 关键字或者 Lock 锁,都可以处理。

但是如果在分布式环境下,要保证多个线程同时只有1个能访问某个资源,就需要用到分布式锁。这里我们将介绍用Redis的 setnx 命令来实现分布式锁。

其实目前通常所说的 setnx 命令,并非单指redis的 setnx key value 这条命令,这条命令可能会在后期redis版本中删除。

一般代指redis中对 set 命令加上 nx 参数进行使用, set 这个命令,目前已经支持这么多参数可选:

从 Redis 2.6.12 版本开始, SET 命令的行为可以通过一系列参数来修改:

注入bean

这里同时启动5个线程并发往redis中存储 lock 这个key(key可以自定义,但需要一致),同时设置10秒的过期时间。

setIfAbsent 这个函数实现的功能与 setnx 命令一样,代表如果没有这个key则set成功获取到锁,否则set失败没有获取到锁。

获得锁后进行资源的操作,最后释放锁。

执行效果 :

可以看到同时只有1个线程能够获取到锁。

使用 setnx 命令方式虽然操作比较简单方便,但是会有如下问题:

可以在丛肢再次获取锁时,如果锁被占用就get值,判断值是否是当前线程存的随机值,如果是则再次执行 set 命令重新上锁;当然为了保证原子性这些操作都要用 lua 脚本来执行。

可以使用 while 循环重复执行 setnx 命令,并设置一个超时时间退出循环。

可以尽量把锁自动过期的时间设的冗余一些。但也不能绝橡彻底解决。

可以在删除锁的时候先get值,判断值是否是当前线程存的随机值,只有相同才执行渗宏世删锁的操作;当然也要使用 lua 脚本执行来保证原子性。

分布式锁需要满足的特性

综上:使用 setnx 命令来实现分布式锁并不是一个很严谨的方案,如果是Java技术栈,我们可以使用 Redisson 库来解决以上问题,接下来的文章会介绍如何使用。

Redisson实现分布式锁

Redlock实现分布式锁

[img]

关于redissetnx和的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

标签列表