一、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
    - 自增

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐