Redis:高性能内存数据库完全指南
一、Redis 简介
1.介绍
Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,是非关系型数据库,它可以用作数据库、缓存、消息队列等。
- REmote DIctionary Server(Redis) 是一个由 Salvatore Sanfilippo 写的 key-value 存储系统,是跨平台的非关系型数据库。
- Redis 是一个开源的使用 ANSI C 语言编写、遵守 BSD 协议、支持网络、可基于内存、分布式、可选持久性的键值对(Key-Value)存储数据库,并提供多种语言的 API。
- Redis 通常被称为数据结构服务器,因为值(value)可以是字符串(String)、哈希(Hash)、列表(list)、集合(sets)和有序集合(sorted sets)等类型。
2. Redis 支持多种数据结构
- 五种基本数据类型
1. 字符串(String)
- 基本的数据存储单元,可以存储字符串、整数或者浮点数。
2. 列表(List)
- 列表是一种有序的数据结构,可以存储多个元素,并且每个元素都有索引。
- 一个简单的列表,可以存储一系列的字符串元素。
3. 集合(Set)
- 集合是一种无序的数据结构,可以存储多个元素,并且每个元素不能重复。
4. 有序集合(Sorted Set)
- 类似于集合,但是每个元素都有一个分数(score)与之关联。
5. 哈希 (Hash)
- 一个键值对集合,可以存储多个字段。
- 五种高级数据类型
1. 消息队列 (Stream)
- 用于消息队列和日志存储,支持消息的持久化和时间排序
2. 地理空间 (Geospatial)
- 用于处理地理空间数据,如经纬度、距离计算等。
3. HyperLogLog
- 用于处理海量数据,如去重、计数等。
4. 位图 (Bitmap)
- 基于字符串类型,可以对每个位进行操作。
5. 位域 (Bitfield)
3. Redis 的优势
1. 性能极高
- Redis 以其极高的性能而著称,能够支持每秒数十万次的读写操作24。这使得Redis成为处理 高并发 请求的理想选择,尤其是在需要快速响应的场景中,如缓存、会话管理、排行榜等。
2. 数据类型丰富,单键值对最大支持512M大小的数据
- Redis 不仅支持基本的键值存储,还提供了丰富的数据类型,包括字符串、列表、集合、哈希表、有序集合等。这些数据类型为开发者提供了灵活的数据操作能力,使得Redis可以适应各种不同的应用场景。
3. 原子性操作:
-Redis 的所有操作都是原子性的,这意味着操作要么完全执行,要么完全不执行。这种特性对于确保数据的一致性和完整性至关重要,尤其是在高并发环境下处理事务时。
4. 持久化
- Redis 支持数据的持久化,可以将内存中的数据保存到磁盘中,以便在系统重启后恢复数据。这为 Redis 提供了数据安全性,确保数据不会因为系统故障而丢失。
5. 支持发布/订阅模式
- Redis 内置了发布/订阅模式(Pub/Sub),允许客户端之间通过消息传递进行通信。这使得 Redis 可以作为消息队列和实时数据传输的平台。
6. 单线程模型
- 尽管 Redis 是单线程的,但它通过高效的事件驱动模型来处理并发请求,确保了高性能和低延迟。单线程模型也简化了并发控制的复杂性。
7. 主从复制
- Redis 支持主从复制,可以通过从节点来备份数据或分担读请求,提高数据的可用性和系统的伸缩性。
8. 应用场景广泛
- Redis 被广泛应用于各种场景,包括但不限于缓存系统、会话存储、排行榜、实时分析、地理空间数据索引等。
9. 跨平台兼容性
- Redis 可以在多种操作系统上运行,包括 Linux、macOS 和 Windows,这使得它能够在不同的技术栈中灵活部署。
二、数据类型
1.字符串(string)
1. 创建键
- set key value
2. 获取键对应的值
- get key
- 注意:redis是区分大小写的
3. 删除key
- del key
4. 获取所有key
- keys *
- keys a* (获取所有以a开头的key)
5. 如果 set name 中文
- get name 获取到的值是是以二进制
- 需要 quit 退出,再 redis-cli --raw 进入
- 再次 get name 获取到的值是中文
6. ttl key
- 获取key的剩余时间
- -1 表示永久
- -2 键不存在
7. expire key time
- 设置key的过期时间
- 返回1表示成功
- 0表示失败
8. setex key value time
- 创建一个key,并设置过期时间
- 创建成功返回ok
9. setnx key value
- 只有当键不存在时,才创建并设置值
- 当键存在时,失败,返回 0
10. getrange key start end
- 获取指定范围的值
11. getset key value
- 设置值并返回旧值
12. getbit key offset
- 对key所存储的字符串值,获取指定偏移量上的位
13. setbit key offset value
- 对key所存储的字符串值,设置或清除指定偏移量上的位
14. setrange key start value
- 对key所存储的字符串值,设置指定偏移量上的值
15. strlen key
- 获取key所存储的字符串值的长度
16. mset key value [key value ...]
- 批量设置多个键值对
2.列表(list)
- 列表中的元素可以重复
1. lpush key value [value ...]
- 将一个或多个值插入到列表头部
2. rpush key value [value ...]
- 将一个或多个值插入到列表尾部
3. lrange key start stop
- 返回列表区间内元素,包含start和stop
4. lpop key [count]
- 移除并返回列表的count个元素,不加参数时,返回一个元素,如果列表为空,返回nil
5. rpop key [count]
- 移除并返回列表最后count个元素,不加参数时,返回一个元素,如果列表为空,返回nil
6. llen key
- 返回列表的长度
7. ltrim key start stop
3. 集合(Set)
- 是一种无序集合
- 集合中的元素不能重复
1. sadd key value [value ...]
- 添加一个或多个元素到集合中
2. smembers key
- 获取集合中的所有元素
3. sismember key value
- 判断元素是否在集合中
4. srem key value [value ...]
- 删除一个或多个元素
5. scard key
- 获取集合中的元素数量
4. 有序集合(SortedSet)
1. zadd key score member [score member ...]
- 添加一个或多个成员,并设置分数
2. zrange key start stop [withscores]
- 返回指定区间内的成员,可以指定是否返回分数
3. zscore key member
- 返回成员的分数
4. zrank key member
- 返回成员的排名,从0开始(从小到大排序)
5. zrevrank key member
- 倒序排名,从0开始(从大到小排序)
5. 哈希(Hash)
- 是一个string类型的field-value数据结构,特别适合用于存储对象
1. hset key field value
- 添加一个字段
- hmset key field value [field value ...]
- 添加多个字段
2. hget key field
- 获取字段的值
3. hgetall key
- 获取所有字段的field和value(成对出现的)
4. hdel key field [field ...]
- 删除一个或多个字段
5. hexists key field
- 判断字段是否存在
6. hkeys key
- 获取所有字段的field
7. hlen key
- 获取字段的数量
8. hvals key
- 获取所有字段的值
6. 消息队列(Stream)
- 5.0版本引入的
1. xadd key ID field value [field value ...]
- 添加一个或多个元素到流中
- id使用 * 表示自动生成
- 也可以自定义id,但是要保证自增性
2. slen key
- 获取流中的元素数量
3. xrange key start stop [count]
- 获取指定范围内的元素
- 例: xrange key - +
- 获取所有元素
4. xdel key ID [ID ...]
- 删除一个或多个元素
5. xtrim key maxlen [minid]
- 删除流中超出指定长度的元素
6. xread count count block timeout streams key count
- 读取多个流中的元素,如果读不到,阻塞timeout
7. xgroup create key groupid [MKSTREAM]
- 创建一个组
8. xinfo groups key
- 获取组的信息
9. xgroup createconsumer key groupid consumerid [idle]
- 创建一个消费者
10. xreadgroup groupid consumerid count count block timeout streams key count
- 读取多个流中的元素,如果读不到,阻塞timeout
7. 地理空间(Geospatial)
1. geoadd key longitude latitude member [longitude latitude member ...]
- 添加一个或多个成员,并设置经纬度
- 例如: geoadd city 116.397128 39.90923 "北京"
2. geopos key member [member ...]
- 获取成员的经纬度
3. geodist key member1 member2 [unit]
- 获取两个成员的距离
- unit 可选参数:m(米),km(千米),ft(英尺),nmi(英里)
4. geosearch key longitude latitude radius [unit] [withcoord] [withdist] [withhash] [count n] [asc|desc] [any]
8. HuperLogLog
- 一种做基数统计的算法
- 基数是集合中元素的个数,不考虑重复元素,只统计唯一值
- 例如:集合 {1,2,3,2,1} 基数是3(唯一元素是1,2,3)
1. pfadd key element [element ...]
- 添加一个或多个元素
- pfadd course git docker redis
3. pfcount key
- 获取基数
- pfcount course 3
4. pfmerage destkey sourcekey [sourcekey ...]
- 合并多个集合
- pfmerge course1 course2 course3
- course1集合的基数为course2+course3
9. 位图(Bitmap)
1. setbit key offset value
- 设置指定位置的值
2. getbit key offset
- 获取指定位置的值
3. set key value
- 可以通过set设置多个位
4. bitcount key
- 统计位图中1的个数
5. bitpos key key [start [end]]
- 获取指定值第一次出现的位置
10. 位域(Bitfield)
1. bitfield key offset value
- 设置或获取位
- offset: 位的偏移量
- value: 值
- 例如:
- bitfield player:1 set u8 #0 1
2. bitfield player:1 get u8 #0
- 获取位
3. bitfield player:1 incrby u8 #0 1
- 自增
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐


所有评论(0)