一、Redis中常见的数据类型
在 Redis 中,常见的数据类型有以下几种,每种都有其适用的使用场景和操作命令:
1. String(字符串)
概述:
- Redis 中最基本的数据类型。
- 可以存储字符串、整数、浮点数等。
典型用途:
- 缓存用户信息、令牌、配置项。
- 计数器(
INCR
、DECR
)。
常用命令:
SET key value
GET key
INCR key
APPEND key value
2. List(列表)
概述:
- 双端链表结构。
- 元素按插入顺序排列,支持从两端插入和读取。
典型用途:
- 消息队列(例如:任务队列)。
- 时间线/评论列表等。
常用命令:
LPUSH key value
(从左插入)RPUSH key value
(从右插入)LPOP key
/RPOP key
(从左/右弹出)LRANGE key start stop
(获取区间元素)
3. Set(集合)
概述:
- 无序、不重复的字符串集合。
典型用途:
- 共同好友、标签、唯一值集合等。
- 去重功能。
常用命令:
SADD key member
SREM key member
SMEMBERS key
SINTER key1 key2
(求交集)SUNION key1 key2
(求并集)SDIFF key1 key2
(求差集)
4. Hash(哈希)
概述:
- 类似于 Python 的字典(map),字段-值对的集合。
- 每个 hash 是一个 key,内部可以存多个字段。
典型用途:
- 存储用户对象、商品信息等结构化数据。
常用命令:
HSET key field value
HGET key field
HGETALL key
HDEL key field
5. Sorted Set(有序集合,ZSet)
概述:
- 每个元素关联一个分数(score),按分数自动排序。
- 元素唯一,分数可重复。
典型用途:
- 排行榜、时间排序、优先级队列。
常用命令:
ZADD key score member
ZRANGE key start stop [WITHSCORES]
ZREVRANGE key start stop
ZRANK key member
(获取排名)ZREM key member
6. Bitmap(位图)
概述:
- 用于位级别操作的结构,基于 String 实现。
典型用途:
- 活跃用户打点、签到系统。
常用命令:
SETBIT key offset value
GETBIT key offset
BITCOUNT key
7. HyperLogLog
概述:
- 近似去重统计结构,用于估算不重复元素的数量。
- 精度约 0.81%,非常节省内存(~12KB)。
典型用途:
- UV(独立访客)、IP 去重统计。
常用命令:
PFADD key element
PFCOUNT key
PFMERGE destkey key1 key2
8. Geo(地理空间)
概述:
- 存储经纬度坐标并进行地理计算(基于 ZSet 实现)。
典型用途:
- 附近的人、地图服务、距离排序。
常用命令:
GEOADD key longitude latitude member
GEORADIUS key longitude latitude radius m|km|mi|ft
GEODIST key member1 member2
9. Stream(流)
概述:
- 消息队列类型,支持消费组等复杂消费模式。
典型用途:
- 日志收集、事件流、消息系统。
常用命令:
XADD key * field value [field2 value2 ...]
XRANGE key start end
XREAD [GROUP group consumer] STREAMS key ID
XACK key group id
二、Redis快速的原因
- Redis将数据存储在内存,有着快速的读写速度,相比传统的数据库,内存访问速度快很多。
- Redis使用单线程模型结合了epoll这样的IO多路复用机制,避免了上下文切换和竞争,提高了并发效率。
- Redis提供多种高效的数据结构,这些结构经过优化,能搞快速完成各种操作。
- Redis的核心功能比数据库的核心功能更简单。
三、Redis设计为单线程,6.0版本引入多线程的原因
设计为单线程的原因:
- Redis大部分操作是基于内存的,性能瓶颈不在于CPU。
- 使用单线程模型,减少了线程上下文切换造成的性能开销。
- Redis在单线程情况下,使用I/O多路复用模型,可以提高I/O利用率
6.0以后引入多线程的原因:
单线程只进行数据的读写操作,不存在线程不安全的问题;数据规模的提升,请求量提升,执行的瓶颈在于网络I/O,引用多线程可以提高I/O处理速度。