Redis教程介绍了Redis的基本概念、安装配置、数据类型操作、事务和脚本使用、持久化方法以及集群搭建与管理等内容,帮助读者全面了解和掌握Redis。文章详细讲解了Redis的多种数据结构和应用场景,并提供了丰富的命令示例。通过本教程,读者可以轻松构建高效、可靠的Redis应用。
Redis是一种高性能的键值对存储系统,常被用作数据库、缓存和消息中间件。它支持多种类型的数据结构,如字符串、哈希表、列表、集合、有序集合等,并且提供了丰富的数据操作命令。
Redis全称是Remote Dictionary Server,是一款基于内存的数据存储系统。它支持持久化存储,可以用于构建高性能的缓存系统或实时数据库。Redis拥有高性能的原因在于其所有数据都存储在内存中,加上Redis采用单线程处理模型,避免了多线程之间的上下文切换和竞争,使得性能得到了极大的提升。
Redis具有以下主要特点:
Redis适用于以下应用场景:
C:\redis
。redis-server.exe
1:C 24 Jan 14:24:36.771 * Loading RDB produced by version 6.2.5 1:C 24 Jan 14:24:36.771 * RDB version in Redis server 6.2.5 1:C 24 Jan 14:24:36.771 * Loading RDB for DB 0... done 1:C 24 Jan 14:24:36.771 * DB 0: 0 keys (0 bytes) passed with 0 milliseconds to load 1:S 24 Jan 14:24:36.771 * Ready to accept connections
sudo apt-get update sudo apt-get install redis-server
sudo service redis-server start
sudo service redis-server status
输出结果类似如下:
redis-server is running with pid 2274
Redis的配置文件通常位于 /etc/redis/redis.conf
或 /etc/redis/redis-server.conf
。以下是部分常见的配置项:
bind
: 设置绑定的IP地址,默认为127.0.0.1
,表示只监听本地连接。port
: 设置监听的端口号,默认端口为6379
。requirepass
: 设置认证密码,客户端连接时需要提供密码。timeout
: 设置客户端空闲超时时间,默认为0
,表示永远不超时。maxmemory
: 设置最多能使用的内存量,超过该值时会触发内存淘汰策略。appendonly
: 设置AOF持久化,yes
表示启用,no
表示禁用。完整的redis.conf
文件示例如下:
# 设置绑定的IP地址 bind 127.0.0.1 # 设置监听的端口号 port 6379 # 设置认证密码 requirepass mypassword # 设置客户端空闲超时时间 timeout 300 # 设置最多能使用的内存量 maxmemory 100mb # 设置AOF持久化 appendonly yes
Redis支持多种数据类型,包括字符串(String)、列表(List)、集合(Set)、有序集合(Sorted Set)等。
字符串是Redis最基本的数据类型,可以存储字符、数字、JSON等任何类型的数据。
SET key value
: 设置键为key
的值。GET key
: 获取键为key
的值。DEL key
: 删除键为key
的值。MSET key1 value1 key2 value2
: 批量设置多个键值对。MGET key1 key2
: 批量获取多个键值对。示例代码:
# 设置字符串 SET mykey "Hello World" # 获取字符串 GET mykey # 批量设置 MSET key1 "value1" key2 "value2" # 批量获取 MGET key1 key2 # 删除键 DEL key1
列表是按插入顺序排序的有序字符串集合,支持两端插入和查询。
LPUSH key value
: 将元素值value
插入到列表key
的头部。RPUSH key value
: 将元素值value
插入到列表key
的尾部。LPOP key
: 移除并返回列表key
的头部元素。RPOP key
: 移除并返回列表key
的尾部元素。LRANGE key start stop
: 获取列表key
指定范围内的元素。示例代码:
# 在列表头部插入值 LPUSH mylist "a" # 在列表尾部插入值 RPUSH mylist "b" # 获取列表元素 LRANGE mylist 0 -1 # 移除头部和尾部元素 LPOP mylist RPOP mylist
集合是不重复的字符串集合,支持添加、删除、查找等操作。
SADD key member
: 将元素member
添加到集合key
中。SREM key member
: 将元素member
从集合key
中删除。SMEMBERS key
: 获取集合key
中的所有成员。SISMEMBER key member
: 判断成员member
是否在集合key
中。示例代码:
# 添加元素 SADD myset "a" SADD myset "b" # 获取集合 SMEMBERS myset # 删除元素 SREM myset "a" # 判断成员是否在集合中 SISMEMBER myset "b"
有序集合是带分数值和成员的集合,可以根据分数进行排序。
ZADD key score member
: 将成员member
添加到有序集合key
中,score
为成员的分数。ZREM key member
: 将成员member
从有序集合key
中删除。ZRANGE key start stop WITHSCORES
: 获取有序集合key
中指定范围内的成员及其分数。ZREVRANGE key start stop WITHSCORES
: 获取有序集合key
中指定范围内的成员及其分数,按照降序排列。示例代码:
# 添加元素 ZADD myzset 1 "one" ZADD myzset 2 "two" # 获取有序集合 ZRANGE myzset 0 -1 WITHSCORES # 删除元素 ZREM myzset "one" # 获取降序排列的元素 ZREVRANGE myzset 0 -1 WITHSCORES
Redis提供了丰富的数据操作命令,以及键操作命令,还可以设置过期时间。
SET key value
: 设置键为key
的值。GET key
: 获取键为key
的值。DEL key
: 删除键为key
的值。EXISTS key
: 检查键key
是否存在。INCR key
: 将键key
的值递增1。DECR key
: 将键key
的值递减1。示例代码:
# 设置键值对 SET mykey 10 # 获取值 GET mykey # 删除键 DEL mykey # 检查键是否存在 EXISTS mykey # 递增 INCR mykey # 递减 DECR mykey
EXPIRE key seconds
: 为键key
设置过期时间。TTL key
: 获取键key
的剩余过期时间。RENAMENX oldkey newkey
: 如果旧键oldkey
存在且新键newkey
不存在,则重命名键。KEYS pattern
: 查找符合模式pattern
的所有键。SCAN cursor
: 分页遍历数据库中的键,返回游标。示例代码:
# 设置过期时间 EXPIRE mykey 60 # 获取过期时间 TTL mykey # 原名存在且新名不存在时重命名 RENAMENX oldkey newkey # 查找匹配键 KEYS my* # 分页遍历键 SCAN 0
EXPIRE key seconds
: 为键key
设置过期时间,单位为秒。PEXPIRE key milliseconds
: 为键key
设置过期时间,单位为毫秒。EXPIREAT key timestamp
: 为键key
设置过期时间,timestamp
为Unix时间戳。PEXPIREAT key milliseconds-timestamp
: 为键key
设置过期时间,milliseconds-timestamp
为毫秒Unix时间戳。示例代码:
# 设置过期时间 EXPIRE mykey 60 # 设置毫秒过期时间 PEXPIRE mykey 1000 # 设置具体时间戳过期时间 EXPIREAT mykey 1672531200 # 设置具体毫秒时间戳过期时间 PEXPIREAT mykey 1672531200000
Redis支持事务和Lua脚本,可以实现原子操作。
Redis事务通过MULTI
、EXEC
、DISCARD
和 WATCH
命令来保证命令的顺序执行。
MULTI
: 开始一个事务。EXEC
: 执行事务中的所有命令。DISCARD
: 取消当前事务。WATCH key
: 监听键key
,如果在事务执行期间键发生变化,则执行失败。UNWATCH
: 取消监听所有键。示例代码:
# 开始一个事务 MULTI # 设置键值对 SET key1 1 SET key2 2 # 执行事务 EXEC # 取消事务 DISCARD # 监听键 WATCH key1 # 设置键值对 SET key1 1 # 执行事务 EXEC # 取消监听 UNWATCH
Lua脚本可以在Redis中执行多个命令,确保原子性。
EVAL script numkeys key [key ...] arg [arg ...]
: 执行Lua脚本,numkeys
代表键的个数,key
是键,arg
是参数。EVALSHA sha1 numkeys key [key ...] arg [arg ...]
: 执行由sha1
表示的Lua脚本,numkeys
代表键的个数,key
是键,arg
是参数。SCRIPT EXISTS sha1 [sha1 ...]
: 检查Lua脚本是否存在。SCRIPT FLUSH
: 清除所有缓存的Lua脚本。SCRIPT KILL
: 停止当前正在执行的Lua脚本。SCRIPT LOAD script
: 加载Lua脚本但不执行。示例代码:
# 定义Lua脚本 SET script "local a = redis.call('GET', KEYS[1])\nreturn tonumber(a) + tonumber(ARGV[1])" # 加载Lua脚本 SCRIPT LOAD script # 执行Lua脚本 EVAL "local a = redis.call('GET', KEYS[1])\nreturn tonumber(a) + tonumber(ARGV[1])" 1 key1 1
Redis支持多种持久化方法以及集群模式,可以实现数据的持久化存储和集群管理。
Redis支持两种持久化方式:RDB和AOF。
RDB(Redis Database Backup)持久化方式是通过定时生成数据快照来实现数据的持久化。RDB文件是一个二进制文件,记录了某个时刻的数据状态。
配置示例:
# 设置生成RDB文件的频率 save 900 1 save 300 10 save 60 10000 # 设置生成RDB文件的路径 dbfilename dump.rdb # 设置生成RDB文件的目录 dir /data/redis
AOF(Append Only File)持久化方式是通过记录所有写操作来实现数据的持久化。AOF文件是一个文本文件,记录了所有的Redis命令。
配置示例:
# 设置AOF持久化 appendonly yes # 设置AOF文件的路径 appendfilename appendonly.aof # 设置AOF文件的大小限制 appendfsync everysec
Redis集群可以实现数据的分布式存储和高可用性。搭建Redis集群需要使用Redis的集群模式。
redis-trib.rb create --replicas 1 ip1:port1 ip2:port2 ...
: 创建Redis集群,ip1:port1
、ip2:port2
为节点地址,--replicas
表示每个主节点有几个从节点。redis-trib.rb check ip1:port1
: 检查集群状态。redis-trib.rb reshard ip1:port1 ...
: 重新分配数据槽。redis-trib.rb fix ip1:port1 ...
: 修复集群状态。redis-trib.rb del-node ip1:port1 node-id
: 删除节点。redis-trib.rb reset ip1:port1
: 重置集群状态。示例代码:
# 创建集群 redis-trib.rb create --replicas 1 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006 # 检查集群状态 redis-trib.rb check 127.0.0.1:7001 # 重新分配数据槽 redis-trib.rb reshard 127.0.0.1:7001 # 修复集群状态 redis-trib.rb fix 127.0.0.1:7001 # 删除节点 redis-trib.rb del-node 127.0.0.1:7001 123456789abcdef123456789abcdef12345678 # 重置集群 redis-trib.rb reset 127.0.0.1:7001
Redis的发布订阅模式允许多个客户端订阅相同的频道,当有数据发布到该频道时,所有订阅该频道的客户端都会收到数据。
PUBLISH channel message
: 发布消息到指定的频道。SUBSCRIBE channel
: 订阅指定的频道。UNSUBSCRIBE channel
: 取消订阅指定的频道。PSUBSCRIBE pattern
: 订阅匹配指定模式的所有频道。PUNSUBSCRIBE pattern
: 取消订阅匹配指定模式的所有频道。示例代码:
# 发布消息到频道 PUBLISH mychannel "Hello" # 订阅频道 SUBSCRIBE mychannel # 发布消息 PUBLISH mychannel "Hello" # 取消订阅频道 UNSUBSCRIBE mychannel
Redis的排序命令用于对集合、列表、有序集合等数据类型进行排序。
SORT key [BY pattern] [ASC|DESC] [LIMIT offset count] [GET pattern] [STORE destination]
: 对键key
指定的数据类型进行排序。示例代码:
# 对集合进行排序 SORT myset BY default LIMIT 0 10 # 对有序集合进行排序 SORT myzset BY default LIMIT 0 10 # 对列表进行排序 SORT mylist BY default LIMIT 0 10
通过以上内容,你已经掌握了Redis的基本概念、安装配置、数据类型操作、事务和脚本使用、数据持久化以及集群搭建与管理。掌握这些内容后,你就可以开始构建高效、可靠的Redis应用了。
接下来,你可以深入学习Redis更多的高级功能,如Redis的发布订阅模式、Redis的排序命令等,进一步提升你的技术能力。如果你需要更多学习资源,可以参考慕课网(https://www.imooc.com/)上的相关课程。