Redis SETNX命令

Redis SETNX命令详解

SETNX命令介绍

Redis的SETNX命令用来向Redis中指定的key设置一个值,当且仅当该key不存在的情况下。如果该key已经存在,则SETNX命令不做任何操作。SETNX命令是原子操作,即在同一时间只能有一个客户端对同一个key执行SETNX命令。

SETNX命令使用方法

SETNX命令的使用方法如下:

SETNX key value

其中,key是要被设置的key,value是要为该key设置的值。

SETNX命令返回值

SETNX命令的返回值如下:

  • 如果key不存在,则设置成功,返回1
  • 如果key已经存在,则设置失败,返回0

SETNX命令实例说明

实例1

我们可以通过SETNX命令实现一个基于Redis的锁。在一个多线程或者多进程的程序中,若想要使用某一个共享资源时,需要先对该资源进行加锁,才能对该资源进行读写操作。实现一个Redis锁的示例代码如下:

import redis
import time

class RedisLocker():
    def __init__(self, redis_host, redis_port, redis_db, lock_ttl):
        self.redis_conn = redis.StrictRedis(host=redis_host, port=redis_port, db=redis_db)
        self.lock_ttl = lock_ttl

    def acquire(self, lock_name, lock_id):
        while True:
            lock_value = int(time.time()) + self.lock_ttl
            acquired = self.redis_conn.setnx(lock_name, lock_value)
            if acquired or (int(self.redis_conn.get(lock_name)) < int(time.time()) and self.redis_conn.getset(lock_name, lock_value)):
                print(f"线程 {lock_id} 拿到了锁")
                return lock_value
            print(f"线程 {lock_id} 没有拿到锁")
            time.sleep(0.02)

    def release(self, lock_name, lock_value):
        if self.redis_conn.get(lock_name) == lock_value:
            self.redis_conn.delete(lock_name)
            print(f"锁 {lock_name}:{lock_value} 释放成功")
        else:
            print(f"锁 {lock_name}:{lock_value} 已经被释放或该锁已被其他线程占用")

在上面的代码中,我们通过调用Redis的SETNX命令创建了一个名为lock_name的key,并设置了一个value值。如果获取锁的线程在锁的过期时间之前调用release()方法,那么该锁就会被正常地释放掉。如果在锁的过期时间之内其他线程没有尝试获取该锁,那么释放锁的任务会被自动交给Redis,以免因为某个线程忘记释放锁而导致其他线程无法获取到该资源。

实例2

当需要在程序中将一个变量做递增操作时,可以使用Redis中的INCR命令。但是使用INCR命令前,我们可能需要检查该key是否存在,如果不存在,则需要先将该key初始化为1。为了解决这个问题,可以使用Redis中的SETNX命令结合INCR命令来实现该功能。示例代码如下:

import redis

redis_conn = redis.StrictRedis()

if not redis_conn.exists("count"):
    redis_conn.setnx("count", 1)

redis_conn.incr("count")
count = redis_conn.get("count")
print(f"当前count的值是 {count}")

在上面的代码中,如果count不存在,则使用setnx命令将count初始化为1。如果count已经存在,则使用incr命令将count自增1,并获取自增后的值。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Redis SETNX命令 - Python技术站

(0)
上一篇 2023年3月27日
下一篇 2023年3月27日

相关文章

  • Django缓存优化之redis

         Redis 概述   Redis 是一个开源的Inmemory key-value 存储系统,性能高,很大程度上补偿了 memcached 的不足。支持多种存储类型,包括 string, list, set, zset(sorted set — 有序集合)和 hash。   Redis 优点   1)异常快速:Redis的速度非常快,每秒能执行约…

    Redis 2023年4月13日
    00
  • redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool at redis.clients.util.Pool.getResource(Pool.java:53)

    解决方法1: 主要就是要去redis的配置文件中修改密码,修改完密码后记得重启redis。跟着作者的步骤走,可以完美解决! 解决方法2: 在配置文件中把password去除一样可以解决! 1.把redis配置文件中的password注释了 2.把spring-redis中的passwrod配置也注释了   参考:https://blog.csdn.net/i…

    Redis 2023年4月12日
    00
  • 三台服务器使用docker搭建redis一主二从三哨兵,概念-搭建-整合springboot

    一、前言 redis在我们企业级开发中是很常见的,但是单个redis不能保证我们的稳定使用,所以我们要建立一个集群。redis有两种高可用的方案: High availability with Redis Sentinel(哨兵) Scaling with Redis Cluster(分片集群) 第一个就是我们本次的要搭建的,就是高可用的哨兵,主redis挂…

    2023年4月9日
    00
  • 一文带你吃透Redis

    目录 1. 基本数据结构 2. 数据持久化 3. 高可用 4. 缓存 文章字数大约1.9万字,阅读大概需要66分钟,建议收藏后慢慢阅读!!! 1. 基本数据结构 什么是Redis Redis是一个数据库,不过与传统数据库不同的是Redis的数据库是存在内存中,所以读写速度非常快,因此 Redis被广泛应用于缓存方向。 除此之外,Redis也经常用来做分布式锁…

    Redis 2023年4月10日
    00
  • redis集群搭建及一些问题

      redis     (本套Redis集群为简化版安装部署,只需解压至普通用户家目录下或者任意目录,解压后修改脚本,执行脚本后即可使用。)     注意,此版本需要在redis配置文件中添加 protected-mode no,确认添加完成后再启动服务。 1、单机部署 1.新建普通用户,将压缩包解压到家目录下。 tar zxf rediscluster.t…

    Redis 2023年4月12日
    00
  • redis学习(一)

    redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set –有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基…

    Redis 2023年4月11日
    00
  • scrapy爬虫-scrapy-redis分布式

    1、如何将一个scrapy爬虫项目修改成为一个简单的分布式爬虫项目 官方文档:https://scrapy-redis.readthedocs.io/en/stable/ 只用修改scrapy项目的两个文件就可以了 一个是爬虫组件文件# -*- coding: utf-8 -*- scrapy from scrapy_redis.spiders import…

    Redis 2023年4月13日
    00
  • 手动搭建redis集群(3台)

    1.搜索源中的redis包 apt-cache pkgnames | grep redis 2.安装redis-server apt-get install redis-server 根据端口号配置redis并开启集群配置 1.复制redis配置文件 cp redis.conf nodes7000.conf 2.搜索cluster-enabled变量 并设置…

    Redis 2023年4月12日
    00
合作推广
合作推广
分享本页
返回顶部