数据结构
1. 字符串(string)
特点:
- 字符串是 Redis 中最基本的数据结构,可以存储常见的字符串、整数和浮点数等类型的数据。
- Redis 中的字符串最大长度为 512 MB。
- Redis 中的字符串支持一些特殊的操作,例如追加、自增、自减、获取子串等。
应用场景:
- 缓存
- 计数器
- 分布式锁
命令示例:
SET name "Tom"
GET name
操作命令:
- SET:设置键值对,语法为 SET key value,可以设置字符串、整数和浮点数类型的值。
- GET:获取键的值,语法为 GET key。
其他常用的命令包括 INCR、DECR、APPEND、GETRANGE >等。
2. 列表(list)
特点:
- 列表是一种有序的字符串数组,支持在两端进行插入和删除操作。
- Redis 中的列表可以用来实现队列、栈、阻塞队列等。
- Redis 中的列表最大长度为 232-1 (4294967295) 个元素。
应用场景:
- 消息队列
- 阻塞队列
- 任务队列
示例:
LPUSH names "Tom"
LPUSH names "Jerry"
RPUSH names "Micky"
LPOP names
RPOP names
操作命令:
- LPUSH:将一个或多个值插入到列表头部,语法为 LPUSH key value1 [value2 ...]。
- RPUSH:将一个或多个值插入到列表尾部,语法为 RPUSH key value1 [value2 ...]。
- LPOP:移除并返回列表的第一个元素,语法为 LPOP key。
- RPOP:移除并返回列表的最后一个元素,语法为 RPOP key。
其他常用的命令包括 LINDEX、LLEN、LRANGE、LINSERT 等。
3. 集合(set)
特点:
- 集合是一种无序的字符串集合,支持去重、交集、并集和差集等操作。
- Redis 中的集合底层实现为哈希表,查找、插入和删除操作的时间复杂度为 O(1)。
- Redis 中的集合最大长度为 232-1 (4294967295) 个元素。
应用场景:
- 去重
- 共同好友查找
- 点赞、收藏等功能的实现
示例:
:
SADD fruits "apple"
SADD fruits "orange"
SADD fruits "banana"
SMEMBERS fruits
操作命令:
- SADD:向集合中添加一个或多个元素,语法为 SADD key member1 [member2 ...]。
- SMEMBERS:返回集合中的所有元素,语法为 SMEMBERS key。
- SINTER:返回多个集合的交集,语法为 SINTER key1 [key2 ...]。
- SUNION:返回多个集合的并集,语法为 SUNION key1 [key2 ...]。
- SDIFF:返回多个集合的差集,语法为 SDIFF key1 [key2 ...]。
其他常用的命令包括 SCARD、SISMEMBER、SREM、SMOVE 等。
4. 散列表(hash)
特点:
- 散列表是一种键值对集合,可以实现类似于 Java 中的 Map 功能。
- Redis 中的散列表支持添加、删除和修改操作,并且可以高效地进行查找操作。
- Redis 中的散列表最大长度为 232-1 (4294967295) 个键值对。
示例:
HSET user id 1 name "Tom" age 20
HGETALL user
操作命令:
- HSET:设置散列表中的一个键值对,语法为 HSET key field value。
- HGETALL:返回散列表中的所有键值对,语法为 HGETALL key。
- HDEL:删除散列表中的一个或多个键值对,语法为 HDEL key field1 [field2 ...]。
- HKEYS:返回散列表中的所有键,语法为 HKEYS key。
- HVALS:返回散列表中的所有值,语法为 HVALS key。
其他常用的命令包括 HGET、HINCRBY、HEXISTS、HLEN 等。
应用场景:
- 用户信息存储
- 商品信息存储
- 博客文章信息存储
5. 有序集合(sorted set)
特点:
- 有序集合是一种有序的字符串集合,可以实现排行榜和计数器等功能。
- Redis 中的有序集合底层实现为跳跃表和哈希表,支持高效地添加、删除和查找操作。
- Redis 中的有序集合最大长度为 232-1 (4294967295) 个元素。
应用场景:
- 排行榜
- 热门文章列表
- 计数器
示例:
ZADD scores 100 "Tom"
ZADD scores 90 "Jerry"
ZADD scores 80 "Micky"
ZRANGE scores 0 -1 WITHSCORES
操作命令:
- ZADD:向有序集合中添加一个或多个成员,语法为 ZADD key score1 member1 [score2 member2 ...]。
- ZRANGE:返回有序集合中指定范围内的成员,语法为 ZRANGE key start stop [WITHSCORES]。
- ZRANK:返回有序集合中成员的排名,语法为 ZRANK key member。
- ZINCRBY:对有序集合中的一个成员的分数进行自增操作,语法为 ZINCRBY key increment member。
- ZREVRANGE:返回有序集合中指定范围内的成员,按分数从大到小排序,语法为 ZREVRANGE key start stop [WITHSCORES]。
其他常用的命令包括 ZSCORE、ZCARD、ZREM、ZINTERSTORE、ZUNIONSTORE 等。
其他数据结构
Bitmap 是一种用于存储二进制数据的数据结构,它可以用于实现一些高效的算法,例如布隆过滤器和计数器。在 Redis 中,Bitmap 可以用于存储用户在线状态、用户喜好等数据。
HyperLogLog 是一种用于处理基数问题(即不重复元素数量的问题)的数据结构,它的空间复杂度很小,但是准确性和可靠性都很高。在 Redis 中,HyperLogLog 可以用于统计网站的独立访客数量、统计用户的活跃度等。
GEO 是一种用于处理地理位置数据的数据结构,它可以将地理位置表示为经纬度坐标,并支持一些常见的地理位置操作,例如计算两点之间的距离、查找某个区域内的所有位置等。在 Redis 中,GEO 可以用于实现地理位置服务、附近的人功能等。
以下是一些 Redis 中使用 Bitmap、HyperLogLog、GEO 操作命令的示例:
- Bitmap 操作命令:
- SETBIT key offset value:将 key 对应的 Bitmap 中的第 offset 位设置为 value。
- GETBIT key offset:获取 key 对应的 Bitmap 中的第 offset 位的值。
- BITCOUNT key [start end]:统计 key 对应的 Bitmap 中值为 1 的位数。如果指定了 start 和 end 参数,则统计指定区间内的位数。
- SETBIT key offset value:将 key 对应的 Bitmap 中的第 offset 位设置为 value。
> SETBIT mybitmap 0 1
(integer) 0
> SETBIT mybitmap 2 1
(integer) 0
> SETBIT mybitmap 4 1
(integer) 0
> GETBIT mybitmap 0
(integer) 1
> GETBIT mybitmap 1
(integer) 0
- GETBIT key offset:获取 key 对应的 Bitmap 中的第 offset 位的值。
> SETBIT mybitmap 0 1
(integer) 0
> SETBIT mybitmap 2 1
(integer) 0
> SETBIT mybitmap 4 1
(integer) 0
> GETBIT mybitmap 0
(integer) 1
> GETBIT mybitmap 1
(integer) 0
- BITCOUNT key [start end]:统计 key 对应的 Bitmap 中值为 1 的位数。如果指定了 start 和 end 参数,则统计指定区间内的位数。
> SETBIT mybitmap 0 1
(integer) 0
> SETBIT mybitmap 2 1
(integer) 0
> SETBIT mybitmap 4 1
(integer) 0
> BITCOUNT mybitmap
(integer) 3
> BITCOUNT mybitmap 0 1
(integer) 1
- HyperLogLog 操作命令:
- PFADD key element [element ...]:将一个或多个元素添加到 key 对应的 HyperLogLog 中。
- PFCOUNT key [key ...]:统计一个或多个 HyperLogLog 中的基数。
- PFMERGE destkey sourcekey [sourcekey ...]:将多个 HyperLogLog 合并为一个 HyperLogLog。
- PFADD key element [element ...]:将一个或多个元素添加到 key 对应的 HyperLogLog 中。
> PFADD myhyperloglog a b c d e
(integer) 1
> PFADD myhyperloglog e f g h i
(integer) 1
> PFCOUNT myhyperloglog
(integer) 9
- PFCOUNT key [key ...]:统计一个或多个 HyperLogLog 中的基数。
> PFADD myhyperloglog a b c d e
(integer) 1
> PFADD myhyperloglog e f g h i
(integer) 1
> PFCOUNT myhyperloglog
(integer) 9
> PFCOUNT myhyperloglog1 myhyperloglog2
(integer) 0
- PFMERGE destkey sourcekey [sourcekey ...]:将多个 HyperLogLog 合并为一个 HyperLogLog。
> PFADD myhyperloglog1 a b c d e
(integer) 1
> PFADD myhyperloglog2 e f g h i
(integer) 1
> PFMERGE myhyperloglog myhyperloglog1 myhyperloglog2
OK
> PFCOUNT myhyperloglog
(integer) 9
- GEO 操作命令:
- GEOADD key longitude latitude member [longitude latitude member ...]:将一个或多个地理位置添加到 key 对应的 GEO 中。
- GEODIST key member1 member2 [unit]:计算 key 对应的 GEO 中 member1 和 member2 之间的距离。可选的单位包括 m(米)、km(千米)、mi(英里)和 ft(英尺)。
- GEORADIUS key longitude latitude radius m|km|mi|ft [WITHCOORD] [WITHDIST] [ASC|DESC] [COUNT count]:查找 key 对应的 GEO 中给定经纬度坐标附近的位置。可选的参数包括半径、单位、是否返回坐标、是否返回距离、排序顺序和返回结果数量。
- GEOADD key longitude latitude member [longitude latitude member ...]:将一个或多个地理位置添加到 key 对应的 GEO 中。
> GEOADD mygeo 116.48105 39.996794 "北京"
(integer) 1
> GEOADD mygeo 121.473701 31.230416 "上海" 114.305392 30.592849 "武汉"
(integer) 2
- GEODIST key member1 member2 [unit]:计算 key 对应的 GEO 中 member1 和 member2 之间的距离。可选的单位包括 m(米)、km(千米)、mi(英里)和 ft(英尺)。
> GEOADD mygeo 116.48105 39.996794 "北京"
(integer) 1
> GEOADD mygeo 121.473701 31.230416 "上海" 114.305392 30.592849 "武汉"
(integer) 2
> GEODIST mygeo "北京" "上海" km
"1068.9881"
- GEORADIUS key longitude latitude radius m|km|mi|ft [WITHCOORD] [WITHDIST] [ASC|DESC] [COUNT count]:查找 key 对应的 GEO 中给定经纬度坐标附近的位置。可选的参数包括半径、单位、是否返回坐标、是否返回距离、排序顺序和返回结果数量。
> GEOADD mygeo 116.48105 39.996794 "北京"
(integer) 1
> GEOADD mygeo 121.473701 31.230416 "上海" 114.305392 30.592849 "武汉"
(integer) 2
> GEORADIUS mygeo 116.48105 39.996794 1000 km WITHDIST WITHCOORD
1) 1) "北京"
2) "0.0000"
3) 1) "116.48105096817017"
2) "39.99679395993592"
总结
Redis 支持多种数据结构和操作命令,可以根据不同的业务需求选择合适的数据结构和命令。在实际应用过程中,需要结合具体的业务需求和数据特点进行选择和使用。