本文详细介绍了Redis的基本概念、特点和应用场景,并提供了安装配置、数据类型详解、基础命令和持久化备份的教程,帮助读者全面了解和掌握Redis。
Redis简介Redis是一个开源的内存数据结构存储系统,可以用作数据库、缓存和消息中间件。它支持多种数据结构,如字符串(String)、哈希(Hash)、列表(List)、集合(Set)和有序集合(Sorted Set)。Redis具有高性能,可以轻松地满足实时应用的需求。
Ubuntu/Debian
sudo apt update sudo apt install redis-server
sudo yum install epel-release sudo yum install redis
使用Homebrew安装Redis:
brew install redis
Redis不直接支持Windows,但可以通过WSL(Windows Subsystem for Linux)安装:
Redis配置文件通常位于/etc/redis/redis.conf
(Linux)或/usr/local/etc/redis/redis.conf
(macOS)。以下是一些常用的配置参数:
bind 127.0.0.1
(默认)port 6379
(默认)save "seconds changes"
loglevel info
(默认)maxmemory 1g
(默认无限制)示例配置:
bind 127.0.0.1 port 6379 save 900 1 loglevel notice maxmemory 512mbRedis数据类型详解
字符串是Redis中最基本的数据类型,可以存储字符串、整数、浮点数等。
设置字符串
SET key value
示例:
SET mykey "Hello, Redis"
获取字符串
GET key
示例:
GET mykey
STRLEN key
示例:
STRLEN mykey
# 设置字符串 SET mykey "Hello, Redis" # 获取字符串 GET mykey # 输出: "Hello, Redis" # 字符串长度 STRLEN mykey # 输出: 13
哈希类型用于存储对象,键值对的形式存储数据。
设置哈希值
HSET key field value
示例:
HSET user:1 name "Alice" HSET user:1 age 25
获取哈希值
HGET key field
示例:
HGET user:1 name
HGETALL key
示例:
HGETALL user:1 # 输出: 1) "name" 2) "Alice" 3) "age" 4) "25"
# 设置哈希值 HSET user:1 name "Alice" HSET user:1 age 25 # 获取哈希值 HGET user:1 name # 输出: "Alice" # 获取所有字段 HGETALL user:1 # 输出: 1) "name" 2) "Alice" 3) "age" 4) "25"
列表类型用于存储有序的字符串列表,支持在列表两端进行插入和删除操作。
在列表尾部添加元素
RPUSH key value
示例:
RPUSH mylist "a" RPUSH mylist "b"
在列表头部添加元素
LPUSH key value
示例:
LPUSH mylist "c"
LRANGE key start stop
示例:
LRANGE mylist 0 -1 # 输出: 1) "c" 2) "a" 3) "b"
# 在列表尾部添加元素 RPUSH mylist "a" RPUSH mylist "b" # 在列表头部添加元素 LPUSH mylist "c" # 获取列表元素 LRANGE mylist 0 -1 # 输出: 1) "c" 2) "a" 3) "b"
集合类型用于存储无序的字符串集合,支持集合间的交集、并集、差集等操作。
添加元素
SADD key member
示例:
SADD myset "a" SADD myset "b"
获取集合中的所有成员
SMEMBERS key
示例:
SMEMBERS myset # 输出: 1) "a" 2) "b"
SISMEMBER key member
示例:
SISMEMBER myset "a" # 输出: 1
# 添加元素 SADD myset "a" SADD myset "b" # 获取集合中的所有成员 SMEMBERS myset # 输出: 1) "a" 2) "b" # 检查成员是否存在 SISMEMBER myset "a" # 输出: 1
有序集合类型用于存储带有权重(score)的字符串成员,可以根据权重进行排序。
添加带权重的成员
ZADD key score member
示例:
ZADD myzset 1 "a" ZADD myzset 2 "b"
获取集合中的所有成员
ZRANGE key start stop
示例:
ZRANGE myzset 0 -1 # 输出: 1) "a" 2) "b"
ZSCORE key member
示例:
ZSCORE myzset "a" # 输出: "1"
# 添加带权重的成员 ZADD myzset 1 "a" ZADD myzset 2 "b" # 获取集合中的所有成员 ZRANGE myzset 0 -1 # 输出: 1) "a" 2) "b" # 获取成员的权重 ZSCORE myzset "a" # 输出: "1"Redis命令基础
设置键值
SET key value
示例:
SET mykey "Hello, Redis"
获取键值
GET key
示例:
GET mykey # 输出: "Hello, Redis"
删除键值
DEL key
示例:
DEL mykey
设置键值并设置过期时间
SET key value EX seconds
示例:
SET mykey "Hello, Redis" EX 60
键是否存在
EXISTS key
示例:
EXISTS mykey # 输出: 1
MSET key1 value1 key2 value2 ...
示例:
MSET key1 "value1" key2 "value2"
获取键的类型
TYPE key
示例:
TYPE mykey # 输出: string
获取键的过期时间
TTL key
示例:
TTL mykey # 输出: 59
获取键的剩余生存时间
PTTL key
示例:
PTTL mykey # 输出: 59000
重命名键
RENAME oldkey newkey
示例:
RENAME mykey newkey
移动键到另一个数据库
MOVE key db
示例:
MOVE mykey 1
FLUSHDB
示例:
FLUSHDB # 输出: OK
RDB持久化是将内存中的数据以二进制文件的形式写入磁盘,生成一个RDB文件。Redis会在满足条件时自动触发RDB持久化,也可以手动触发。
自动持久化
save seconds changes
示例:
save 900 1
BGSAVE
# 手动触发RDB持久化 BGSAVE # 输出: Background saving started
AOF持久化是将每个写入操作追加到一个文件中,当Redis重启时,可以通过重放AOF文件中的命令来恢复数据。
开启AOF持久化
appendonly yes
示例:
appendonly yes
BGREWRITEAOF
# 开启AOF持久化 appendonly yes # 执行AOF重写 BGREWRITEAOF # 输出: Background append only file rewriting started
备份RDB文件
cp /path/to/redis/dump.rdb /path/to/backup/directory
备份AOF文件
cp /path/to/redis/appendonly.aof /path/to/backup/directory
tar -czvf redis-backup.tar.gz /path/to/redis
缓存系统用于加快数据访问速度,通常将热点数据存储在内存中,减少数据库的访问压力。
假设我们有一个用户登录系统,需要频繁查询用户名和密码。
import redis # 连接Redis服务器 r = redis.Redis(host='localhost', port=6379, db=0) # 设置缓存数据 r.set('user:1:username', 'alice') r.set('user:1:password', 'secret') # 从缓存中获取数据 username = r.get('user:1:username') password = r.get('user:1:password') print(f"Username: {username.decode()} Password: {password.decode()}") # 输出: Username: alice Password: secret
排行榜功能用于统计用户积分、文章评论数等,可以使用Redis的有序集合(Sorted Set)实现。
假设我们有一个用户积分系统,需要定期更新用户的积分排名。
import redis # 连接Redis服务器 r = redis.Redis(host='localhost', port=6379, db=0) # 设置用户积分 r.zadd('user_scores', {'user1': 100}) r.zadd('user_scores', {'user2': 200}) r.zadd('user_scores', {'user3': 150}) # 获取用户积分排名 scores = r.zrange('user_scores', 0, -1, withscores=True) for score in scores: print(f"User: {score[0].decode()} Score: {score[1]}") # 输出: User: user1 Score: 100 # 输出: User: user3 Score: 150 # 输出: User: user2 Score: 200