-
Redis(Remote Dictionary Server)是一个高性能的开源内存数据库,广泛用于缓存、消息队列、会话存储和实时分析等场景。Redis支持多种数据结构,包括字符串、哈希表、列表、集合和有序集合等。本文将详细介绍Redis中的一些常用命令和高级功能,帮助你更深入地理解和使用这个强大的数据库。
1. 字符串操作
在Redis中,字符串是最基本的数据类型,可以存储任何形式的文本或二进制数据。字符串操作是Redis使用最多的操作之一,适用于缓存简单的键值对数据。
基本命令
SET key value [EX seconds|PX milliseconds|NX|XX]
:设置指定键的值。可选参数EX
和PX
用于设置过期时间(秒或毫秒),NX
用于只在键不存在时设置,XX
用于只在键存在时设置。GET key
:获取指定键的值。DEL key
:删除指定键及其对应的值。INCR key
/DECR key
:将键的整数值递增或递减1。APPEND key value
:将value
追加到指定键的值之后。STRLEN key
:获取指定键所存储值的长度。SETEX key seconds value
:设置键的值,并设置键的过期时间(秒)。SETNX key value
:只在键不存在时,设置键的值。MSET key value [key value ...]
:同时设置多个键值对。MGET key [key ...]
:获取所有指定键的值。
示例
SET name "Alice" EX 300
GET name
INCR counter
APPEND name " Smith"
STRLEN name
DEL name
MSET key1 "value1" key2 "value2"
MGET key1 key2
高级操作
GETSET key value
:将键的值设为value,并返回键的旧值。GETRANGE key start end
:获取键的值的子字符串,从start到end(包含)。SETRANGE key offset value
:用value覆盖键的值,从偏移量offset开始。BITCOUNT key [start end]
:计算键的值中被设置为1的比特位的数量。BITOP operation destkey key [key ...]
:对一个或多个键的值进行按位操作,并将结果存储在destkey中。操作可以是AND, OR, XOR, NOT。
示例
SET mykey "Hello"
GETSET mykey "World"
GET mykey
SET mykey "This is a string"
GETRANGE mykey 0 3
SETRANGE mykey 0 "That"
GET mykey
SETBIT mykey 7 1
BITCOUNT mykey
BITOP AND result key1 key2
2. 哈希表操作
哈希表在Redis中用于存储键值对集合,适合表示对象或结构化数据。每个哈希表本质上是一个小型键值对数据库。
基本命令
HSET key field value
:设置哈希表中指定字段的值。HGET key field
:获取哈希表中指定字段的值。HDEL key field [field ...]
:删除哈希表中一个或多个字段。HGETALL key
:获取哈希表中所有字段和值。HEXISTS key field
:检查哈希表中指定字段是否存在。HLEN key
:获取哈希表中字段的数量。HMSET key field value [field value ...]
:同时设置多个字段的值。HMGET key field [field ...]
:获取多个字段的值。
示例
HSET user:1 username "Alice" age 30
HGET user:1 username
HGETALL user:1
HDEL user:1 age
HEXISTS user:1 username
HLEN user:1
HMSET user:2 username "Bob" age 25
HMGET user:2 username age
高级操作
HINCRBY key field increment
:将哈希表中的字段值加上指定增量。HINCRBYFLOAT key field increment
:将哈希表中的字段值加上指定浮点数增量。HKEYS key
:获取哈希表中所有字段名。HVALS key
:获取哈希表中所有值。HRANDFIELD key [count [WITHVALUES]]
:随机获取哈希表中的一个或多个字段,如果使用WITHVALUES选项,则同时返回字段值。
示例
HINCRBY user:1 age 1
HINCRBYFLOAT user:1 salary 1000.5
HKEYS user:1
HVALS user:1
HRANDFIELD user:1
HRANDFIELD user:1 2 WITHVALUES
3. 列表操作
列表是一个有序的字符串集合,允许重复成员,常用于实现队列和栈。列表操作在多种应用场景中都非常有用,如消息队列和任务调度。
基本命令
LPUSH key value [value ...]
:将一个或多个值插入到列表头部。RPUSH key value [value ...]
:将一个或多个值插入到列表尾部。LPOP key
:移除并返回列表头部的元素。RPOP key
:移除并返回列表尾部的元素。LRANGE key start stop
:获取列表中指定范围的元素。LLEN key
:获取列表的长度。LINDEX key index
:通过索引获取列表中的元素。LREM key count value
:根据参数count
的值,移除列表中与value
相等的元素。count
>0,从头到尾移除,count
<0,从尾到头移除,count
=0,移除所有。
示例
LPUSH tasks "task1"
RPUSH tasks "task2"
LPOP tasks
RPOP tasks
LRANGE tasks 0 -1
LLEN tasks
LINDEX tasks 1
LREM tasks 1 "task2"
高级操作
LSET key index value
:通过索引设置列表元素的值。LTRIM key start stop
:修剪列表,使其只保留指定范围的元素。RPOPLPUSH source destination
:移除列表的最后一个元素,并将该元素添加到另一个列表并返回。BLPOP key [key ...] timeout
:移除并返回列表的第一个元素,如果所有指定列表都为空,则阻塞直到超时或有一个元素可以弹出。BRPOP key [key ...] timeout
:移除并返回列表的最后一个元素,如果所有指定列表都为空,则阻塞直到超时或有一个元素可以弹出。BRPOPLPUSH source destination timeout
:从列表的尾部移除一个元素,并将该元素插入到另一个列表的头部,如果源列表为空,则阻塞直到超时或有一个元素可以弹出。
示例
LSET tasks 0 "updated_task1"
LTRIM tasks 0 1
RPOPLPUSH tasks completed_tasks
BLPOP tasks 0
BRPOP tasks 0
BRPOPLPUSH tasks completed_tasks 0
4. 集合操作
集合是一个无序且不重复的字符串集合,适用于存储唯一值的数据集合,如标签、唯一标识符等。
基本命令
SADD key member [member ...]
:向集合中添加一个或多个成员。SMEMBERS key
:获取集合中的所有成员。SREM key member [member ...]
:移除集合中的一个或多个成员。SISMEMBER key member
:检查指定成员是否在集合中。SCARD key
:获取集合中的成员数量。SDIFF key [key ...]
:返回一个集合与一个或多个集合之间的差异。SINTER key [key ...]
:返回一个集合与一个或多个集合之间的交集。SUNION key [key ...]
:返回所有给定集合的并集。
示例
SADD tags "redis" "database"
SMEMBERS tags
SREM tags "database"
SISMEMBER tags "redis"
SCARD tags
SDIFF set1 set2
SINTER set1 set2
SUNION set1 set2
高级操作
SRANDMEMBER key [count]
:随机返回集合中的一个或多个成员。SPOP key [count]
:移除并返回集合中的一个或多个随机成员。SMOVE source destination member
:将成员从一个集合移动到另一个集合。SSCAN key cursor [MATCH pattern] [COUNT count]
:增量迭代集合中的元素。
示例
SRANDMEMBER tags
SRANDMEMBER tags 2
SPOP tags
SPOP tags 2
SMOVE tags archived_tags "redis"
SSCAN tags 0 MATCH "da*"
5. 有序集合操作
有序集合(Sorted Set)和集合类似,但每个成员都关联一个分数(score),用于排序。它们在排行榜、优先级队列等场景中非常有用。
基本命令
ZADD key score member [score member ...]
:向有序集合中添加一个或多个成员,并指定分数。ZRANGE key start stop [WITHSCORES]
:按照索引范围获取有序集合中的成员。ZREM key member [member ...]
:移除有序集合中的一个或多个成员。ZINCRBY key increment member
:对有序集合中指定成员的分数加上增量。ZRANK key member
:返回有序集合中指定成员的排名(按分数从低到高)。ZREVRANK key member
:返回有序集合中指定成员的排名(按分数从高到低)。ZSCORE key member
:获取有序集合中指定成员的分数。ZREMRANGEBYSCORE key min max
:移除有序集合中指定分数范围内的所有成员。
示例
ZADD leaderboard 1000 "Alice" 1500 "Bob"
ZRANGE leaderboard 0 -1 WITHSCORES
ZREM leaderboard "Alice"
ZINCRBY leaderboard 100 "Bob"
ZRANK leaderboard "Bob"
ZREVRANK leaderboard "Bob"
ZSCORE leaderboard "Bob"
ZREMRANGEBYSCORE leaderboard 0 1200
高级操作
ZREMRANGEBYRANK key start stop
:移除有序集合中指定排名范围内的所有成员。ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]
:按照分数范围获取有序集合中的成员。ZREVRANGEBYSCORE key max min [WITHSCORES]
:按分数范围从高到低获取有序集合中的成员。ZUNIONSTORE destination numkeys key [key ...]
:计算给定的一个或多个有序集的并集,并存储在新的destination集合中。ZINTERSTORE destination numkeys key [key ...]
:计算给定的一个或多个有序集的交集,并将其存储在新的destination集合中。
示例
ZREMRANGEBYRANK leaderboard 0 1
ZRANGEBYSCORE leaderboard 1000 1500 WITHSCORES LIMIT 0 2
ZREVRANGEBYSCORE leaderboard 1500 1000
ZUNIONSTORE combined_leaderboard 2 leaderboard1 leaderboard2
ZINTERSTORE common_leaderboard 2 leaderboard1 leaderboard2
6. 发布/订阅操作
Redis的发布/订阅(Pub/Sub)功能是一种消息通信模式,其中发送者(发布者)发送消息,接收者(订阅者)接收消息。发布者和订阅者不需要直接联系,而是通过频道进行通信。
基本命令
PUBLISH channel message
:将消息发送到指定的频道。SUBSCRIBE channel [channel ...]
:订阅一个或多个频道,接收其发布的消息。UNSUBSCRIBE [channel ...]
:取消订阅一个或多个频道。PSUBSCRIBE pattern [pattern ...]
:订阅一个或多个符合模式的频道。PUNSUBSCRIBE [pattern ...]
:取消订阅一个或多个符合模式的频道。
示例
PUBLISH news "Breaking News!"
SUBSCRIBE news
UNSUBSCRIBE news
PSUBSCRIBE news*
PUNSUBSCRIBE news*
7. 事务操作
事务(Transaction)是Redis提供的用于保证一组命令按顺序执行的机制。Redis事务通过MULTI
、EXEC
、DISCARD
和WATCH
命令实现。
基本命令
MULTI
:开始一个事务块。EXEC
:执行所有在事务块中排队的命令。DISCARD
:取消事务块,并放弃所有在事务块中排队的命令。WATCH key [key ...]
:监视一个或多个键,如果在事务执行之前这些键被其他命令修改,则事务将被中止。
示例
MULTI
SET key1 "value1"
SET key2 "value2"
EXEC
高级操作
UNWATCH
:取消对所有键的监视。
示例
WATCH key1 key2
MULTI
SET key1 "new_value1"
SET key2 "new_value2"
EXEC
UNWATCH
8. 脚本操作
Redis通过内置的Lua脚本引擎,允许用户在服务器端执行脚本,实现更复杂的操作和原子性。
基本命令
EVAL script numkeys key [key ...] arg [arg ...]
:执行Lua脚本。EVALSHA sha1 numkeys key [key ...] arg [arg ...]
:执行已经存在于缓存中的Lua脚本。SCRIPT LOAD script
:将脚本加载到脚本缓存中,但不立即执行。SCRIPT FLUSH
:清空所有脚本缓存。SCRIPT KILL
:杀死当前正在运行的Lua脚本。
示例
-- Lua script to increment a counter
local count = redis.call('INCR', KEYS[1])
if count == 1 then
redis.call('EXPIRE', KEYS[1], ARGV[1])
end
return count
-- Executing the script in Redis
EVAL "local count = redis.call('INCR', KEYS[1]) if count == 1 then redis.call('EXPIRE', KEYS[1], ARGV[1]) end return count" 1 counter 60
9. 高可用与集群
为了在生产环境中使用Redis,通常需要考虑高可用性和扩展性。Redis提供了多种方式来实现这些目标。
主从复制
Redis的主从复制(Replication)允许将数据从一个Redis实例复制到一个或多个从实例(Replica),以提高数据的可用性和读取吞吐量。
基本命令
SLAVEOF host port
:将当前实例配置为指定主实例的从实例。SLAVEOF NO ONE
:将当前实例配置为主实例。
示例
SLAVEOF master_host master_port
SLAVEOF NO ONE
Redis Sentinel
Redis Sentinel是Redis的高可用性解决方案,用于监控Redis实例,自动故障转移,并提供通知功能。
配置示例
sentinel monitor mymaster 127.0.0.1 6379 2
sentinel auth-pass mymaster your_redis_password
sentinel down-after-milliseconds mymaster 5000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 15000
Redis集群
Redis集群提供了自动分片和高可用性,通过将数据分布到多个节点上,允许Redis处理更大的数据集和更高的吞吐量。
配置示例
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
10. 性能优化
为了在高负载的生产环境中高效运行Redis,以下是一些性能优化建议。
内存优化
- 使用合适的数据结构:选择最适合你的数据访问模式的数据结构,以减少内存占用。
- 压缩数据:在存储大文本数据之前进行压缩。
- 使用内存优化选项:如
maxmemory
和maxmemory-policy
配置项,限制Redis使用的最大内存并设置内存淘汰策略。
持久化优化
- 使用AOF(Append Only File)和RDB(Redis DataBase)快照的结合:这样可以在性能和数据安全之间取得平衡。
- 调整AOF重写和RDB快照的频率:根据你的写入负载和可接受的数据丢失时间来调整配置。
网络优化
- 使用Pipelining:通过一次性发送多条命令来减少网络往返次数。
- 配置合理的TCP参数:如
tcp-keepalive
和tcp-backlog
,以优化网络连接的性能。
结论
Redis是一款功能强大且高效的内存数据库,适用于各种应用场景。通过掌握其丰富的数据结构和高级操作,能够更好地满足复杂业务需求。希望本指南能够帮助你深入理解和高效使用Redis,提升你的应用性能和开发效率。