文章目录
- 一、常用命令示例
- 二、组合命令示例
- 三、综述
- 三、深入学习下一篇
一、常用命令示例
Redis 是一个高性能的键值存储系统,支持多种数据结构。以下是 Redis 命令行中所有数据结构的详细用法,包括字符串、哈希、列表、集合、有序集合、位图、HyperLogLog 和地理空间索引。
1.字符串(String)
设置值
SET key value
获取值
GET key
追加值
APPEND key value
获取字符串长度
STRLEN key
设置带过期时间的值
SETEX key seconds value
批量设置多个键值
MSET key1 value1 key2 value2
批量获取多个键值
MGET key1 key2
自增
INCR key
自减
DECR key
增加指定数值
INCRBY key increment
减少指定数值
DECRBY key decrement
检查键是否存在
EXIST key
2.哈希(Hash)
设置哈希字段
HSET key field value
获取哈希字段
HGET key field
获取所有哈希字段和值
HGETALL key
删除哈希字段
HDEL key field
获取所有字段名
HKEYS key
获取所有值
HVALS key
获取哈希字段数量
HLEN key
批量设置多个字段
HMSET key field1 value1 field2 value2
批量获取多个字段
HMGET key field1 field2
判断字段是否存在
HEXISTS key field
3.列表(List)
左侧插入元素
LPUSH key value
右侧插入元素
RPUSH key value
获取列表中的元素
LRANGE key start stop
获取列表长度
LLEN key
移除并返回左侧第一个元素
LPOP key
移除并返回右侧第一个元素
RPOP key
获取列表中指定位置的元素
LINDEX key index
插入元素到指定位置之前/之后
LINSERT key BEFORE|AFTER pivot value
设置列表中指定位置的元素
LSET key index value
修剪列表只保留指定范围的元素
LTRIM key start stop
4.集合(Set)
添加元素
SADD key member
获取所有元素
SMEMBERS key
移除元素
SREM key member
判断元素是否存在
SISMEMBER key member
获取集合大小
SCARD key
随机移除并返回一个元素
SPOP key
随机返回一个或多个元素
SRANDMEMBER key [count]
计算集合间交集
SINTER key1 key2
计算集合间并集
SUNION key1 key2
计算集合间差集
SDIFF key1 key2
5.有序集合(Sorted Set)
添加元素及其分数
ZADD key score member
获取集合中的元素及其分数
ZRANGE key start stop [WITHSCORES]
按分数范围获取元素
ZRANGEBYSCORE key min max [WITHSCORES]
移除元素
ZREM key member
获取集合大小
ZCARD key
获取指定成员的排名
ZRANK key member
获取指定成员的分数
ZSCORE key member
按排名范围移除元素
ZREMRANGEBYRANK key start stop
按分数范围移除元素
ZREMRANGEBYSCORE key min max
6.位图(Bitmap)
设置或清除位
SETBIT key offset value
获取指定位的值
GETBIT key offset
计算位图中值为 1 的位的数量
BITCOUNT key [start end]
对多个位图进行二进制操作
BITOP operation destkey key [key ...]
7.HyperLogLog
添加元素到 HyperLogLog
PFADD key element [element ...]
返回 HyperLogLog 的基数估算值
PFCOUNT key
将多个 HyperLogLog 合并为一个
PFMERGE destkey sourcekey [sourcekey ...]
8.地理空间索引(Geospatial)
添加地理空间位置
GEOADD key longitude latitude member
获取地理空间位置
GEOPOS key member
计算两个成员之间的距离
GEODIST key member1 member2 [unit]
按半径查找地理空间位置
GEORADIUS key longitude latitude radius unit [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DESC] [STORE key] [STOREDIST key]
按半径查找地理空间位置(根据成员)
GEORADIUSBYMEMBER key member radius unit [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DESC] [STORE key] [STOREDIST key]
获取地理空间成员的 Geohash 值
GEOHASH key member [member ...]
9、其他命令
-
PING:检查Redis服务器是否在运行。
PING
-
SET / GET:设置键的值并检索它。
SET mykey "Hello" GET mykey
-
DEL:删除键及其关联的值。
SET mykey "Hello" DEL mykey
-
EXISTS:检查键是否存在。
EXISTS mykey
-
FLUSHALL:清空整个Redis数据库。
FLUSHALL
-
FLUSHDB:清空当前选择的数据库。
FLUSHDB
-
INFO:获取关于Redis服务器的信息。
如:Server、Client、Memory、Persistence、Stats、Replication、CPU、Cluster、KeyspaceINFO
-
SELECT:选择数据库。
SELECT
二、组合命令示例
Redis 提供了丰富的组合命令行用法,可以将多个基础命令组合在一起以实现更复杂的操作。以下是一些常见的组合命令行用法示例,涵盖了字符串、哈希、列表、集合、有序集合、位图、HyperLogLog 和地理空间索引等数据结构。
1.字符串(String)
组合用法:获取一个键的值并增加它
GET key
INCR key
INCR key
INCRBY key 20
DECRBY key 20
这两个命令组合起来用于获取键 key
的当前值,并将其自增 1。
2.哈希(Hash)
组合用法:批量设置哈希字段并获取所有字段和值
HMSET user:1001 name "Alice" age 30
HGETALL user:1001
这些命令组合起来用于设置哈希 user:1001
的多个字段,然后获取所有字段和值。
3.列表(List)
组合用法:从一个列表的左侧插入元素并从右侧弹出元素
LPUSH mylist "first"
RPUSH mylist "last"
LPOP mylist
RPOP mylist
这些命令组合起来用于在列表 mylist
左侧插入 “first”,在右侧插入 “last”,然后从左侧和右侧各弹出一个元素。
4.集合(Set)
组合用法:添加多个元素到集合并计算集合的并集
SADD set1 "a" "b" "c"
SADD set2 "c" "d" "e"
SUNION set1 set2
这些命令组合起来用于将元素添加到集合 set1
和 set2
,然后计算两个集合的并集。
5.有序集合(Sorted Set)
组合用法:添加元素及其分数并按分数范围获取元素
ZADD myzset 1 "one" 2 "two" 3 "three"
ZRANGEBYSCORE myzset 1 2 WITHSCORES
这些命令组合起来用于向有序集合 myzset
添加元素及其分数,然后按分数范围 1 到 2 获取元素及其分数。
6.位图(Bitmap)
组合用法:设置多个位并计算位图中值为 1 的位的数量
场景如打卡
SETBIT mybitmap 0 1
SETBIT mybitmap 1 1
SETBIT mybitmap 2 0
BITCOUNT mybitmap
这些命令组合起来用于设置位图 mybitmap
的多个位,然后计算位图中值为 1 的位的数量。
7.HyperLogLog
组合用法:添加元素到 HyperLogLog 并获取基数估算值
PFADD myhll "foo" "bar" "zap"
PFCOUNT myhll
这些命令组合起来用于向 HyperLogLog myhll
添加元素,然后获取 HyperLogLog 的基数估算值。
8.地理空间索引(Geospatial)
组合用法:添加地理空间位置并按半径查找位置
GEOADD cities 13.361389 38.115556 "Palermo"
GEOADD cities 15.087269 37.502669 "Catania"
GEORADIUS cities 15 37 200 km WITHCOORD WITHDIST
这些命令组合起来用于向地理空间索引 cities
添加位置,然后按半径 200 公里查找位置,并返回坐标和距离。
9.管道(Pipeline)
为了提高性能,您可以使用管道(pipeline)将多个命令一起发送到服务器,从而减少网络往返时间。以下是一个使用管道的示例:
redis-cli --pipe
SET key1 value1
SET key2 value2
GET key1
GET key2
这将所有命令打包在一起发送到 Redis 服务器,提高了执行效率。
10.事务(Transactions)
Redis事务适用于需要对一系列命令进行原子性操作的场景,但在处理复杂事务逻辑、需要事务回滚、需要跨键操作等情况下,可能需要结合其他机制或使用其他存储方案。
使用事务确保多个命令原子化执行:
MULTI
SET key1 value1
SET key2 value2
EXEC
这将 SET key1 value1
和 SET key2 value2
命令原子化执行,保证它们要么都成功,要么都失败。
11.发布/订阅(Pub/Sub)
Redis的Pub/Sub模式适用于实时性要求较高、消息量较小、消息传递不需要持久化的场景,但在需要更高可靠性、更强扩展性和更复杂消息处理逻辑的情况下,可能需要考虑其他消息中间件或消息队列。如:Kafka、RabbitMQ等。
# 订阅频道
SUBSCRIBE mychannel
# 发布消息
PUBLISH mychannel "Hello, World!"
这些命令组合起来用于订阅频道 mychannel
并向其发布消息。
12.脚本(Scripting)
使用 Lua 脚本执行复杂逻辑:
EVAL "return redis.call('SET', KEYS[1], ARGV[1])" 1 key value
这会执行 Lua 脚本,在 Redis 中设置键值对。
还有EVALSHA 命令用于执行已经缓存的 Lua 脚本,避免了每次执行脚本都需要传输和解析脚本文本的开销。
上述一些组合 Redis 命令来实现复杂的操作和功能。通过掌握这些组合用法,可好的用 Redis 进行各种数据操作。
三、综述
前项,只是提供一些内容帮助理解redis的功能点。
切实理解,还需要从整体上把握中间件的功能,每个功能分支的优缺点,以及对应的应用场景。现有热门应用场景有哪些,思考下还可以用于什么场景,为什么可以,特定场景下,如ACID的考量等。深入理解,还要去深究源码实现,如为什么redis这么快,源码实现上考量了哪些方面,这些思路或技术点能否用在自己的代码实现中来解决一些问题。
另外,每个中间件都有自己的核心功能,使用时应该有选择的使用中间件的核心功能,而不是附带的旁门功能,因为可能存在只是为了实现而实现的问题。如redis的发布、订阅,应该使用专业的中间件如Kafka、RabbitMQ等。
下面列出一些数据结构相应的应用场景:
-
字符串(String):
关键原因:简单、灵活、高效。
应用场景:适用于需要存储简单值、缓存数据、计数器、会话管理等场景。 -
哈希表(Hash):
关键原因:存储键值对集合、字段操作快速。
应用场景:适用于存储对象属性、用户信息、配置信息等需要使用键值对存储的场景。 -
列表(List):
关键原因:支持头部和尾部的快速插入和删除操作。
应用场景:适用于消息队列、任务队列、日志记录等需要顺序处理的场景。 -
集合(Set):
关键原因:元素的唯一性、支持集合操作(交、并、差)。
应用场景:适用于标签系统、点赞/收藏系统、用户关注列表等需要去重或集合操作的场景。 -
有序集合(Sorted Set):
关键原因:元素的唯一性、支持按分数排序、支持范围查询。
应用场景:适用于排行榜、优先级队列、基于时间的统计等需要排序或按分数查询的场景。 -
位图(Bitmap):
- 关键原因:节省空间、支持位运算。
- 应用场景:适用于记录用户行为、打卡记录、统计在线用户、过滤器等需要位运算的场景。
-
地理位置(Geospatial):
关键原因:地理位置信息的存储和计算。
应用场景:适用于附近的人、地理位置排序、地理围栏等地理相关的应用。 -
流(Stream):
关键原因:支持多播、持久化、消费者组。
应用场景:适用于消息队列、事件日志、持久化数据流等需要处理流式数据的场景。