字符串
- 优点:简单、灵活,可以存储任意类型的数据,支持丰富的字符串操作命令。
- 应用场景:缓存、计数器、分布式锁、消息队列等。
- 底层数据结构:简单动态字符串(SDS)。
SET:设置指定键的字符串值。
代码语言:javascript复制SET key value
GET:获取指定键的字符串值。
代码语言:javascript复制GET key
DEL:删除指定键及其关联的字符串值。
代码语言:javascript复制DEL key [key ...]
INCR:将指定键的值递增 1。
代码语言:javascript复制INCR key
DECR:将指定键的值递减 1。
代码语言:javascript复制DECR key
INCRBY:将指定键的值增加指定的整数[浮点数]增量。
代码语言:javascript复制INCRBY[FLOAT] key increment
DECRBY:将指定键的值减去指定的整数减量。
代码语言:javascript复制DECRBY key decrement
APPEND:将指定值追加到指定键的字符串值的末尾。
代码语言:javascript复制APPEND key value
STRLEN:获取指定键的字符串值的长度。
代码语言:javascript复制STRLEN key
SETEX:设置指定键的字符串值,并指定过期时间(以秒为单位)。
代码语言:javascript复制SETEX key seconds value
位运算
GETSET:设置指定键的字符串值,并获取之前的值。
代码语言:javascript复制GETSET key value
SETBIT:设置指定位置的位值(0 或 1)。
代码语言:javascript复制SETBIT key offset value
GETBIT:获取指定位置的位值。
代码语言:javascript复制GETBIT key offset
BITCOUNT:计算指定键的字符串值中置为 1 的位的数量。
代码语言:javascript复制BITCOUNT key [start end]
BITOP:对多个键进行位运算,并将结果存储到指定的键中。
代码语言:javascript复制BITOP operation destkey key [key ...]
- operation 可以是 AND(按位与)、OR(按位或)、XOR(按位异或)或 NOT(按位取反)。
- destkey 是存储结果的键。
- key 是参与位运算的键。
BITFIELD:通过位域操作对指定键的字符串值进行复杂的位级操作。
代码语言:javascript复制BITFIELD key [GET type offset] [SET type offset value] [INCRBY type offset increment] [OVERFLOW WRAP|SAT|FAIL]
- GET:获取指定类型和偏移量的位域值。
- SET:设置指定类型和偏移量的位域值。
- INCRBY:将指定类型和偏移量的位域值增加指定的增量。
- OVERFLOW:指定位域操作的溢出策略。
散列类型
要使用字符串类型存储一个对象,那么需要将对象序列化成一个字符串来表达,但是这样无法提供对单个字段的操作,每次都需要将对象完整取出,这样十分消耗资源,同时字符串无法提供对单个字段的原子操作,容易产生条件竞争,因此可以使用散列类型存储。 Redis 的散列类型与关系型数据库的表的字段不同,对每一个对象可以单独设置其字段。
- 优点:适合存储对象,可以方便地对对象的字段进行读写操作。
- 应用场景:存储对象、缓存、存储用户信息等。
- 底层数据结构:哈希表(Hash Table)。
HSET:设置散列中指定字段的值。
代码语言:javascript复制HSET key field value
HGET:获取散列中指定字段的值。
代码语言:javascript复制HGET key field
HDEL:删除散列中一个或多个字段。
代码语言:javascript复制HDEL key field [field ...]
HEXISTS:检查散列中是否存在指定字段。
代码语言:javascript复制HEXISTS key field
HSETNX:字段不存在时赋值,如果不存在返回 1,否则返回 0
代码语言:javascript复制HSETNX key field value
HLEN:获取散列中字段的数量。
代码语言:javascript复制HLEN key
HKEYS:获取散列中所有字段的列表。
代码语言:javascript复制HKEYS key
HVALS:获取散列中所有值的列表。
代码语言:javascript复制HVALS key
HGETALL:获取散列中所有字段和值的列表。
代码语言:javascript复制HGETALL key
HMSET:同时设置散列中多个字段的值。
代码语言:javascript复制HMSET key field1 value1 [field2 value2 ...]
HMGET:获取散列中多个字段的值。
代码语言:javascript复制HMGET key field1 [field2 ...]
HINCRBY 增加数字
代码语言:javascript复制HINCRBY key field increment
列表类型
Redis 提供了一组用于操作列表(list)数据类型的命令。列表是一个有序的元素集合,可以在列表的两端进行插入、删除和访问操作。
- 优点:有序、可重复,支持快速的头尾插入、删除操作。
- 应用场景:消息队列、发布/订阅、最新消息列表等。
- 底层数据结构:双向链表(Linked List)和压缩列表(ZipList)。
以下是一些常用的 Redis 列表类型的命令:
LPUSH:将一个或多个值插入到列表的左侧(头部)。
代码语言:javascript复制LPUSH key value [value ...]
RPUSH:将一个或多个值插入到列表的右侧(尾部)。
代码语言:javascript复制RPUSH key value [value ...]
LPOP:移除并获取列表的左侧(头部)元素。
代码语言:javascript复制LPOP key
RPOP:移除并获取列表的右侧(尾部)元素。
代码语言:javascript复制RPOP key
LINDEX:获取列表中指定索引位置的元素值。
代码语言:javascript复制LINDEX key index
LLEN:获取列表的长度(元素个数)。
代码语言:javascript复制LLEN key
LRANGE:获取列表中指定范围的元素(包含 stop)。支持负索引,-1 表示倒数第一个元素,-2 表示倒数第二个。
代码语言:javascript复制LRANGE key start stop
LTRIM 用于修剪(Trim)列表的命令。它用于保留列表中指定范围内的元素,而将其它元素删除。
代码语言:javascript复制LTRIM key start stop
LREM:从列表中删除指定数量的匹配元素。count 为负数则取绝对值,为 0 则删除所有。
代码语言:javascript复制LREM key count value
LINSERT:在列表中指定元素的前面或后面插入一个新元素。
代码语言:javascript复制LINSERT key BEFORE|AFTER pivot value
LSET:设置列表中指定索引位置的元素值。
代码语言:javascript复制LSET key indexvalue
RPOPLPUSH 从一个列表的右侧(尾部)弹出一个元素,并将该元素推入到另一个列表的左侧(头部)。
代码语言:javascript复制RPOPLPUSH source destination
集合类型
Redis 提供了一种称为集合(Set)的数据类型,它是一个无序、唯一的元素集合,底层数据结构使用的是哈希表(Hash Table)。Redis 的集合提供了高效的成员检查和集合操作,例如并集、交集和差集等。
- 优点:无序、不重复,支持高效的成员判断和集合运算。
- 应用场景:标签系统、好友关系、共同兴趣等。
- 底层数据结构:哈希表(Hash Table)和跳跃表(Skip List)。
以下是一些常用的 Redis 集合类型的命令:
SADD:将一个或多个成员添加到集合中。
代码语言:javascript复制SADD key member [member ...]
SREM:从集合中移除一个或多个成员。
代码语言:javascript复制SREM key member [member ...]
SMEMBERS:获取集合中的所有成员。
代码语言:javascript复制SMEMBERS key
SISMEMBER:检查成员是否存在于集合中。
代码语言:javascript复制SISMEMBER key member
SCARD:获取集合中的成员数量。
代码语言:javascript复制SCARD key
SUNION:计算多个集合的并集。计算顺序,比如 SUNION A B C 是先计算 A 和 B 的并集,再计算结果和 C 的并集。
代码语言:javascript复制SUNION key [key ...]
SINTER:计算多个集合的交集。
代码语言:javascript复制SINTER key [key ...]
SDIFF:计算多个集合的差集。
代码语言:javascript复制SDIFF key [key ...]
还可以将集合运算的结果存储
代码语言:javascript复制SUNIONSTORE destination key [key ...]
SINTERSTORE destination key [key ...]
SDIFFSTORE destination key1 key2
SRANDMEMBER:随机获取集合中的一个或多个成员。
代码语言:javascript复制SRANDMEMBER key [count]
SPOP 用于随机移除并返回集合中一个或多个随机成员。
代码语言:javascript复制SPOP key [count]
有序集合
在 Redis 中,有序集合(Sorted Set)的底层数据结构是使用跳跃表(Skip List)和哈希表(Hash Table)的结合。
跳跃表是一种有序数据结构,类似于链表的结构,但通过添加多级索引(层级)来加快查找速度。每个节点都包含一个成员和对应的分数值,并通过指针连接到下一个节点和下一层的节点。通过跳跃表的层级结构,可以在平均时间复杂度为 O(logN)的情况下进行快速的范围查询、插入和删除操作。
然而,跳跃表并不适合高效地执行诸如按照成员进行查找的操作,因此在 Redis 中,为了提供更高效的成员查找功能,有序集合还使用了一个辅助的数据结构——哈希表。
有序集合常用于需要根据某个值进行排序和检索的场景。
- 优点:有序、不重复,可以对成员进行排序和范围查找,支持高效的排名和分数计算。
- 应用场景:排行榜、热门文章、按权重筛选数据等。
- 底层数据结构:跳跃表(Skip List)和哈希表(Hash Table)。
ZADD:向有序集合中添加一个或多个成员,每个成员都有一个分数值。
代码语言:javascript复制ZADD key score1 member1 [score2 member2 ...]
ZREM:从有序集合中移除一个或多个成员。
代码语言:javascript复制ZREM key member1 [member2 ...]
ZSCORE:获取有序集合中指定成员的分数。
代码语言:javascript复制ZSCORE key member
ZRANK:获取有序集合中指定成员的排名(按照分数从低到高排序)。
代码语言:javascript复制ZRANK key member
ZREVRANK:获取有序集合中指定成员的排名(按照分数从高到低排序)。
代码语言:javascript复制ZREVRANK key member
ZRANGE:按照排名范围获取有序集合中的成员(按照分数从低到高排序)。
代码语言:javascript复制ZRANGE key start stop [WITHSCORES]
ZREVRANGE:按照排名范围获取有序集合中的成员(按照分数从高到低排序)。
代码语言:javascript复制ZREVRANGE key start stop [WITHSCORES]
ZRANGEBYSCORE:按照分数范围获取有序集合中的成员。
代码语言:javascript复制ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]
ZREMRANGEBYRANK:根据成员的排名范围来移除有序集合中的成员。
代码语言:javascript复制ZREMRANGEBYRANK key start stop
ZREMRANGEBYSCORE:用于根据成员的分数范围来移除有序集合中的成员。
代码语言:javascript复制ZREMRANGEBYSCORE key min max
ZCOUNT:计算有序集合中指定分数范围内的成员数量。
代码语言:javascript复制ZCOUNT key min max
ZINCRBY:增加有序集合中指定成员的分数。
代码语言:javascript复制ZINCRBY key increment member
ZARD:获取集合中元素数量。
代码语言:javascript复制ZCARD key
ZINTERSTORE:计算一个或多个有序集合的交集,并将结果存储到一个新的有序集合中。
代码语言:javascript复制ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]
ZUNIONSTORE:计算一个或多个有序集合的并集,并将结果存储到一个新的有序集合中。
代码语言:javascript复制ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]
ZDIFFSTORE:计算一个有序集合与一个或多个有序集合的差集,并将结果存储到一个新的有序集合中。
代码语言:javascript复制ZDIFFSTORE destination numkeys key [key ...]
这几个集合运算命令的参数解释:
destination
:结果有序集合的键名。numkeys
:参与运算的有序集合数量。key
:参与运算的有序集合的键名。WEIGHTS weight [weight ...]
(可选):指定每个有序集合的权重,用于进行加权运算。AGGREGATE SUM|MIN|MAX
(可选):指定集合运算的聚合方式。