NoSql简介

NoSQL(Not Only SQL)是一种非关系型数据库管理系统的统称。与传统的关系型数据库相比,NoSQL数据库具有更高的可扩展性、更好的性能和更灵活的数据模型。

NoSQL数据库的特点包括:

  • 灵活的数据模型:NoSQL数据库不需要预先定义表结构,可以根据需要动态地存储和查询数据。这使得NoSQL数据库适用于存储半结构化和非结构化数据。

  • 高可扩展性:NoSQL数据库可以轻松地水平扩展,通过添加更多的节点来处理更大的数据量和更高的负载。这使得NoSQL数据库在大规模数据处理和高并发访问场景下表现出色。

  • 高性能:NoSQL数据库通常采用了一些优化策略,如内存存储、索引技术和分布式计算等,以提供更快的数据访问速度和更高的吞吐量。

  • 容错性:NoSQL数据库通常具有自动数据复制和故障恢复机制,以确保数据的可靠性和持久性。

  • 低成本:NoSQL数据库通常采用开源软件模式,可以免费使用,并且在硬件和维护方面的成本相对较低。

NoSQL数据库主要分为四类:

  1. 键值存储数据库:以键值对的形式存储数据,如Redis、Memcached等。

  2. 文档数据库:以类似JSON格式的文档存储数据,如MongoDB、CouchDB等。

  3. 列族数据库:以列族的形式存储数据,如HBase、Cassandra等。

  4. 图数据库:以图的形式存储数据,如Neo4j、ArangoDB等。

Redis简介

Redis(Remote Dictionary Server)是一种开源的内存数据结构存储系统,广泛用于缓存、消息队列和实时数据处理。作为一个高性能的键值对存储系统,Redis支持多种数据结构,如字符串、哈希、列表、集合和有序集合。

Redis的特点包括:

  • 内存存储:Redis将数据存储在内存中,提供极高的读写速度,使其成为高性能应用的理想选择。

  • 持久化选项:虽然Redis主要是内存存储,但它也提供了持久化机制,如快照(RDB)和追加文件(AOF),以确保数据在重启后不会丢失。

  • 丰富的数据结构:Redis支持多种数据结构,包括字符串、哈希、列表、集合和有序集合,每种数据结构都有特定的操作方法,使得它能处理各种复杂的数据操作需求。

  • 高可用性和分布式功能:Redis通过主从复制、Redis Sentinel和Redis Cluster等机制,支持高可用性和分布式部署。这些功能帮助实现数据的高可用性和负载均衡。

  • 原子操作:Redis支持多种原子操作,能够在高并发环境下保证数据的一致性和完整性。

  • 轻量级:Redis设计简洁,使用方便,占用系统资源少,使其在资源受限的环境中也能高效运行。

Redis的应用场景:

  • 缓存:由于其高速度,Redis常用于缓存数据,减轻数据库负担,提高应用性能。

  • 会话管理:Redis可以用来存储用户会话信息,提高用户体验和系统响应速度。

  • 实时数据处理:Redis的高性能和多样的数据结构使其适用于实时分析和处理,如实时统计和排行榜。

  • 消息队列:Redis的发布/订阅机制以及列表数据结构使其能够实现消息队列功能,支持异步处理和任务调度。

  • 排行榜:使用Redis的有序集合,可以方便地实现排行榜功能,支持高效的排序和排名操作。

linux下安装redis

安装步骤

1. 下载压缩包

Releases · redis/redis (github.com)

2. 上传压缩包到服务器

3. 解压

tar -zxvf redis****

4. 配置c语言环境

apt-get install gcc

5. 安装redis

make

make install(检查安装)

6. redis默认安装路径

/usr/local/bin

7. 复制配置文件到指定目录

cp /opt/redis-8.0-m01/redis.conf redisconfig

8. 修改配置文件,默认后台运行

9. 启动连接redis

启动redis

redis-server /usr/local/bin/redisconfig/redis.conf

连接redis

redis-cli -p 6379

10. 查看redis进程

11. 关闭redis

shutdown

redis-benchmark性能测试

测试

redis-benchmark -h localhost -p 6379 -c -n 100000

100并发 10万请求

redis基础知识

redis默认有16个数据库

select 切换数据库

清除全部数据库内容 FLUSHALL

redis是单线程的!

官方表示,redis是基于内存操作的,CPU不是redis的性能瓶颈,redis的瓶颈是根据机器的内存和网络外宽,既然可以使用单线程就使用单线程

Redis单线程架构的高效原因:

  • 基于内存操作:Redis主要是基于内存操作,内存读写速度远快于磁盘读写,单线程可以更好地利用内存操作的高速度,提高数据读写效率。

  • 避免了多线程切换开销:多线程会涉及线程切换的开销,而Redis的单线程模型避免了多线程之间的切换,减少了上下文切换的开销,提高了整体性能。

  • 避免了锁竞争:多线程操作共享数据时需要考虑锁的竞争和同步,而Redis的单线程模型避免了多线程之间的锁竞争,简化了数据访问的复杂性。

  • 利用事件驱动模型:Redis采用事件驱动模型,通过非阻塞IO和事件轮询机制来处理并发请求,单线程可以高效地处理大量的并发请求。

  • 优化网络通信:Redis通过复用连接、批量操作等方式优化网络通信,单线程可以更好地管理网络IO,提高数据传输效率。

  • 充分利用CPU缓存:单线程模型可以更好地利用CPU缓存,减少缓存失效的情况,提高数据访问速度。

  • 简化设计和维护:单线程模型相对于多线程模型更简单,减少了设计和维护的复杂性,提高了系统的稳定性和可靠性。

因此,尽管Redis是单线程的,但通过合理的设计和优化,它仍然能够实现高性能和高并发的数据处理能力。

redis-key的操作

Redis命令详解

KEYS

命令格式:KEYS pattern

该命令用于查找符合指定模式的键。模式可以使用通配符 * 和 ?,其中 * 表示任意多个字符,? 表示一个字符。

示例:

redis> SET key1 value1
OK
redis> SET key2 value2
OK
redis> SET key3 value3
OK
redis> KEYS key*
1) "key1"
2) "key2"
3) "key3"

EXISTS

命令格式:EXISTS key

该命令用于检查指定的键是否存在于数据库中。

示例:

redis> SET key1 value1
OK
redis> EXISTS key1
(integer) 1
redis> EXISTS key2
(integer) 0

MOVE

命令格式:MOVE key db

该命令用于将指定的键移动到指定的数据库中。数据库编号从0开始,最大值由配置文件中的 databases 参数决定。

示例:

redis> SET key1 value1
OK
redis> MOVE key1 1
(integer) 1
redis> EXISTS key1
(integer) 0
redis> SELECT 1
OK
redis[1]> EXISTS key1
(integer) 1

EXPIRE

命令格式:EXPIRE key seconds

该命令用于为指定的键设置过期时间,单位为秒。过期时间到达后,键将自动被删除。

示例:

redis> SET key1 value1
OK
redis> EXPIRE key1 10
(integer) 1
redis> TTL key1
(integer) 10

TTL

命令格式:TTL key

该命令用于获取指定键的剩余生存时间,单位为秒。如果键不存在或没有设置过期时间,返回 -1;如果键已过期,返回 -2。

示例:

redis> SET key1 value1
OK
redis> EXPIRE key1 10
(integer) 1
redis> TTL key1
(integer) 10
redis> TTL key2
(integer) -2

redis官网命令查询地址

redis命令手册

redis数据存储格式

  • redis自身是一个Map,其中所有的数据都是采用key:value的形式存储

  • 数据类型指的是存储的数据的类型,也就是value部分的类型,key部分永远都是字符串

Redis支持五种主要的数据类型:

  1. 字符串(String):字符串是最基本的数据类型,可以存储任何类型的数据,如文本、数字、二进制数据等。Redis的字符串类型支持一些特殊的操作,如追加、截取、计数等。

  2. 哈希(Hash):哈希是一种键值对的集合,类似于关联数组或字典。在Redis中,哈希可以用于存储对象或结构化数据,每个哈希可以包含多个字段和对应的值,可以对单个字段进行读写操作,也可以对整个哈希进行操作。

  3. 列表(List):列表是一个有序的字符串集合,可以在列表的两端进行插入和删除操作。Redis的列表类型可以用于实现队列、栈和有序集合等数据结构。

  4. 集合(Set):集合是一个无序的字符串集合,不允许重复的元素。Redis的集合类型支持集合间的交集、并集和差集等操作,还可以对集合进行添加、删除和判断元素是否存在等操作。

  5. 有序集合(Sorted Set):有序集合是一个有序的字符串集合,每个元素都关联着一个分数,根据分数的大小进行排序。Redis的有序集合类型可以用于实现排行榜、计数器和范围查询等功能。

Redis命令大全

redis 命令手册

Redis字符串命令详解

1. SET key value

  • 功能:设置指定键的值。

  • 示例SET mykey "Hello"

  • 说明:如果键已经存在,则覆盖其值;如果键不存在,则创建新键。

2. GET key

  • 功能:获取指定键的值。

  • 示例GET mykey

  • 说明:如果键不存在,返回nil;如果键存储的不是字符串,返回错误。

3. APPEND key value

  • 功能:在指定键的值后追加字符串。

  • 示例APPEND mykey " World"

  • 说明:返回追加后的字符串长度。

4. STRLEN key

  • 功能:获取指定键值的长度。

  • 示例STRLEN mykey

  • 说明:返回键值的字节数。

5. SETEX key seconds value

  • 功能:设置指定键的值,并指定过期时间(秒)。

  • 示例SETEX mykey 10 "Hello"

  • 说明:键在指定时间后会自动删除。

6. SETNX key value

  • 功能:设置指定键的值,仅当键不存在时。

  • 示例SETNX mykey "Hello"

  • 说明:如果键已存在,不进行任何操作。

7. MSET key value [key value ...]

  • 功能:同时设置多个键值对。

  • 示例MSET key1 "Hello" key2 "World"

  • 说明:一次性设置多个键值对。

8. MGET key [key ...]

  • 功能:同时获取多个键的值。

  • 示例MGET key1 key2

  • 说明:返回多个键对应的值。

9. INCR key

  • 功能:将指定键的值加1。

  • 示例INCR mykey

  • 说明:如果键不存在,会将其值初始化为0。

10. DECR key

  • 功能:将指定键的值减1。

  • 示例DECR mykey

  • 说明:如果键不存在,会将其值初始化为0。

11. INCRBY key increment

  • 功能:将指定键的值增加指定的整数。

  • 示例INCRBY mykey 5

  • 说明:increment为负数时表示减少。

12. DECRBY key decrement

  • 功能:将指定键的值减少指定的整数。

  • 示例DECRBY mykey 3

  • 说明:decrement为负数时表示增加。

13. GETSET key value

  • 功能:设置指定键的值,并返回旧值。

  • 示例GETSET mykey "NewValue"

  • 说明:先获取旧值,再设置新值。

14. SETRANGE key offset value

  • 功能:从指定偏移量开始,替换键值的子字符串。

  • 示例SETRANGE mykey 6 "Redis"

  • 说明:偏移量从0开始,超出原字符串长度会自动扩展。

15. GETRANGE key start end

  • 功能:获取键值的子字符串。

  • 示例GETRANGE mykey 0 4

  • 说明:返回指定范围内的子字符串。

16. SETBIT key offset value

  • 功能:设置指定偏移量的位值。

  • 示例SETBIT mykey 7 1

  • 说明:offset表示位的偏移量,value为0或1。

17. GETBIT key offset

  • 功能:获取指定偏移量的位值。

  • 示例GETBIT mykey 7

  • 说明:返回偏移量处的位值。

18. BITCOUNT key [start end]

  • 功能:统计指定范围内的位值为1的个数。

  • 示例BITCOUNT mykey 0 7

  • 说明:不指定范围时统计整个字符串。

19. BITOP operation destkey key [key ...]

  • 功能:对多个键进行位运算,并将结果保存到目标键。

  • 示例BITOP AND destkey key1 key2

  • 说明:operation可选AND、OR、XOR、NOT。

20. BITFIELD key [GET type offset] [SET type offset value] [INCRBY type offset increment] [...]

  • 功能:对位域进行操作。

  • 示例BITFIELD mykey GET u4 0

  • 说明:支持多种位域操作。

21. PSETEX key milliseconds value

  • 功能:设置指定键的值,并指定过期时间(毫秒)。

  • 示例PSETEX mykey 10000 "Hello"

  • 说明:键在指定时间后会自动删除。

22. SETEXAT key timestamp value

  • 功能:设置指定键的值,并指定过期时间(UNIX时间戳)。

  • 示例SETEXAT mykey 1630000000 "Hello"

  • 说明:键在指定时间后会自动删除。

Redis String 数据类型的使用场景

1. 缓存数据

Redis的String类型常用于缓存数据,可以将经常访问的数据存储在Redis中,以提高访问速度和降低数据库负载。例如,缓存用户信息、配置信息、热门文章等数据。

2. 计数器

String类型支持自增和自减操作,因此可以用于实现计数器功能。可以记录用户的访问次数、文章的点赞数、商品的销量等,方便快速更新和查询。

3. 分布式锁

在分布式系统中,可以利用String类型的setnx命令实现分布式锁。通过在Redis中设置一个唯一的键作为锁,可以确保同一时间只有一个客户端能够获取锁,避免并发问题。

4. 会话管理

String类型可以存储用户的会话信息,如登录凭证、用户状态等。通过设置合适的过期时间,可以实现会话的自动失效和管理。

5. 消息队列

String类型可以作为简单的消息队列使用,通过lpush和rpop等命令实现消息的生产和消费。可以用于异步任务处理、事件通知等场景。

6. 分布式限流

通过String类型的自增操作,可以实现简单的分布式限流功能。可以限制用户的访问频率、接口的调用次数等,保护系统免受恶意请求的影响。

7. 短链接生成器

String类型可以存储长链接和短链接的映射关系,实现短链接的生成和解析。可以用于生成短链接、统计点击次数等功能。

8. 实时统计

String类型可以存储实时统计数据,如在线用户数、PV/UV、订单量等。通过自增操作和过期时间设置,可以实现实时数据的统计和展示。

9. 缓存穿透处理

在缓存中存储空值或错误标记,防止缓存穿透攻击。当查询结果为空时,可以在缓存中设置一个特定的值,避免频繁查询数据库。

10. 数据同步

String类型可以用于数据同步和消息传递。可以将需要同步的数据存储在Redis中,不同服务之间通过订阅发布机制实现数据的同步和通信。

通过合理利用Redis的String数据类型,可以实现各种实用的功能和解决复杂的问题,提升系统的性能和可靠性。

Redis List 数据类型的特点

  • 有序性:List类型是有序的,可以按照插入顺序存储数据,并支持根据索引获取元素。

  • 可重复元素:List类型允许存储重复的元素,同一个元素可以出现多次。

  • 灵活的操作:List类型支持在列表的两端进行插入和删除操作,可以实现队列、栈等数据结构。

  • 支持范围操作:List类型支持根据索引范围获取元素,可以实现分页查询和范围操作。

  • 适用于实时数据处理:List类型适用于实时数据处理场景,如消息队列、任务队列等。

Redis List 数据类型的使用场景

  1. 消息队列:List类型常用于实现消息队列,生产者通过rpush命令向列表尾部插入消息,消费者通过lpop命令从列表头部获取消息,实现异步消息处理。

  2. 任务队列:List类型可以用作任务队列,生产者向列表尾部插入任务,消费者通过brpop命令阻塞式地从列表尾部获取任务,实现任务的分发和处理。

  3. 最新消息列表:List类型可以用于存储最新的消息列表,通过ltrim命令控制列表的长度,保持最新消息的存储和展示。

  4. 用户行为记录:List类型可以记录用户的行为轨迹,如浏览记录、操作记录等,通过lpush或rpush命令记录用户行为,实现用户行为的记录和分析。

  5. 实时数据处理:List类型适用于实时数据处理场景,如实时日志处理、实时事件处理等,通过列表的插入和删除操作实现实时数据的处理和分析。

  6. 排行榜:List类型可以用于实现排行榜功能,通过zadd命令将用户得分存储在有序集合中,将用户ID存储在列表中,实现排行榜的展示和更新。

  7. 分页查询:List类型支持根据索引范围获取元素,可以用于实现分页查询功能,如新闻列表、商品列表等。

  8. 历史记录:List类型可以用于存储历史记录,如搜索历史、浏览历史等,通过列表的插入和删除操作记录用户的历史行为。

Redis List 数据类型的命令详解

  1. LPUSH key value [value ...]

    • 描述:将一个或多个值插入到列表头部

    • 示例:LPUSH mylist "world" "hello"

  2. RPUSH key value [value ...]

    • 描述:将一个或多个值插入到列表尾部

    • 示例:RPUSH mylist "hello" "world"

  3. LPOP key

    • 描述:移除并返回列表头部的元素

    • 示例:LPOP mylist

  4. RPOP key

    • 描述:移除并返回列表尾部的元素

    • 示例:RPOP mylist

  5. LINDEX key index

    • 描述:通过索引获取列表中的元素

    • 示例:LINDEX mylist 0

  6. LINSERT key BEFORE|AFTER pivot value

    • 描述:在列表中某个元素前或后插入新元素

    • 示例:LINSERT mylist BEFORE "world" "hello"

  7. LLEN key

    • 描述:获取列表长度

    • 示例:LLEN mylist

  8. LRANGE key start stop

    • 描述:获取列表指定范围内的元素

    • 示例:LRANGE mylist 0 2

  9. LREM key count value

    • 描述:移除列表中与给定值相等的元素

    • 示例:LREM mylist 2 "hello"

  10. LSET key index value

    • 描述:通过索引设置列表元素的值

    • 示例:LSET mylist 0 "new_value"

  11. LTRIM key start stop

    • 描述:保留指定范围内的元素,其他元素删除

    • 示例:LTRIM mylist 0 2

  12. BLPOP key [key ...] timeout

    • 描述:移除并返回列表头部的元素,如果列表为空则阻塞等待

    • 示例:BLPOP mylist 10

  13. BRPOP key [key ...] timeout

    • 描述:移除并返回列表尾部的元素,如果列表为空则阻塞等待

    • 示例:BRPOP mylist 10

  14. BRPOPLPUSH source destination timeout

    • 描述:移除列表 source 的尾部元素,并将其添加到列表 destination 的头部

    • 示例:BRPOPLPUSH list1 list2 10

  15. LINDEX key index

    • 描述:通过索引获取列表中的元素

    • 示例:LINDEX mylist 0

  16. LINSERT key BEFORE|AFTER pivot value

    • 描述:在列表中某个元素前或后插入新元素

    • 示例:LINSERT mylist BEFORE "world" "hello"

  17. LLEN key

    • 描述:获取列表长度

    • 示例:LLEN mylist

  18. LRANGE key start stop

    • 描述:获取列表指定范围内的元素

    • 示例:LRANGE mylist 0 2

  19. LREM key count value

    • 描述:移除列表中与给定值相等的元素

    • 示例:LREM mylist 2 "hello"

  20. LSET key index value

    • 描述:通过索引设置列表元素的值

    • 示例:LSET mylist 0 "new_value"

  21. LTRIM key start stop

    • 描述:保留指定范围内的元素,其他元素删除

    • 示例:LTRIM mylist 0 2

  22. BLPOP key [key ...] timeout

    • 描述:移除并返回列表头部的元素,如果列表为空则阻塞等待

    • 示例:BLPOP mylist 10

SET 命令详解

  1. SET key value

    • 功能:设置指定键的值。

    • 示例SET mykey "Hello"

    • 说明:如果键已经存在,则覆盖其值;如果键不存在,则创建新键。

  2. GET key

    • 功能:获取指定键的值。

    • 示例GET mykey

    • 说明:如果键不存在,返回nil;如果键存储的不是字符串,返回错误。

  3. APPEND key value

    • 功能:在指定键的值后追加字符串。

    • 示例APPEND mykey " World"

    • 说明:返回追加后的字符串长度。

  4. STRLEN key

    • 功能:获取指定键值的长度。

    • 示例STRLEN mykey

    • 说明:返回键值的字节数。

  5. SETEX key seconds value

    • 功能:设置指定键的值,并指定过期时间(秒)。

    • 示例SETEX mykey 10 "Hello"

    • 说明:键在指定时间后会自动删除。

  6. SETNX key value

    • 功能:设置指定键的值,仅当键不存在时。

    • 示例SETNX mykey "Hello"

    • 说明:如果键已存在,不进行任何操作。

  7. MSET key value [key value ...]

    • 功能:同时设置多个键值对。

    • 示例MSET key1 "Hello" key2 "World"

    • 说明:一次性设置多个键值对。

  8. MGET key [key ...]

    • 功能:同时获取多个键的值。

    • 示例MGET key1 key2

    • 说明:返回多个键对应的值。

  9. INCR key

    • 功能:将指定键的值加1。

    • 示例INCR mykey

    • 说明:如果键不存在,会将其值初始化为0。

  10. DECR key

    • 功能:将指定键的值减1。

    • 示例DECR mykey

    • 说明:如果键不存在,会将其值初始化为0。

  11. INCRBY key increment

    • 功能:将指定键的值增加指定的整数。

    • 示例INCRBY mykey 5

    • 说明:increment为负数时表示减少。

  12. DECRBY key decrement

    • 功能:将指定键的值减少指定的整数。

    • 示例DECRBY mykey 3

    • 说明:decrement为负数时表示增加。

  13. GETSET key value

    • 功能:设置指定键的值,并返回旧值。

    • 示例GETSET mykey "NewValue"

    • 说明:设置新值后返回旧值,如果键不存在则返回nil。

Redis Set 数据类型的特点

  • 无序性:Set类型是无序的,集合中的元素没有特定的顺序,不会按照插入顺序或者元素的大小进行存储。

  • 唯一性:Set类型中不允许重复的元素,每个元素都是唯一的,即使尝试添加重复的元素,也不会成功。

  • 集合操作:Set类型支持集合间的交集、并集和差集等操作,可以对多个集合进行合并、比较和筛选。

  • 快速查找:Set类型内部采用哈希表实现,因此可以快速进行元素的查找和判断元素是否存在。

  • 适合存储标签、关注列表等:由于Set类型的唯一性和快速查找特点,适合存储标签、关注列表、点赞用户等需要唯一性和快速查找的数据。

Redis Set 数据类型的使用场景

1. 存储标签

Set类型适合存储标签信息,例如文章的标签、商品的标签等。通过Set类型的唯一性,可以确保同一标签不会重复存储,同时可以快速判断某个标签是否存在。

2. 用户关注列表

Set类型可以用于存储用户的关注列表或粉丝列表。每个用户的关注列表和粉丝列表都是唯一的,可以方便地进行关注、取消关注和查找共同关注的用户等操作。

3. 点赞用户

在点赞功能中,可以使用Set类型存储某个内容的点赞用户列表。由于Set类型的唯一性,可以确保同一个用户只能点赞一次,同时可以快速查找点赞用户。

4. 在线用户列表

Set类型可以用于存储在线用户列表,通过将用户的唯一标识存储在Set中,可以快速判断某个用户是否在线,以及统计在线用户数量。

5. 好友关系

Set类型可以存储用户的好友列表,通过Set类型的交集操作,可以方便地查找共同的好友,推荐好友等功能。

6. 集合运算

Set类型支持集合间的交集、并集和差集等操作,可以用于实现各种集合运算,如共同兴趣爱好、共同关注的话题等。

7. 去重

Set类型可以用于对数据进行去重操作,通过将数据存储在Set中,可以去除重复的数据,保留唯一的元素。

8. 标签云

Set类型可以用于存储标签云数据,通过统计标签的出现次数和热度,可以实现标签云展示和热门标签推荐等功能。

Redis Hash 数据结构命令详解

1. HSET key field value

  • 功能:为哈希表中指定字段设置值。

  • 示例HSET myhash field1 "Hello"

  • 说明:如果字段不存在,则创建字段并设置值;如果字段已存在,则覆盖其值。

2. HGET key field

  • 功能:获取哈希表中指定字段的值。

  • 示例HGET myhash field1

  • 说明:如果字段不存在,返回nil;如果字段存储的不是字符串,返回错误。

3. HMSET key field1 value1 [field2 value2 ...]

  • 功能:同时设置哈希表中多个字段的值。

  • 示例HMSET myhash field1 "Hello" field2 "World"

  • 说明:一次性设置多个字段的值。

4. HMGET key field1 [field2 ...]

  • 功能:同时获取哈希表中多个字段的值。

  • 示例HMGET myhash field1 field2

  • 说明:返回多个字段对应的值。

5. HGETALL key

  • 功能:获取哈希表中所有字段和值。

  • 示例HGETALL myhash

  • 说明:返回一个包含所有字段和值的列表。

6. HDEL key field1 [field2 ...]

  • 功能:删除哈希表中一个或多个字段。

  • 示例HDEL myhash field1

  • 说明:返回成功删除的字段数量。

7. HEXISTS key field

  • 功能:检查哈希表中是否存在指定字段。

  • 示例HEXISTS myhash field1

  • 说明:存在返回1,不存在返回0。

8. HINCRBY key field increment

  • 功能:将哈希表中指定字段的值增加指定的整数。

  • 示例HINCRBY myhash field1 5

  • 说明:increment为负数时表示减少。

9. HKEYS key

  • 功能:获取哈希表中所有字段的键。

  • 示例HKEYS myhash

  • 说明:返回一个包含所有字段键的列表。

10. HVALS key

  • 功能:获取哈希表中所有字段的值。

  • 示例HVALS myhash

  • 说明:返回一个包含所有字段值的列表。

11. HLEN key

  • 功能:获取哈希表中字段的数量。

  • 示例HLEN myhash

  • 说明:返回哈希表中字段的数量。

12. HSETNX key field value

  • 功能:为哈希表中指定字段设置值,仅当字段不存在时。

  • 示例HSETNX myhash field1 "Hello"

  • 说明:如果字段已存在,不进行任何操作。

13. HSTRLEN key field

  • 功能:获取哈希表中指定字段值的长度。

  • 示例HSTRLEN myhash field1

  • 说明:返回指定字段值的字节数。

14. HSCAN key cursor [MATCH pattern] [COUNT count]

  • 功能:迭代哈希表中的字段。

  • 示例HSCAN myhash 0

  • 说明:用于迭代哈希表中的字段,可指定匹配模式和返回数量。

15. HSETBIT key field offset value

  • 功能:设置哈希表字段值的指定偏移位。

  • 示例HSETBIT myhash field1 5 1

  • 说明:设置指定字段值的指定偏移位为1或0。

16. HGETBIT key field offset

  • 功能:获取哈希表字段值的指定偏移位。

  • 示例HGETBIT myhash field1 5

  • 说明:返回指定字段值的指定偏移位的值。

17. HINCRBYFLOAT key field increment

  • 功能:将哈希表中指定字段的值增加指定的浮点数。

  • 示例HINCRBYFLOAT myhash field1 3.14

  • 说明:increment为负数时表示减少。

18. HSTRLEN key field

  • 功能:获取哈希表中指定字段值的长度。

  • 示例HSTRLEN myhash field1

  • 说明:返回指定字段值的字节数。

19. HSCAN key cursor [MATCH pattern] [COUNT count]

  • 功能:迭代哈希表中的字段。

  • 示例HSCAN myhash 0

  • 说明:用于迭代哈希表中的字段,可指定匹配模式和返回数量。

20. HSETBIT key field offset value

  • 功能:设置哈希表字段值的指定偏移位。

  • 示例HSETBIT myhash field1 5 1

  • 说明:设置指定字段值的指定偏移位为1或0。

21. HGETBIT key field offset

  • 功能:获取哈希表字段值的指定偏移位。

  • 示例HGETBIT myhash field1 5

  • 说明:返回指定字段值的指定偏移位的值。

22. HINCRBYFLOAT key field increment

  • 功能:将哈希表中指定字段的值增加指定的浮点数。

  • 示例HINCRBYFLOAT myhash field1 3.14

  • 说明:increment为负数时表示减少。

23. HSTRLEN key field

  • 功能:获取哈希表中指定字段值的长度。

  • 示例HSTRLEN myhash field1

  • 说明:返回指定字段值的字节数。

24. HSCAN key cursor [MATCH pattern] [COUNT count]

  • 功能:迭代哈希表中的字段。

  • 示例HSCAN myhash 0

  • 说明:用于迭代哈希表中的字段,可指定匹配模式和返回数量。

25. HSETBIT key field offset value

  • 功能:设置哈希表字段值的指定偏移位。

  • 示例HSETBIT myhash field1 5 1

  • 说明:设置指定字段值的指定偏移位为1或0。

Redis Hash 数据类型的特点

  • 键值对集合:Hash 是一种键值对的集合,类似于关联数组或字典,每个 Hash 可以包含多个字段和对应的值。

  • 结构化存储:Hash 可以用于存储对象或结构化数据,每个字段都有一个唯一的键,方便对数据进行细粒度的操作。

  • 快速访问:Hash 内部采用哈希表实现,可以快速定位和访问特定字段的值,适合存储和查询大量的键值对数据。

Redis Hash 数据类型的使用场景

1. 存储对象

Hash 可以用于存储对象的属性和值,将对象拆分为多个字段,每个字段对应对象的一个属性,方便读取和更新对象的特定属性。

2. 用户信息

在用户管理系统中,可以使用 Hash 存储用户的详细信息,如用户名、密码、邮箱、手机号等,每个用户对应一个 Hash,方便管理和查询用户信息。

3. 商品信息

电商平台可以使用 Hash 存储商品的属性,如名称、价格、库存、描述等,每个商品对应一个 Hash,方便展示商品信息和更新库存。

4. 缓存数据

Hash 可以用于缓存复杂数据结构,如 JSON 对象、序列化对象等,将数据存储为 Hash 可以提高读取和写入的效率。

5. 订单信息

在订单管理系统中,可以使用 Hash 存储订单的详细信息,如订单号、商品列表、金额、状态等,每个订单对应一个 Hash,方便查询和更新订单状态。

6. 聊天消息

实时通讯系统可以使用 Hash 存储聊天消息的内容和发送者信息,每条消息对应一个 Hash,方便按照时间顺序查看消息记录。

7. 配置信息

Hash 可以用于存储系统的配置信息,如参数名和参数值,每个配置项对应一个 Hash 字段,方便动态修改和读取系统配置。

8. 地理位置信息

在地理信息系统中,可以使用 Hash 存储地点的经纬度和名称等信息,每个地点对应一个 Hash,方便查询和展示地理位置信息。

9. 账单明细

财务系统可以使用 Hash 存储账单的明细信息,如交易时间、金额、类型等,每笔交易对应一个 Hash,方便统计和查询账单数据。

10. 评价信息

在评价系统中,可以使用 Hash 存储用户对商品或服务的评价信息,如评分、评论内容、时间等,每条评价对应一个 Hash,方便展示和分析评价数据。

Redis有序集合(Sorted Set)命令详解

1. ZADD key score member [score member ...]

  • 功能:向有序集合中添加一个或多个成员,或更新已存在成员的分数。

  • 示例ZADD myzset 1 "one" 2 "two"

  • 说明:如果成员已存在,则更新其分数;如果成员不存在,则添加新成员。

2. ZCARD key

  • 功能:获取有序集合的成员数量。

  • 示例ZCARD myzset

  • 说明:返回有序集合的成员数量。

3. ZCOUNT key min max

  • 功能:获取分数在指定范围内的成员数量。

  • 示例ZCOUNT myzset 0 3

  • 说明:返回分数在 0 到 3 之间的成员数量。

4. ZINCRBY key increment member

  • 功能:将指定成员的分数增加指定的增量。

  • 示例ZINCRBY myzset 2 "two"

  • 说明:成员不存在时会创建新成员并设置分数。

5. ZRANGE key start stop [WITHSCORES]

  • 功能:按分数从小到大获取指定范围内的成员。

  • 示例ZRANGE myzset 0 1 WITHSCORES

  • 说明:返回指定范围内的成员及其分数。

6. ZREVRANGE key start stop [WITHSCORES]

  • 功能:按分数从大到小获取指定范围内的成员。

  • 示例ZREVRANGE myzset 0 1 WITHSCORES

  • 说明:返回指定范围内的成员及其分数,按分数从大到小排序。

7. ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]

  • 功能:按分数范围获取成员。

  • 示例ZRANGEBYSCORE myzset 0 3 WITHSCORES LIMIT 0 2

  • 说明:返回分数在 0 到 3 之间的成员及其分数,可指定返回结果的偏移和数量。

8. ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT offset count]

  • 功能:按分数范围从大到小获取成员。

  • 示例ZREVRANGEBYSCORE myzset 3 0 WITHSCORES LIMIT 0 2

  • 说明:返回分数在 3 到 0 之间的成员及其分数,按分数从大到小排序,可指定返回结果的偏移和数量。

9. ZRANK key member

  • 功能:获取成员在有序集合中的排名(从小到大)。

  • 示例ZRANK myzset "two"

  • 说明:返回成员 "two" 在有序集合中的排名。

10. ZREVRANK key member

  • 功能:获取成员在有序集合中的排名(从大到小)。

  • 示例ZREVRANK myzset "two"

  • 说明:返回成员 "two" 在有序集合中的排名,按分数从大到小排序。

11. ZREM key member [member ...]

  • 功能:移除有序集合中的一个或多个成员。

  • 示例ZREM myzset "one"

  • 说明:移除成员 "one"。

12. ZREMRANGEBYRANK key start stop

  • 功能:移除有序集合中指定排名范围内的成员。

  • 示例ZREMRANGEBYRANK myzset 0 1

  • 说明:移除排名在 0 到 1 之间的成员。

13. ZREMRANGEBYSCORE key min max

  • 功能:移除有序集合中分数在指定范围内的成员。

  • 示例ZREMRANGEBYSCORE myzset 0 3

  • 说明:移除分数在 0 到 3 之间的成员。

14. ZSCORE key member

  • 功能:获取成员的分数。

  • 示例ZSCORE myzset "two"

  • 说明:返回成员 "two" 的分数。

15. ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]

  • 功能:计算多个有序集合的并集,并将结果存储在新的有序集合中。

  • 示例ZUNIONSTORE out 2 zset1 zset2 WEIGHTS 2 3 AGGREGATE SUM

  • 说明:计算 zset1 和 zset2 的并集,并将结果存储在 out 中,可指定权重和聚合方式。

16. ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]

  • 功能:计算多个有序集合的交集,并将结果存储在新的有序集合中。

  • 示例ZINTERSTORE out 2 zset1 zset2 WEIGHTS 2 3 AGGREGATE SUM

  • 说明:计算 zset1 和 zset2 的交集,并将结果存储在 out 中,可指定权重和聚合方式。

17. ZSCAN key cursor [MATCH pattern] [COUNT count]

  • 功能:迭代有序集合中的元素。

  • 示例ZSCAN myzset 0 MATCH "mem*" COUNT 2

  • 说明:迭代有序集合 myzset 中的元素,匹配模式为 "mem*",每次返回 2 个元素。

18. ZPOPMIN key [count]

  • 功能:移除并返回有序集合中分数最低的成员。

  • 示例ZPOPMIN myzset 2

  • 说明:移除并返回有序集合中分数最低的 2 个成员。

19. ZPOPMAX key [count]

  • 功能:移除并返回有序集合中分数最高的成员。

  • 示例ZPOPMAX myzset 2

  • 说明:移除并返回有序集合中分数最高的 2 个成员。

20. BZPOPMIN key [key ...] timeout

  • 功能:阻塞式移除并返回多个有序集合中分数最低的成员。

  • 示例BZPOPMIN myzset1 myzset2 30

  • 说明:阻塞式移除并返回 myzset1 和 myzset2 中分数最低的成员,超时时间为 30 秒。

21. BZPOPMAX key [key ...] timeout

  • 功能:阻塞式移除并返回多个有序集合中分数最高的成员。

  • 示例BZPOPMAX myzset1 myzset2 30

  • 说明:阻塞式移除并返回 myzset1 和 myzset2 中分数最高的成员,超时时间为 30 秒。

22. ZDIFFSTORE destination key [key ...]

  • 功能:计算多个有序集合的差集,并将结果存储在新的有序集合中。

  • 示例ZDIFFSTORE out zset1 zset2

  • 说明:计算 zset1 和 zset2 的差集,并将结果存储在 out 中。

23. ZRANDMEMBER key [count]

  • 功能:随机获取有序集合中的一个或多个成员。

  • 示例ZRANDMEMBER myzset 2

  • 说明:随机获取有序集合中的 2 个成员。

24. ZRANDMEMBER key [count] WITHSCORES

  • 功能:随机获取有序集合中的一个或多个成员及其分数。

  • 示例ZRANDMEMBER myzset 2 WITHSCORES

  • 说明:随机获取有序集合中的 2 个成员及其分数。

25. ZPOPMIN key [count] WITHSCORES

  • 功能:移除并返回有序集合中分数最低的成员及其分数。

  • 示例ZPOPMIN myzset 2 WITHSCORES

  • 说明:移除并返回有序集合中分数最低的 2 个成员及其分数。

26. ZPOPMAX key [count] WITHSCORES

  • 功能:移除并返回有序集合中分数最高的成员及其分数。

  • 示例ZPOPMAX myzset 2 WITHSCORES

  • 说明:移除并返回有序集合中分数最高的 2 个成员及其分数。

27. ZDIFF key [key ...]

  • 功能:计算多个有序集合的差集。

  • 示例ZDIFF zset1 zset2

  • 说明:返回 zset1 和 zset2 的差集。

28. ZINTER key [key ...]

  • 功能:计算多个有序集合的交集。

  • 示例ZINTER zset1 zset2

  • 说明:返回 zset1 和 zset2 的交集。

29. ZUNION key [key ...]

  • 功能:计算多个有序集合的并集。

  • 示例ZUNION zset1 zset2

  • 说明:返回 zset1 和 zset2 的并集。

30. ZPOPMIN key [count] [WITHSCORES] [MIN min]

  • 功能:移除并返回有序集合中分数最低的成员,并指定最小分数。

  • 示例ZPOPMIN myzset 2 WITHSCORES MIN 0

  • 说明:移除并返回有序集合中分数最低的 2 个成员,并且分数不小于 0。

31. ZPOPMAX key [count] [WITHSCORES] [MAX max]

  • 功能:移除并返回有序集合中分数最高的成员,并指定最大分数。

  • 示例ZPOPMAX myzset 2 WITHSCORES MAX 10

  • 说明:移除并返回有序集合中分数最高的 2 个成员,并且分数不大于 10。

32. ZDIFFSTORE destination key [key ...]

  • 功能:计算多个有序集合的差集,并将结果存储在新的有序集合中。

  • 示例ZDIFFSTORE out zset1 zset2

  • 说明:计算 zset1 和 zset2 的差集,并将结果存储在 out 中。

33. ZINTERSTORE destination key [key ...]

  • 功能:计算多个有序集合的交集,并将结果存储在新的有序集合中。

  • 示例ZINTERSTORE out zset1 zset2

  • 说明:计算 zset1 和 zset2 的交集,并将结果存储在 out 中。

34. ZUNIONSTORE destination key [key ...]

  • 功能:计算多个有序集合的并集,并将结果存储在新的有序集合中。

  • 示例ZUNIONSTORE out zset1 zset2

  • 说明:计算 zset1 和 zset2 的并集,并将结果存储在 out 中。

35. ZDIFF destination key [key ...]

  • 功能:计算多个有序集合的差集。

  • 示例ZDIFF out zset1 zset2

  • 说明:返回 zset1 和 zset2 的差集,并将结果存储在 out 中。

Redis Sorted Set 的特点包括:

  • 有序性:有序集合中的元素按照分数进行排序,可以根据分数范围或排名获取元素,支持有序集合的范围查询和排名操作。

  • 唯一性:有序集合中的元素是唯一的,不允许重复的元素存在。

  • 分数关联:每个元素都关联着一个分数,分数可以是整数或浮点数,用于表示元素的权重或优先级。

  • 灵活性:有序集合既具备集合的特性,又具备列表和映射的特性,可以用于实现排行榜、计数器、范围查询等功能。

Redis Sorted Set 的使用场景:

1. 排行榜

有序集合非常适合用于实现排行榜功能,可以将用户的得分作为分数存储在有序集合中,根据分数的大小进行排名和查询,方便实现实时排行榜和热门榜单。

2. 计数器

有序集合可以用于实现计数器功能,将计数值作为分数存储在有序集合中,通过自增和自减操作更新计数值,方便实现实时统计和计数。

3. 范围查询

有序集合支持根据分数范围进行查询,可以获取指定范围内的元素,如获取分数在某个区间内的元素列表,方便实现范围查询和统计。

4. 社交关系

有序集合可以用于存储用户之间的社交关系,将用户之间的亲密度或交互次数作为分数存储在有序集合中,方便实现社交关系的管理和查询。

5. 时间轴

有序集合可以用于实现时间轴功能,将事件的发生时间作为分数存储在有序集合中,可以按照时间顺序获取事件列表,方便实现时间轴的展示和查询。

6. 范围删除

有序集合支持根据分数范围进行删除操作,可以删除指定范围内的元素,如删除分数在某个区间内的元素,方便实现范围删除和清理操作。

7. 优先级队列

有序集合可以用于实现优先级队列,将任务的优先级作为分数存储在有序集合中,可以按照优先级获取任务列表,方便实现任务调度和处理。

8. 范围统计

有序集合支持根据分数范围进行统计操作,可以统计指定范围内的元素数量,如统计分数在某个区间内的元素个数,方便实现范围统计和分析。