🗒️redis数据库3—redis数据类型(字符串操作)
00 分钟
2024-8-24
2024-8-24
type
status
date
slug
summary
tags
category
icon
password

启动redis

启动redis服务端
上述代码中是你实际redis的实际安装路径
notion image
启动redis客户端
notion image

set和setnx

在 Redis 中,SETSETNX 是两个不同的命令,它们的主要区别在于如何设置键的值:

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)非常适合用来实现简单的分布式锁。以下是实现步骤:
  1. 获取锁:
      • 使用 SETNX 命令尝试在 Redis 中设置一个键(通常称为锁键)。
      • 如果该键不存在(表示锁没有被其他进程占用),SETNX 会成功设置并返回 1,表示锁定成功。
      • 如果该键已经存在(表示锁已经被其他进程占用),SETNX 返回 0,表示锁定失败。
  1. 设置锁的过期时间:
      • 为了防止某些情况(如进程崩溃)导致锁永久无法释放,可以给锁键设置一个过期时间。
      • 过期时间可以通过 SET 命令的 EX 参数或 PX 参数来设置,或者在成功获取锁后使用 EXPIRE 命令来设置。
  1. 释放锁:
      • 只有成功获取锁的进程才可以释放锁。释放锁可以通过 DEL 命令删除锁键。
      • 为了避免误删除其他进程的锁(例如锁的过期时间到了,但执行解锁的进程已经超时),可以在设置锁时将进程的唯一标识符作为值存储在锁键中,释放时先判断值是否匹配,再执行删除操作。

分布式锁示例代码

以下是一个使用 SETNX 实现分布式锁的示例代码:

代码解释:

  • SETNX:通过 client.set(lock_key, identifier, nx=True, ex=10) 尝试设置锁键,如果成功则获取锁,并设置过期时间为10秒。
  • 唯一标识符 identifier:用于标识哪个进程拥有锁,防止误删他人锁。
  • 释放锁:在执行完受保护的代码块后,检查锁的值是否与 identifier 一致,如果一致则删除锁键释放锁。

分布式锁的应用场景

  • 任务调度:确保在同一时刻,某个任务只会被执行一次,避免多次执行。
  • 数据库资源访问控制:防止多个进程并发修改数据库中的同一数据。
  • 限流控制:在高并发场景下,控制某些操作的最大并发数。
 

setex

SETEX 是 Redis 中的一个命令,用于设置键的值并指定该键的过期时间。它的作用是保证键在指定的时间之后自动过期和删除,因此你不需要手动删除该键。

SETEX 命令的语法

  • key: 要设置的键名。
  • seconds: 该键的过期时间(以秒为单位)。
  • value: 要设置的值。

SETEX 的主要功能

  • 设置值: SETEXSET 命令类似,可以用于设置键的值。
  • 设置过期时间: 与 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 会覆盖它的值。
  • 示例:
    • 这将同时设置 key1key2key3,分别对应值 "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 中,自增和自减功能允许你对存储在键中的数值进行递增或递减操作。这些操作通常用于计数、标记或其他需要动态更新数值的场景。

自增功能 (INCRINCRBY)

INCR 命令

  • 功能: 将键的值递增 1。
  • 语法:
    • key: 要递增的键名。
  • 返回值: 递增后的新值。
  • 示例:
    • 如果 mycounter 的初始值是 10,执行上述命令后,mycounter 的值将变为 11

INCRBY 命令

  • 功能: 按指定的增量递增键的值。
  • 语法:
    • key: 要递增的键名。
    • increment: 要增加的数值(可以为正数或负数)。
  • 返回值: 递增后的新值。
  • 示例:
    • 如果 mycounter 的初始值是 10,执行上述命令后,mycounter 的值将变为 15

自减功能 (DECRDECRBY)

DECR 命令

  • 功能: 将键的值递减 1。
  • 语法:
    • key: 要递减的键名。
  • 返回值: 递减后的新值。
  • 示例:
    • 如果 mycounter 的初始值是 10,执行上述命令后,mycounter 的值将变为 9

DECRBY 命令

  • 功能: 按指定的减量递减键的值。
  • 语法:
    • key: 要递减的键名。
    • decrement: 要减少的数值(可以为正数或负数)。
  • 返回值: 递减后的新值。
  • 示例:
    • 如果 mycounter 的初始值是 10,执行上述命令后,mycounter 的值将变为 7

特性与注意事项

  • 自动初始化: 如果递增或递减的键不存在,Redis 会将该键初始化为 0,然后再执行递增或递减操作。
  • 整数类型: 这些操作只能对整数类型的值进行。如果键存储的值不是整数类型,Redis 会返回一个错误。
  • 线程安全: INCRDECR 及其变体命令是原子操作,即使在高并发环境下,也能确保操作的正确性。

使用场景

  • 计数器: 例如网站访问量、点赞次数等。
  • 库存管理: 例如电商系统中管理商品库存数量。
  • 限流: 控制某个操作的执行次数,例如用户登录尝试次数。

 

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 提供了一系列用于操作位的命令,这些命令可以操作存储在键中的二进制数据。常见的比特流操作命令包括:
  1. SETBIT:设置字符串中指定偏移量上的位。
  1. GETBIT:获取字符串中指定偏移量上的位。
  1. BITCOUNT:统计字符串中被设置为 1 的位数。
  1. BITOP:对一个或多个键执行按位操作,并将结果存储在目标键中。
  1. BITPOS:查找字符串中第一个设置为 1 或 0 的位的位置。

1. SETBIT 命令

功能:设置字符串中指定偏移量上的位为 10
语法
  • key: 要操作的键名。
  • offset: 位的偏移量(从 0 开始)。
  • value: 要设置的位的值(0 或 1)。
示例
这将把 mykey 字符串的第 8 个位(偏移量从 0 开始,因此第 7 个偏移量)设置为 1

2. GETBIT 命令

功能:获取字符串中指定偏移量上的位的值。
语法
  • key: 要操作的键名。
  • offset: 要获取的位的偏移量(从 0 开始)。
示例
这将返回 mykey 字符串中第 8 个位的值(可能是 01)。

3. BITCOUNT 命令

功能:统计字符串中被设置为 1 的位数。
语法
  • key: 要统计的键名。
  • startend: 可选参数,指定统计的字节范围。
示例
这将返回 mykey 字符串中所有被设置为 1 的位数。

4. BITOP 命令

功能:对一个或多个键执行按位操作,并将结果存储在目标键中。
支持的操作ANDORXORNOT
语法
  • operation: 要执行的操作(AND、OR、XOR、NOT)。
  • destkey: 存储结果的键。
  • key1, key2, ...: 要参与运算的键。
示例
这将对 key1key2 执行按位 AND 操作,并将结果存储在 resultKey 中。

5. BITPOS 命令

功能:查找字符串中第一个设置为 10 的位的位置。
语法
  • key: 要操作的键名。
  • bit: 要查找的位的值(0 或 1)。
  • startend: 可选参数,指定查找的字节范围。
示例
这将返回 mykey 中第一个被设置为 1 的位的位置。

使用场景

  • 布尔数组:可以用来高效地存储和操作大量布尔值。
  • 计数和统计:可以通过 BITCOUNT 进行快速统计,例如统计活跃用户。
  • 位图操作:可用于实现类似于位图索引的功能,在某些数据密集型场景中非常有用。

总结

比特流操作为 Redis 提供了对二进制数据进行精细操作的能力,这在处理低级数据结构、布尔标志、计数器、位图等场景中非常有用。

 

打赏

如果您觉得我的内容对你有所帮助,不要吝啬你的一键三连!如果你有能力的话也可以通过下面请我喝杯咖啡~金额您随意~如果对文章内容有任何疑问,欢迎加入群组联系我~
notion image
 
上一篇
redis数据库2—数据类型和应用场景
下一篇
redis数据库4—key操作