一,Redis基础

一,NoSQL介绍

NoSQL(Not Only SQL )泛指非关系型数据库,用于解决传统关系型数据库(如MySQL、PostgreSQL)在大数据、高并发、灵活数据模型等场景下的局限性。NoSQL数据库通常具有高扩展性、高性能、灵活的数据模型等特点。


1.1 NoSQL的特点

特性 说明
灵活的数据模型 不需要预定义表结构,支持动态字段(如JSON、键值对、图结构等)。
高扩展性 支持水平扩展(通过分片、集群),适合海量数据存储。
高性能 优化读写速度,适合高并发场景(如缓存、实时分析)。
弱一致性(部分) 部分NoSQL数据库采用最终一致性(如Cassandra),而非强一致性(如ACID)。

1.2 NoSQL 的常见类型

  1. 键值存储(Key-Value Store)
    • 特点:最简单的NoSQL模型,数据以键值对(Key-Value)形式存储。
    • 适用场景:缓存、会话存储、配置管理。
    • 代表数据库
      • Redis(内存数据库,支持持久化)
      • DynamoDB(AWS托管,自动扩展)
      • Etcd(分布式键值存储,用于Kubernetes)
  2. 文档数据库(Document Store)
    • 特点:存储半结构化数据(如JSON、XML),支持嵌套结构。
    • 适用场景:内容管理、用户配置、日志存储。
    • 代表数据库
      • MongoDB(最流行的文档数据库)
      • CouchDB(支持离线同步)
      • Firestore(Google的实时文档数据库)
  3. 列族存储(Column-Family Store)
    • 特点:数据按列存储(而非行),适合大规模数据分析。
    • 适用场景:日志分析、时序数据、大数据存储。
    • 代表数据库
      • Cassandra(高可用、分布式)
      • HBase(基于Hadoop,适合大数据)
      • ScyllaDB(高性能,兼容Cassandra)
  4. 图数据库(Graph Database)
    • 特点:以图(节点+边)存储数据,适合复杂关系分析。
    • 适用场景:社交网络、推荐系统、欺诈检测。
    • 代表数据库
      • Neo4j(最流行的图数据库)
      • ArangoDB(多模型,支持图+文档)
      • Dgraph(分布式图数据库)

1.3 NoSQL vs SQL(关系型数据库)

对比项 NoSQL SQL(关系型数据库)
数据模型 灵活(无固定模式) 固定表结构(Schema)
扩展性 水平扩展(分布式) 垂直扩展(单机优化)
事务支持 部分支持(如MongoDB 4.0+) 完整ACID事务(如MySQL)
查询语言 无标准(各数据库不同) SQL(标准化)
适用场景 大数据、高并发、灵活数据 强一致性、复杂查询、事务需求

1.4 NoSQL 的典型应用场景

  1. 缓存加速(如Redis)
  2. 实时数据处理(如MongoDB存储日志)
  3. 社交网络关系(如Neo4j存储用户关系)
  4. 物联网时序数据(如Cassandra存储传感器数据)
  5. 内容管理系统(如Firestore存储动态内容)

1.5 如何选择 NoSQL 数据库

  • 需要缓存?Redis
  • 存储JSON文档?MongoDB
  • 超大规模数据分析?Cassandra/HBase
  • 复杂关系分析?Neo4j
  • 需要ACID事务? → 考虑 SQLMongoDB(4.0+支持事务)

二,Redis介绍

Redis诞生于2009年全称是Remote Dictionary Server,远程词典服务器,是一个基于内存的键值型NOSOL数据库

Redis特征:

  • 数据结构多样性:Redis支持多种数据结构,包括字符串、哈希表、列表、集合、有序集合、位图等,这使得它非常灵活,能够应对各种不同的用例。
  • 事务支持:Redis支持事务,允许将多个操作作为一个原子操作进行执行,这可以确保多个命令在一个事务中要么全部成功,要么全部失败。
  • 内存存储:Redis将数据存储在内存中,因此读取速度非常快,适用于对响应时间要求严格的应用。
  • 持久性 :虽然Redis是内存数据库,但它支持数据持久化,可以将数据保存到磁盘,以防止数据丢失。Redis提供两种主要的持久化方式:RDB快照和AOF日志。
  • 高可用性 :Redis可以配置为具有主从复制,即一个主节点和多个从节点,以提供数据的备份和故障恢复。
  • 支持多语言客户端
  • 缓存:Redis常用于缓存层,用来加速读取频繁的数据,如数据库查询结果、API响应等。由于其高性能和低延迟特性,Redis非常适合作为缓存系统的组件。
  • 集群:Redis支持集群模式,可以将数据分布在多个节点上,以提供更高的可扩展性和负载均衡。

Redis的使用场景包括但不限于缓存、实时分析、会话存储、排行榜、队列、发布/订阅系统等。

二,Redis客户端

2.1 Redis命令行客户端

Redis安装完成后就自带了命令行客户端: redis-cli,使用方式如下:

sh 复制代码
redis-cli [options] [commonds]

其中常见的options有:

  • -h 127.0.0.1指定要连接的redis节点的IP地址,默认是127.0.0.1
  • -p 6379:指定要连接的redis节点的端口,默认是6379
  • -a 123456 指定redis的访问密码

其中commonds就是Redis的操作命令,例如:

  • ping 与redis服务端做心跳测试,服务端正常就会返回pong
  • 不指定commond时,会进入redis-cli的交互控制台

2.2 Redis图形化客户端

直接去Github仓库找即可:github.com/lework/Redi...

三,Redis常见命令

3.1 Redis的数据结构

Redis是一个key-value的数据库,key一般是String类型,不过value的类型多种多样

3.2 Redis通用命令

  1. KEYS(查找匹配的 key)

    作用:查找符合模式的 key(生产环境慎用,可能导致性能问题)。

    语法

    bash 复制代码
    KEYS pattern

    示例

    bash 复制代码
    # 插入测试数据
    SET hello "world"
    SET hallo "redis"
    SET heello "example"
    
    # 查询单个字符匹配(? 代表一个字符)
    KEYS h?llo      # 返回 hallo(匹配 h + 任意1字符 + llo)
    
    # 查询多个字符匹配(* 代表任意多个字符)
    KEYS h*llo      # 返回 hello, hallo, heello(匹配 h + 任意字符 + llo)
  2. DEL(删除 key)

    作用 :删除一个或多个 key。 语法

    bash 复制代码
    DEL key [key ...]

    示例

    bash 复制代码
    # 删除单个 key
    DEL hello       # 删除 key="hello"
    
    # 删除多个 key
    DEL hallo heello
  3. EXISTS(检查 key 是否存在)

    作用 :判断 key 是否存在(存在返回 1,不存在返回 0)。 语法

    bash 复制代码
    EXISTS key

    示例

    bash 复制代码
    EXISTS hello    # 返回 1(存在)或 0(不存在)
  4. EXPIRE(设置 key 过期时间)

    作用 :给 key 设置有效期(单位:秒),到期自动删除。 语法

    bash 复制代码
    EXPIRE key seconds

    示例

    bash 复制代码
    # 设置 key="temp_data" 10秒后过期
    SET temp_data "test"
    EXPIRE temp_data 10
    
    # 10秒后,temp_data 自动删除
  5. TTL(查看 key 剩余存活时间)

markdown 复制代码
 **作用**:返回 key 的剩余生存时间(单位:秒)。
markdown 复制代码
 -   `-2`:key 不存在
 -   `-1`:key 存在但没有设置过期时间
 -   `>=0`:剩余秒数

 **语法**:

 ```bash
 TTL key
 ```

 **示例**:

 ```bash
 TTL temp_data   # 返回剩余秒数(如 5),或 -1/-2
 ```
  1. SELECT(切换数据库)
go 复制代码
 **作用**:Redis 默认有 16 个数据库(0-15),`SELECT` 用于切换。
 **语法**:

 ```bash
 SELECT index
 ```

 **示例**:

 ```bash
 SELECT 1        # 切换到数据库 1
 SET db1_key "value_in_db1"
 
 SELECT 0        # 切换回默认数据库 0
 ```
  1. MOVE(移动 key 到另一个数据库)
go 复制代码
 **作用**:将当前数据库的 key 移动到另一个数据库。
 **语法**:

 ```bash
 MOVE key db_index
 ```

 **示例**:

 ```bash
 # 将 key="mykey" 从当前数据库移动到数据库 2
 MOVE mykey 2
 ```
  1. RENAME(重命名 key)
vbnet 复制代码
 **作用**:修改 key 的名称(如果新 key 已存在,会覆盖旧值)。
 **语法**:

 ```bash
 RENAME old_key new_key
 ```

 **示例**:

 ```bash
 SET old_name "redis"
 RENAME old_name new_name   # 修改 key 名
 GET new_name              # 返回 "redis"
 ```
  1. TYPE(查看 key 的数据类型)
go 复制代码
 **作用**:返回 key 存储的数据类型(如 `string`、`hash`、`list` 等)。
 **语法**:

 ```bash
 TYPE key
 ```

 **示例**:

 ```bash
 SET name "Alice"
 TYPE name        # 返回 "string"
 
 LPUSH tasks "task1"
 TYPE tasks       # 返回 "list"
 ```

命令很简单,忘记了直接去查官方文档:Commands | Redis

通用命令一共分3类

  • 查询:keysEXISTSTTLTYPE
  • 修改:EXPIRERENAMEMOVESELECT
  • 删除:DEL

四 Redis常用数据类型

4.1 String类型

String 类型是 Redis 最基础的数据结构,适用于 缓存、计数器、分布式锁 等场景,根据字符串的格式不同,又可以分为3类

  • string:普通字符串
  • int:整数类型,可以做自增、自减操作
  • float:浮点类型,可以做自增、自减操作

不管是哪种格式,底层都是字节数组形 式存储,只不过是编码方式不同。字符串类型的最大空间不能超过512m


String 的核心特性

  1. 灵活的数据格式
    • 普通字符串(如 "hello")。
    • 数字(整型/浮点型,支持自增操作)。
    • 二进制数据(如 ProtoBuf、JSON 序列化后的数据)。
  2. 高性能 :所有操作时间复杂度均为 O(1)
  3. 原子性操作 :如 INCRAPPEND 等命令是线程安全的。

String 的常见命令

  1. 基本操作

    命令 作用 示例
    SET key value 设置键值对(覆盖旧值) SET username "Alice"
    GET key 获取键的值 GET username → 返回 "Alice"
    DEL key 删除键 DEL username
    EXISTS key 检查键是否存在 EXISTS username → 返回 10

    示例

    bash 复制代码
    SET greeting "Hello, Redis!"
    GET greeting  # 返回 "Hello, Redis!"
  2. 批量操作

    命令 作用 示例
    MSET key1 value1 key2 value2 批量设置多个键值对 MSET k1 "v1" k2 "v2"
    MGET key1 key2 批量获取多个键的值 MGET k1 k2 → 返回 ["v1", "v2"]

    示例

    bash 复制代码
    MSET name "Bob" age 30
    MGET name age  # 返回 ["Bob", "30"]
  3. 数字操作

    命令 作用 示例
    INCR key 将整数值自增 1 INCR counter1
    INCRBY key increment 将整数值自增指定步长 INCRBY counter 56
    INCRBYFLOAT key increment 将浮点数值自增指定步长 INCRBYFLOAT price 0.5
    DECR key 将整数值自减 1 DECR stock99

    示例

    bash 复制代码
    SET views 100
    INCR views      # views = 101
    INCRBY views 10 # views = 111
  4. 条件操作

    命令 作用 示例
    SETNX key value 仅当键 不存在 时设置值 SETNX lock 1(实现分布式锁)
    SETEX key seconds value 设置值并指定过期时间(秒) SETEX session 3600 "token"
    PSETEX key milliseconds value 设置值并指定过期时间(毫秒) PSETEX temp 5000 "data"

    示例

    bash 复制代码
    SETNX lock 1  # 如果 lock 不存在,则设置成功(返回 1)
    SETEX cache:user:1 60 "{...JSON数据...}"  # 60秒后自动删除
  5. 字符串操作

    命令 作用 示例
    APPEND key suffix 向字符串尾部追加内容 APPEND greeting "!!""Hello!!"
    STRLEN key 获取字符串长度 STRLEN greeting5
    GETRANGE key start end 获取子字符串(支持负数索引) GETRANGE greeting 0 3"Hell"
    SETRANGE key offset value 替换字符串指定位置的内容 SETRANGE greeting 6 "Redis"

    示例

    bash 复制代码
    SET msg "Hello"
    APPEND msg " World"  # msg = "Hello World"
    GETRANGE msg 6 -1    # 返回 "World"

KEY的结构

Redis的key允许有多个单词形成层级结构,多个单词之间用:隔开,格式如下

例如我们的项目名称叫heima,有userproduct两种不同类型的数据,我们可以这样定义key:

  • user相关的key:heima:user:1
  • product相关的key:heima:product:1

如果Value是一个ava对象,例如一个User对象,则可以将对象序列化为JSON字符串后存储:

4.2 Hash类型

Hash(哈希)是Redis中一种字段-值(field-value)映射表 结构,适合存储对象型数据 (如用户信息、商品详情)。每个Hash可以存储 2³² - 1 个键值对(约40亿)。

核心特性

  1. 结构化存储:类似JSON对象,一个key对应多个field-value。

    bash 复制代码
    user:1 = { "name":"Alice", "age":25, "email":"[email protected]" }
  2. 高效访问 :单个字段的读写复杂度为 O(1)

  3. 内存优化:多个字段共享同一个key,比多个String更省内存。


Hash的常用命令

  1. 基础操作

    命令 作用 示例
    HSET key field value 设置字段值 HSET user:1 name "Alice"
    HGET key field 获取字段值 HGET user:1 name"Alice"
    HDEL key field 删除字段 HDEL user:1 email
    HEXISTS key field 检查字段是否存在 HEXISTS user:1 age1

    示例

    bash 复制代码
    HSET product:100 name "iPhone" price 5999 stock 100
    HGET product:100 price  # 返回 "5999"
  2. 批量操作

    命令 作用 示例
    HMSET key field1 value1 ... 批量设置字段(旧版) HMSET user:2 name "Bob" age 30
    HMGET key field1 field2 ... 批量获取字段值 HMGET user:2 name age
    HGETALL key 获取所有字段和值 HGETALL user:2

    示例

    bash 复制代码
    HMSET employee:101 name "Charlie" department "IT" salary 8000
    HMGET employee:101 name salary  # 返回 ["Charlie", "8000"]
  3. 数字操作

    命令 作用 示例
    HINCRBY key field increment 整数字段自增 HINCRBY product:100 stock -1(库存-1)
    HINCRBYFLOAT key field increment 浮点数字段自增 HINCRBYFLOAT account:1 balance 50.5

    示例

    bash 复制代码
    HSET counter:page_views home 0
    HINCRBY counter:page_views home 1  # home访问量+1
  4. 查询字段信息

    命令 作用 示例
    HKEYS key 获取所有字段名 HKEYS user:1["name", "age"]
    HVALS key 获取所有字段值 HVALS user:1["Alice", "25"]
    HLEN key 获取字段数量 HLEN user:12

总结 ,Hash的命令与String的命令很类似,记忆方法是在前面加上H,而且Hash多了4个String没有的方法

  • HLEN:获取字段数量
  • HGETALL:获取所有字段和值
  • HKEYS:获取所有字段名
  • HVALS:获取所有字段值

4.3 List类型

List 是 Redis 的 双向链表数据结构 ,支持在头部/尾部高效插入和删除元素,适合实现 栈、队列、消息流 等场景。

List 的核心特性

  1. 有序性:元素按插入顺序排列。
  2. 可重复:允许存储相同值。
  3. 操作高效
    • 头部/尾部操作:O(1) 时间复杂度。
    • 中间操作(如按索引查询):O(n) 时间复杂度。

常用来存储一个有序数据,例如:朋友圈点赞列表,评论列表等

List 常用命令

  1. 插入元素

    命令 作用 示例
    LPUSH key element 列表头部 插入元素 LPUSH tasks "task1"
    RPUSH key element 列表尾部 插入元素 RPUSH tasks "task2"
    LINSERT key BEFORE/AFTER pivot element 在指定元素前/后插入 LINSERT tasks BEFORE "task2" "urgent"

    示例

    bash 复制代码
    LPUSH messages "hello"    # 列表: ["hello"]
    RPUSH messages "world"   # 列表: ["hello", "world"]
    LINSERT messages BEFORE "world" "Redis"  # 列表: ["hello", "Redis", "world"]
  2. 删除元素

    命令 作用 示例
    LPOP key 移除并返回 头部第一个元素 LPOP tasks → 返回 "task1"
    RPOP key 移除并返回 尾部最后一个元素 RPOP tasks → 返回 "task2"
    LREM key count element 删除指定值的元素(count=0 删除所有匹配) LREM tasks 0 "spam"

    示例

    bash 复制代码
    LPOP messages       # 移除 "hello",列表剩余: ["Redis", "world"]
    LREM messages 1 "Redis"  # 删除 1 个 "Redis",列表剩余: ["world"]
  3. 查询元素

    命令 作用 示例
    LRANGE key start stop 获取指定索引范围的元素(支持负数索引) LRANGE tasks 0 -1(获取全部)
    LINDEX key index 获取指定位置的元素 LINDEX tasks 0 → 返回第一个元素
    LLEN key 获取列表长度 LLEN tasks → 返回元素数量

    示例

    bash 复制代码
    LRANGE messages 0 -1  # 返回所有元素: ["world"]
    LINDEX messages 0     # 返回 "world"
    LLEN messages         # 返回 1
  4. 阻塞操作(适合消息队列)

    命令 作用 示例
    BLPOP key timeout 阻塞式弹出头部元素(列表为空时等待) BLPOP tasks 10(等待10秒)
    BRPOP key timeout 阻塞式弹出尾部元素 BRPOP tasks 5

    适用场景:实现简单的消息队列(生产者-消费者模型)。

4.4 Set类型

Set(集合)是Redis中的无序、唯一元素集合 ,底层由哈希表 实现,支持高效的添加、删除、查找操作 (时间复杂度均为O(1))。每个Set最多可存储 2³² - 1 个元素(约40亿)。

核心特性

  1. 唯一性:自动去重,重复元素无法插入。
  2. 无序性:元素无固定顺序,但支持随机获取。
  3. 集合运算 :支持并集(SUNION)、交集(SINTER)、差集(SDIFF)。
  4. 高性能:所有操作均基于哈希表,效率极高。

Set的常用命令

  1. 基本操作

    命令 作用 示例
    SADD key member1 member2 添加元素(自动去重) SADD tags "redis" "db"
    SREM key member 删除指定元素 SREM tags "db"
    SMEMBERS key 获取所有元素(无序) SMEMBERS tags["redis"]
    SISMEMBER key member 判断元素是否存在 SISMEMBER tags "redis"1

    示例

    bash 复制代码
    SADD fruits "apple" "banana" "orange"
    SMEMBERS fruits  # 可能返回 ["apple", "banana", "orange"](无序)
    SREM fruits "banana"
  2. 集合运算

    命令 作用 示例
    SINTER key1 key2 返回多个集合的交集 SINTER set1 set2
    SUNION key1 key2 返回多个集合的并集 SUNION set1 set2
    SDIFF key1 key2 返回第一个集合的差集 SDIFF set1 set2
    SINTERSTORE dest key1 key2 存储交集到新集合 SINTERSTORE result set1 set2

    示例

    bash 复制代码
    SADD group1 "user1" "user2" "user3"
    SADD group2 "user2" "user3" "user4"
    SINTER group1 group2  # 返回 ["user2", "user3"]
  3. 随机操作

    命令 作用 示例
    SPOP key [count] 随机移除并返回元素(抽奖场景) SPOP prizes 1
    SRANDMEMBER key [count] 随机返回元素(不删除) SRANDMEMBER users 2

    示例

    bash 复制代码
    SADD raffle "ticket1" "ticket2" "ticket3"
    SPOP raffle  # 随机抽出一个奖品(如 "ticket2")
  4. 统计与移动

    命令 作用 示例
    SCARD key 获取集合元素数量 SCARD tags3
    SMOVE source dest member 将元素移动到另一个集合 SMOVE set1 set2 "apple"

4.5 SortedSet类型

Sorted Set(有序集合,简称ZSET)是Redis中最灵活的数据结构之一,它结合了Set的去重特性List的排序能力,每个元素关联一个分数(score),通过分数自动排序并支持范围查询。

核心特性

  1. 唯一性:成员(member)不可重复,但分数(score)可以重复。
  2. 有序性:按分数(score)从小到大排序(默认升序)。
  3. 高性能
    • 插入/删除/查找:O(log N)(基于跳跃表实现)。
    • 范围查询:O(log N + M)(N是元素总数,M是返回数量)。
  4. 多用途:支持排名、排行榜、范围筛选等场景。

Sorted Set 常用命令

  1. 基本操作

    命令 作用 示例
    ZADD key score member 添加/更新元素(分数可重复) ZADD leaderboard 100 "Alice"
    ZREM key member 删除指定成员 ZREM leaderboard "Bob"
    ZSCORE key member 获取成员的分数 ZSCORE leaderboard "Alice""100"
    ZINCRBY key increment member 增加成员的分数 ZINCRBY leaderboard 50 "Alice"150

    示例

    bash 复制代码
    ZADD players 2000 "Carl" 1500 "Alice" 1800 "Bob"
    ZSCORE players "Alice"  # 返回 "1500"
  2. 查询操作

    命令 作用 示例
    ZRANGE key start stop [WITHSCORES] 按升序返回排名范围内的成员 ZRANGE leaderboard 0 2(返回前3名)
    ZREVRANGE key start stop [WITHSCORES] 按降序返回排名范围内的成员 ZREVRANGE leaderboard 0 2(返回Top3)
    ZRANGEBYSCORE key min max 返回分数在[min, max]间的成员 ZRANGEBYSCORE players 1500 2000
    ZCOUNT key min max 统计分数范围内的成员数量 ZCOUNT players 1500 20003

    示例

    bash 复制代码
    ZADD hits 10 "page1" 20 "page2" 30 "page3"
    ZRANGE hits 0 -1 WITHSCORES  # 返回所有成员及分数(升序)
  3. 排名与统计

    命令 作用 示例
    ZRANK key member 获取成员升序排名(从0开始) ZRANK players "Alice"1
    ZREVRANK key member 获取成员降序排名 ZREVRANK players "Alice"2
    ZCARD key 获取集合成员总数 ZCARD players3

    示例

    bash 复制代码
    ZREVRANK players "Alice"  # 返回降序排名(如第2名)
  4. 集合运算

    命令 作用 示例
    ZUNIONSTORE dest numkeys key1 key2 并集存储到新集合 ZUNIONSTORE combined 2 set1 set2
    ZINTERSTORE dest numkeys key1 key2 交集存储到新集合 ZINTERSTORE result 2 set1 set2
相关推荐
异常君2 小时前
分布式锁隐患解析:当业务执行时间超过锁过期时间的完整对策
java·redis·后端
2302_799525743 小时前
【Redis】SpringDataRedis
java·数据库·redis
黄名富7 小时前
Redis 缓存—处理高并发问题
数据库·redis·缓存
和尚用0飘柔017 小时前
【中间件】redis使用
数据库·redis·中间件
努力也学不会java19 小时前
【Redis】Redis中的常见数据类型(一)
数据结构·数据库·redis·缓存·bootstrap
XY.散人19 小时前
初识Redis · 命令、数据结构补充、协议
数据库·redis·缓存
洛神灬殇20 小时前
【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)
数据库·redis·后端
寻找沙漠的人1 天前
Redis命令——list
redis
小黑蛋学java1 天前
Redis List 的详细介绍
redis