Redis(Remote Dictionary Server)是一个开源的、高性能的键值对(Key-Value)存储数据库,广泛应用于缓存、消息队列、实时分析等场景。它以其极高的读写速度、丰富的数据结构和灵活的应用方式而受到开发者的青睐。
Redis 的主要特点
-
高性能:
- 内存存储:Redis 将所有数据存储在内存中,读写速度极快,适合对性能要求高的应用。
- 持久化:支持将内存中的数据持久化到磁盘,防止数据丢失。
-
丰富的数据结构:
- 字符串(String):最基本的数据类型,可以存储文本或二进制数据。
- 哈希(Hash):键值对的集合,适合存储对象。
- 列表(List):有序的字符串集合,支持在两端进行快速的插入和删除操作。
- 集合(Set):无序且不重复的字符串集合,支持高效的集合运算(如并集、交集、差集)。
- 有序集合(Sorted Set):类似于集合,但每个元素关联一个分数,用于排序。
- 位图(Bitmap) 、HyperLogLog 、地理空间索引(Geospatial Index)等高级数据结构。
-
持久化机制:
- RDB(Redis Database Backup):定期将内存中的数据快照保存到磁盘。
- AOF(Append-Only File):记录所有写操作命令,通过重放这些命令来恢复数据
Redis 的应用场景
-
缓存:
作为数据库的缓存层,减轻数据库的压力,提高数据访问速度。
-
消息队列:
利用列表、发布/订阅等特性实现消息队列,用于异步处理和解耦系统组件。
-
实时分析:
使用 Redis 的快速读写特性进行实时数据分析和统计,如实时排行榜、计数器等。
-
会话存储:
存储用户会话信息,支持分布式应用的会话管理。
-
分布式锁:
利用原子操作实现分布式锁,确保在分布式环境下的资源同步。
-
丰富的客户端支持:
- 提供多种编程语言的客户端库,如 Python、Java、Node.js、C++ 等,方便开发者集成。
1. Redis 的安装与配置
以下以 windows系统为例
解压下载的压缩包。
双击start.bat 启动redis服务。
进入到dos。切换到解压目录,输入 redis-cli 执行客户端。
测试 Redis 连接:
redis-cli ping
如果返回 PONG
,表示连接成功。
配置 Redis
Redis 的主要配置文件位于redis.conf
。以下是一些常用的配置选项:
-
绑定地址 :
修改
bind
指令来指定 Redis 监听的 IP 地址,默认绑定到127.0.0.1
,仅本地访问。若需允许远程访问,可以修改为服务器的实际 IP 或注释掉该行以监听所有接口。bashbind 0.0.0.0
-
设置密码 :
在配置文件中找到
# requirepass foobared
,取消注释并设置密码:requirepass yourpassword
-
持久化配置:
-
RDB 持久化:
save 900 1 save 300 10 save 60 10000
上述配置表示在指定时间内有相应数量的写操作时,自动保存数据快照。
-
AOF 持久化:
bashappendonly yes appendfsync everysec
启用 AOF 持久化,并设置每秒同步一次。
-
-
内存限制 :
设置 Redis 使用的最大内存量,防止占用过多系统内存。
maxmemory 256mb maxmemory-policy allkeys-lru
上述配置表示最大使用 256MB 内存,并采用 LRU 策略淘汰数据。
修改配置文件后,需要重启 Redis 服务使配置生效:
Redis 的优缺点
优点
- 高性能:内存存储和高效的命令处理使其具备极高的读写速度。
- 丰富的数据结构:支持多种数据类型,满足不同应用场景的需求。
- 灵活的持久化方式:提供 RDB 和 AOF 两种持久化机制,兼顾性能和数据安全。
- 高可用性:通过主从复制、哨兵和集群模式,确保系统的高可用性和扩展性。
- 简单易用:命令简洁明了,易于学习和使用。
缺点
- 数据持久化带来的性能开销:虽然提供了持久化机制,但在高频率写入时可能会影响性能。
- 内存限制:由于数据存储在内存中,数据量受限于服务器的内存容量,成本较高。
- 不适合复杂查询:Redis 主要用于键值存储,复杂的查询和关系操作不如传统关系型数据库强大。
- 单线程模型:虽然高性能,但在单个实例上无法充分利用多核 CPU 的能力(不过可以通过集群模式来扩展)。
Redis 以其高性能、丰富的数据结构和灵活的应用方式,成为现代应用架构中不可或缺的组成部分。无论是作为缓存、消息队列,还是实时分析和分布式锁,Redis 都能提供高效的解决方案。然而,在使用时也需要考虑其内存消耗和持久化带来的性能开销,结合具体业务场景进行合理选型和优化。
2. 字符串(String)操作
字符串是 Redis 最基本的数据类型,可以存储文本、数字或二进制数据。
常用命令
- SET key value:设置键的值。
- GET key:获取键的值。
- INCR key:将键的整数值加 1。
- DECR key:将键的整数值减 1。
- APPEND key value:在键的现有值后追加内容。
- STRLEN key:获取键值的长度。
sql
SET name "Alice"
GET name # 输出: "Alice"
INCR counter # 返回 1(假设初始值为0)
INCR counter # 返回 2
GET counter # 输出: "2"
APPEND name " Smith"
GET name # 输出: "Alice Smith"
STRLEN name # 输出: 11
3. 哈希(Hash)操作
哈希用于存储对象的属性,适合存储具有多个字段的数据。
常用命令
- HSET key field value:设置哈希中字段的值。
- HGET key field:获取哈希中指定字段的值。
- HMSET key field1 value1 [field2 value2 ...] :批量设置哈希字段的值(已弃用,建议使用
HSET
)。 - HMGET key field1 [field2 ...] :批量获取哈希字段的值。
- HGETALL key:获取哈希中所有字段和值。
- HDEL key field [field ...] :删除哈希中的一个或多个字段。
sql
HSET user:1 name "Bob" age 25 email "bob@example.com"
HGET user:1 name # 输出: "Bob"
HMSET user:2 name "Charlie" age 30 email "charlie@example.com"
HMGET user:2 name age # 输出: ["Charlie", "30"]
HGETALL user:1
# 输出:
# 1) "name"
# 2) "Bob"
# 3) "age"
# 4) "25"
# 5) "email"
# 6) "bob@example.com"
HDEL user:1 email
HGETALL user:1
# 输出:
# 1) "name"
# 2) "Bob"
# 3) "age"
# 4) "25"
4. 列表(List)操作
列表是有序的字符串集合,支持在两端进行高效的插入和删除操作。
常用命令
- LPUSH key value [value ...] :在列表左侧插入一个或多个值。
- RPUSH key value [value ...] :在列表右侧插入一个或多个值。
- LPOP key:移除并获取列表左侧的第一个值。
- RPOP key:移除并获取列表右侧的第一个值。
- LRANGE key start stop:获取列表中指定范围的值。
- LLEN key:获取列表的长度。
- LREM key count value:移除列表中指定数量的值。
shell
LPUSH tasks "task1"
RPUSH tasks "task2"
LPUSH tasks "task0"
LRANGE tasks 0 -1
# 输出:
# 1) "task0"
# 2) "task1"
# 3) "task2"
LPOP tasks
# 输出: "task0"
LRANGE tasks 0 -1
# 输出:
# 1) "task1"
# 2) "task2"
LLEN tasks # 输出: 2
LREM tasks 1 "task1"
LRANGE tasks 0 -1
# 输出:
# 1) "task2"
5. 集合(Set)操作
集合是无序且不重复的字符串集合,支持高效的集合运算。
常用命令
- SADD key member [member ...] :向集合中添加一个或多个成员。
- SREM key member [member ...] :从集合中移除一个或多个成员。
- SMEMBERS key:获取集合中的所有成员。
- SISMEMBER key member:判断成员是否存在于集合中。
- SCARD key:获取集合的成员数量。
- SUNION key [key ...] :获取多个集合的并集。
- SINTER key [key ...] :获取多个集合的交集。
- SDIFF key [key ...] :获取多个集合的差集。
bash
SADD fruits "apple"
SADD fruits "banana" "cherry"
SMEMBERS fruits
# 输出:
# 1) "apple"
# 2) "banana"
# 3) "cherry"
SISMEMBER fruits "banana" # 输出: 1 (存在)
SISMEMBER fruits "grape" # 输出: 0 (不存在)
SCARD fruits # 输出: 3
SADD other_fruits "banana" "dragonfruit"
SUNION fruits other_fruits
# 输出:
# 1) "apple"
# 2) "banana"
# 3) "cherry"
# 4) "dragonfruit"
SINTER fruits other_fruits
# 输出:
# 1) "banana"
SDIFF fruits other_fruits
# 输出:
# 1) "apple"
# 2) "cherry"
6. 有序集合(Sorted Set)操作
有序集合是带有分数(score)的集合,成员按分数有序排列。
常用命令
- ZADD key score member [score member ...] :向有序集合中添加一个或多个成员,或更新已有成员的分数。
- ZREM key member [member ...] :移除有序集合中的一个或多个成员。
- ZRANGE key start stop [WITHSCORES] :按分数从小到大获取成员。
- ZRANGEBYSCORE key min max [WITHSCORES] :按分数范围获取成员。
- ZREVRANGE key start stop [WITHSCORES] :按分数从大到小获取成员。
- ZCARD key:获取有序集合的成员数量。
- ZSCORE key member:获取成员的分数。
shell
ZADD leaderboard 100 user1
ZADD leaderboard 200 user2
ZADD leaderboard 150 user3
ZRANGE leaderboard 0 -1 WITHSCORES
# 输出:
# 1) "user1"
# 2) "100"
# 3) "user3"
# 4) "150"
# 5) "user2"
# 6) "200"
ZREVRANGE leaderboard 0 -1 WITHSCORES
# 输出:
# 1) "user2"
# 2) "200"
# 3) "user3"
# 4) "150"
# 5) "user1"
# 6) "100"
ZRANGEBYSCORE leaderboard 100 150 WITHSCORES
# 输出:
# 1) "user1"
# 2) "100"
# 3) "user3"
# 4) "150"
ZREM leaderboard user1
ZRANGE leaderboard 0 -1 WITHSCORES
# 输出:
# 1) "user3"
# 2) "150"
# 3) "user2"
# 4) "200"
ZCARD leaderboard # 输出: 2
ZSCORE leaderboard user2 # 输出: "200"
7. 键管理操作
管理 Redis 中的键,包括查看、删除、设置过期时间等。
常用命令
- KEYS pattern:查找所有符合模式的键(不推荐在生产环境中使用,因性能问题)。
- SCAN cursor [MATCH pattern] [COUNT count] :迭代查找符合模式的键。
- DEL key [key ...] :删除一个或多个键。
- EXISTS key [key ...] :检查一个或多个键是否存在。
- EXPIRE key seconds:设置键的过期时间(秒)。
- TTL key:获取键的剩余生存时间。
sql
SET temp "temporary"
EXPIRE temp 60
TTL temp # 输出: 60(剩余60秒)
SET user:3 name "Dave"
EXISTS user:3 # 输出: 1 (存在)
KEYS user:* # 输出: ["user:3"] (注意:不推荐在生产环境使用)
SCAN 0 MATCH user:*
# 输出:
# 1) "0"
# 2) 1) "user:3"
DEL temp
EXISTS temp # 输出: 0 (不存在)
8 连接与管理操作
管理 Redis 连接和服务器配置。
常用命令
- CONFIG GET parameter:获取服务器配置参数。
- CONFIG SET parameter value:设置服务器配置参数。
- FLUSHALL:清空所有数据库中的所有键(慎用)。
- FLUSHDB:清空当前数据库中的所有键(慎用)。
- SELECT index:选择数据库(0-15,默认是0)。
shell
CONFIG GET maxmemory
# 输出:
# 1) "maxmemory"
# 2) "0" (表示无限制)
CONFIG SET maxmemory 256mb
FLUSHDB # 清空当前数据库
持久化操作
控制 Redis 的持久化行为。
常用命令
- SAVE:同步保存数据到磁盘(阻塞)。
- BGSAVE:异步保存数据到磁盘(非阻塞)。
- LASTSAVE:返回最近一次成功将数据保存到磁盘的时间戳。
bash
SAVE # 同步保存,可能会阻塞其他操作
BGSAVE # 异步保存,立即返回
LASTSAVE # 输出最近一次保存的时间戳