type
status
date
slug
summary
tags
category
icon
password
启动redis
启动redis服务端
上述代码中是你实际redis的实际安装路径
启动redis客户端
set和setnx
在 Redis 中,
SET
和 SETNX
是两个不同的命令,它们的主要区别在于如何设置键的值:1. SET
命令:
- 功能:
SET
命令用于设置一个键的值。如果该键已经存在,它将覆盖键的现有值。
- 语法:
SET key value [EX seconds] [PX milliseconds] [NX|XX]
- 示例:
SET mykey "Hello"
- 如果
mykey
存在,SET
命令将其值覆盖为"Hello"
。 - 如果
mykey
不存在,SET
命令将创建该键并赋值为"Hello"
。
2. SETNX
命令:
- 功能:
SETNX
(Set if Not Exists)命令用于在键不存在时设置键的值。如果该键已经存在,则不会执行任何操作。
- 语法:
SETNX key value
- 示例:
SETNX mykey "Hello"
- 如果
mykey
不存在,SETNX
将设置其值为"Hello"
。 - 如果
mykey
已经存在,SETNX
将不会改变键的值,命令将返回0
。
总结:
SET
:总是设置键的值,无论键是否存在。
SETNX
:仅在键不存在时设置键的值,如果键已存在,则不执行任何操作。
使用场景:
SET
适用于需要无条件设置键值的场景。
SETNX
适用于需要确保某个键在系统中只被初始化一次的场景,如实现分布式锁或者防止某些值的多次覆盖。
分布式锁
什么是分布式锁?
分布式锁是一种用于协调分布式系统中多个进程(通常是多个不同的服务或服务器)对共享资源的访问控制机制。它确保在某一时刻,只有一个进程可以获得某一资源的访问权限,从而避免竞争条件、数据不一致或其他并发问题。
使用 SETNX
实现分布式锁
Redis 提供的
SETNX
命令(Set if Not eXists)非常适合用来实现简单的分布式锁。以下是实现步骤:- 获取锁:
- 使用
SETNX
命令尝试在 Redis 中设置一个键(通常称为锁键)。 - 如果该键不存在(表示锁没有被其他进程占用),
SETNX
会成功设置并返回1
,表示锁定成功。 - 如果该键已经存在(表示锁已经被其他进程占用),
SETNX
返回0
,表示锁定失败。
- 设置锁的过期时间:
- 为了防止某些情况(如进程崩溃)导致锁永久无法释放,可以给锁键设置一个过期时间。
- 过期时间可以通过
SET
命令的EX
参数或PX
参数来设置,或者在成功获取锁后使用EXPIRE
命令来设置。
- 释放锁:
- 只有成功获取锁的进程才可以释放锁。释放锁可以通过
DEL
命令删除锁键。 - 为了避免误删除其他进程的锁(例如锁的过期时间到了,但执行解锁的进程已经超时),可以在设置锁时将进程的唯一标识符作为值存储在锁键中,释放时先判断值是否匹配,再执行删除操作。
分布式锁示例代码
以下是一个使用
SETNX
实现分布式锁的示例代码:代码解释:
SETNX
:通过client.set(lock_key, identifier, nx=True, ex=10)
尝试设置锁键,如果成功则获取锁,并设置过期时间为10秒。
- 唯一标识符
identifier
:用于标识哪个进程拥有锁,防止误删他人锁。
- 释放锁:在执行完受保护的代码块后,检查锁的值是否与
identifier
一致,如果一致则删除锁键释放锁。
分布式锁的应用场景
- 任务调度:确保在同一时刻,某个任务只会被执行一次,避免多次执行。
- 数据库资源访问控制:防止多个进程并发修改数据库中的同一数据。
- 限流控制:在高并发场景下,控制某些操作的最大并发数。
setex
SETEX
是 Redis 中的一个命令,用于设置键的值并指定该键的过期时间。它的作用是保证键在指定的时间之后自动过期和删除,因此你不需要手动删除该键。SETEX
命令的语法
- key: 要设置的键名。
- seconds: 该键的过期时间(以秒为单位)。
- value: 要设置的值。
SETEX
的主要功能
- 设置值:
SETEX
与SET
命令类似,可以用于设置键的值。
- 设置过期时间: 与
SET
不同,SETEX
强制要求设置一个过期时间。键在过期时间到期后会自动从 Redis 中删除。
- 原子操作:
SETEX
是原子性的,这意味着设置键值和设置过期时间的操作是同时执行的,避免了潜在的竞争条件问题。
示例
假设你要存储一个键,并让它在 10 秒后过期,可以使用以下命令:
- mykey: 键名。
- 10: 过期时间,单位为秒。
- "Hello, Redis!": 存储在
mykey
中的值。
在上述命令执行后,
mykey
会存在于 Redis 中,并保存值 "Hello, Redis!"
。10 秒后,mykey
会自动从 Redis 中删除。SETEX
的应用场景
- 缓存: 使用
SETEX
可以为缓存数据设置过期时间,确保缓存不会无限期地占用内存。
- 会话管理: 在存储用户会话信息时,可以使用
SETEX
设置会话的有效期,用户不活跃一段时间后会话会自动过期。
- 限时功能: 如限时优惠、验证码等场景,可以使用
SETEX
设置这些功能的有效期。
mset
- 功能: 批量设置多个键值对。
- 语法:
key1, key2, ... keyN
: 要设置的键名。value1, value2, ... valueN
: 对应的值。
- 特性:
- 原子性: 所有键值对要么全部设置成功,要么一个都不会被设置。
- 覆盖已有值: 如果键已经存在,
MSET
会覆盖它的值。
- 示例:
这将同时设置
key1
、key2
和 key3
,分别对应值 "value1"
、value2"
和 "value3"
。mget
- 功能: 批量获取多个键对应的值。
- 语法:
key1, key2, ... keyN
: 要获取值的键名。
- 特性:
- 如果某个键不存在,返回的列表中该位置的值为
nil
(即空值)。 - 顺序一致: 返回的值列表顺序与请求的键顺序一致。
- 示例:
假设
key1
的值为 "value1"
,key2
的值为 "value2"
,key3
不存在,那么返回结果为:使用场景
- MSET:
- 当需要一次性设置多个相关联的键值对时,使用
MSET
提供了一个高效且原子性的操作。 - 在系统初始化或批量数据导入时特别有用。
- MGET:
- 在需要一次性读取多个键的值时,使用
MGET
能减少与 Redis 的通信次数,提高读取效率。 - 适合在缓存系统中一次性读取多个缓存项。
总结
- MSET: 用于批量设置多个键值对,覆盖已存在的键。
- MGET: 用于批量获取多个键的值,返回一个值列表,包含不存在键的
nil
值。
append
在 Redis 中,
APPEND
命令用于将指定的值追加到现有键的值后面。如果该键不存在,APPEND
会创建一个新的键,并将值作为键的初始值。APPEND
命令的语法
- key: 要追加值的键名。
- value: 要追加的值。
APPEND
命令的特性
- 追加值: 如果指定的键已经存在且存储的是字符串,
APPEND
命令会将value
追加到该字符串的末尾。
- 创建新键: 如果指定的键不存在,
APPEND
会创建该键,并将value
作为键的初始值。
- 返回值:
APPEND
命令的返回值是追加后键的字符串长度。
示例
假设你有一个键
mykey
,其当前值为 "Hello"
。你想将 " World"
追加到这个值的后面:执行上述命令后,
mykey
的值将变为 "Hello World"
。如果
mykey
不存在,执行以下命令:此时,
mykey
的值将被设置为 "Hello"
,因为键之前不存在。使用场景
- 日志记录: 可以使用
APPEND
命令将新日志消息追加到现有日志字符串中,方便进行简单的日志记录。
- 字符串构建: 在需要不断扩展某个字符串值的场景中,
APPEND
提供了一种简便的方式。
注意事项
- 类型要求:
APPEND
只能对字符串类型的键进行操作。如果键存储的是其他类型的数据(如列表、集合等),使用APPEND
会返回错误。
自增自减
web开发中的电商抢购、秒杀。游戏里面的投票、攻击计数。系统中计算当前在线人数。
在 Redis 中,自增和自减功能允许你对存储在键中的数值进行递增或递减操作。这些操作通常用于计数、标记或其他需要动态更新数值的场景。
自增功能 (INCR
和 INCRBY
)
INCR
命令
- 功能: 将键的值递增 1。
- 语法:
key
: 要递增的键名。
- 返回值: 递增后的新值。
- 示例:
如果
mycounter
的初始值是 10
,执行上述命令后,mycounter
的值将变为 11
。INCRBY
命令
- 功能: 按指定的增量递增键的值。
- 语法:
key
: 要递增的键名。increment
: 要增加的数值(可以为正数或负数)。
- 返回值: 递增后的新值。
- 示例:
如果
mycounter
的初始值是 10
,执行上述命令后,mycounter
的值将变为 15
。自减功能 (DECR
和 DECRBY
)
DECR
命令
- 功能: 将键的值递减 1。
- 语法:
key
: 要递减的键名。
- 返回值: 递减后的新值。
- 示例:
如果
mycounter
的初始值是 10
,执行上述命令后,mycounter
的值将变为 9
。DECRBY
命令
- 功能: 按指定的减量递减键的值。
- 语法:
key
: 要递减的键名。decrement
: 要减少的数值(可以为正数或负数)。
- 返回值: 递减后的新值。
- 示例:
如果
mycounter
的初始值是 10
,执行上述命令后,mycounter
的值将变为 7
。特性与注意事项
- 自动初始化: 如果递增或递减的键不存在,Redis 会将该键初始化为
0
,然后再执行递增或递减操作。
- 整数类型: 这些操作只能对整数类型的值进行。如果键存储的值不是整数类型,Redis 会返回一个错误。
- 线程安全:
INCR
、DECR
及其变体命令是原子操作,即使在高并发环境下,也能确保操作的正确性。
使用场景
- 计数器: 例如网站访问量、点赞次数等。
- 库存管理: 例如电商系统中管理商品库存数量。
- 限流: 控制某个操作的执行次数,例如用户登录尝试次数。
strlen
在 Redis 中,
STRLEN
命令用于获取指定键所存储的字符串值的长度。如果键不存在,STRLEN
返回 0
。STRLEN
命令的语法
- key: 要获取其值长度的键名。
特性
- 返回值:
STRLEN
返回的是存储在键中的字符串的字符数。
- 键不存在时: 如果指定的键不存在,
STRLEN
返回0
。
- 非字符串类型的键: 如果键存储的值不是字符串类型(例如列表、集合等),
STRLEN
会返回错误。
示例
假设有一个键
mykey
,它的值为 "Hello, Redis!"
:执行此命令后,Redis 将返回
13
,因为 "Hello, Redis!"
包含 13 个字符(包括空格和标点符号)。如果键
mykey
不存在,执行以下命令:Redis 将返回
0
。使用场景
- 检查字符串长度: 在某些情况下,你可能需要根据存储的字符串长度做出决策,例如判断是否需要截断字符串或填充字符串以满足特定长度要求。
- 验证数据完整性: 在存储固定长度的数据(如编码、ID 等)时,
STRLEN
可用于验证存储的数据是否符合预期的长度。
比特流操作
比特流操作(Bitwise Operations)是对存储在 Redis 中的字符串值进行按位操作的功能。这些操作允许你直接处理字符串的比特级数据,在某些特定场景中非常有用,例如处理布尔数组、位图或紧凑存储的数据。
Redis 中的比特流操作命令
Redis 提供了一系列用于操作位的命令,这些命令可以操作存储在键中的二进制数据。常见的比特流操作命令包括:
SETBIT
:设置字符串中指定偏移量上的位。
GETBIT
:获取字符串中指定偏移量上的位。
BITCOUNT
:统计字符串中被设置为 1 的位数。
BITOP
:对一个或多个键执行按位操作,并将结果存储在目标键中。
BITPOS
:查找字符串中第一个设置为 1 或 0 的位的位置。
1. SETBIT
命令
功能:设置字符串中指定偏移量上的位为
1
或 0
。语法:
key
: 要操作的键名。
offset
: 位的偏移量(从 0 开始)。
value
: 要设置的位的值(0 或 1)。
示例:
这将把
mykey
字符串的第 8 个位(偏移量从 0 开始,因此第 7 个偏移量)设置为 1
。2. GETBIT
命令
功能:获取字符串中指定偏移量上的位的值。
语法:
key
: 要操作的键名。
offset
: 要获取的位的偏移量(从 0 开始)。
示例:
这将返回
mykey
字符串中第 8 个位的值(可能是 0
或 1
)。3. BITCOUNT
命令
功能:统计字符串中被设置为
1
的位数。语法:
key
: 要统计的键名。
start
和end
: 可选参数,指定统计的字节范围。
示例:
这将返回
mykey
字符串中所有被设置为 1
的位数。4. BITOP
命令
功能:对一个或多个键执行按位操作,并将结果存储在目标键中。
支持的操作:
AND
、OR
、XOR
、NOT
。语法:
operation
: 要执行的操作(AND、OR、XOR、NOT)。
destkey
: 存储结果的键。
key1
,key2
, ...: 要参与运算的键。
示例:
这将对
key1
和 key2
执行按位 AND
操作,并将结果存储在 resultKey
中。5. BITPOS
命令
功能:查找字符串中第一个设置为
1
或 0
的位的位置。语法:
key
: 要操作的键名。
bit
: 要查找的位的值(0 或 1)。
start
和end
: 可选参数,指定查找的字节范围。
示例:
这将返回
mykey
中第一个被设置为 1
的位的位置。使用场景
- 布尔数组:可以用来高效地存储和操作大量布尔值。
- 计数和统计:可以通过
BITCOUNT
进行快速统计,例如统计活跃用户。
- 位图操作:可用于实现类似于位图索引的功能,在某些数据密集型场景中非常有用。
总结
比特流操作为 Redis 提供了对二进制数据进行精细操作的能力,这在处理低级数据结构、布尔标志、计数器、位图等场景中非常有用。
打赏
如果您觉得我的内容对你有所帮助,不要吝啬你的一键三连!如果你有能力的话也可以通过下面请我喝杯咖啡~金额您随意~如果对文章内容有任何疑问,欢迎加入群组联系我~
- 作者:Don Mark
- 链接:null/article/ce479975-0c09-448c-8d60-303e0c6ac15d
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。