开始

Redis 是一个基于内存的非关系型数据库,使用 key-value 存储

Redis 支持以下的基本数据类型

  • String:字符串
  • Hash:散列
  • List:列表
  • Set:集合
  • Sorted Set:有序集合
  • bitmap:位图
  • bitfield:位域
  • GEO:地理空间
  • Stream:流

基本命令

安装 Redis 后,在命令行使用 redis-cli 命令连接到本地的 Redis 服务,添加 --raw 选项可原样显示中文

键命令用于管理 Redis 中的键,基本格式为

1
[COMMAND] [KEY] [VALUE]

常用命令

  • DEL [KEY]:删除一个键
  • EXISTS [KEY]:查看键是否存在
  • KEYS [PATTERN]:查找给定模式的键,支持 *?[] 三种通配符
  • RENAME [KEY] [NAME]:修改键名
  • TYPE [KEY]:查看键对应值的类型
  • EXPIRE [KEY] [SECONDS]:设置键的过期时间,以秒为单位
  • TTL [KEY]:查看键的剩余时间
  • PERSIST [KEY]:删除键的过期时间

更多命令见:Commands

数据类型

redis 支持字符串、列表、集合、有序集合、哈希、bitmap 等类型,每种类型有对应的操作命令

字符串

字符串命令操作的数据是 String 类型

  • SET [KEY] [VALUE]:设置一个 key-value
  • GET [KEY]:查看键对应的值

列表

列表命令操作的数据是 List 类型,以 L 开头的命令表示处理列表的起始位置,以 R 开头的命令表示处理列表的末尾位置

  • [LPUSH | RPUSH] [KEY] [VALUE...]:在起始或末尾添加元素
  • [LPOP | RPOP] [KEY] [COUNT]:删除起始或末尾的指定个数的元素
  • LRANGE [KEY] [START] [END]:返回列表中指定范围的元素,起始从 0 开始,支持负数索引
  • LTRIM [KEY] [START] [END]:保留列表中指定范围内的元素

集合

集合命令操作的数据是 Set 类型,数据无序且唯一,集合命令都是以 S 开头

  • SADD [KEY] [VALUE...]:将元素添加到集合中
  • SCARD [KEY]:查看集合中的元素个数
  • SMEMBERS [KEY]:查看集合中的元素
  • SISMEMBERS [KEY] [VALUE]:判断元素是否在集合中
  • SREM [KEY] [VALUE]:删除集合中的元素

有序集合

有序集合命令操作的数据是 Sorted Set 类型,数据有序且唯一,有序集合命令都是以 Z 开头

  • ZADD [KEY] [VALUE SCORE...]:将元素添加到集合中,添加时每个值附带一个分数 Score,用于在有序集合中排序,Score 必须是一个表示数值的字符串
  • ZRANGE [KEY] [START] [END] [WITHSCORES]:查看集合中指定范围的元素,添加 WITHSCORES 选项会同时输出分数
  • ZSCORE [KEY] [VALUE]:查看集合中元素的分数
  • ZRANK [KEY] [VALUE]:查看集合中元素的升序排名
  • ZREVRANK [KEY] [VALUE]:查看集合中元素的降序排名
  • ZREM [KEY] [VALUE]:删除集合中的元素

Hash

redis 中 Hash 可以表示一个键值对的集合,Hash 命令都是以 H 开头

  • HSET [KEY] [HASH_KEY] [HASH_VALUE]:将键值对添加到 Hash 中
  • HGET [KEY] [HASH_KEY]:获取 Hash 中的键值
  • HGETALL [KEY]:获取 Hash 中的所有键值
  • HDEL [KEY] [HASH_KEY]:删除 Hash 中的键值
  • HEXISTS [KEY] [HASH_KEY]:判断 Hash 中键是否存在
  • HKEYS [KEY]:获取 Hash 中的所有键
  • HLEN [KEY]:获取 Hash 中的键值对数量

bitmap

bitmap 位图表示一个仅有 0 和 1 的二进制数组,可存储大量二元状态,需要通过偏移量获取值

  • SETBIT [KEY] [OFFSET] [VALUE]:设置 bitmap 指定位置的值
  • GETBIT [KEY] [OFFSET]:获取 bitmap 指定位置的值
  • BITCOUNT [KEY] [START] [END]:获取 bitmap 指定范围内 1 的个数

bitfield

bitfield 位域命令将字符串和数值作为二进制串处理,可以对该二进制串中的任意一个或多个位进行修改

  • BITFIELD [KEY] GET [TYPE] [OFFSET]:从指定位置开始,获取指定类型范围的二进制值
  • BITFIELD [KEY] SET [TYPE] [OFFSET] [VALUE]:从指定位置开始,设置指定类型范围的二进制值
  • BITFIELD [KEY] INCRBY [TYPE] [OFFSET] [INCREMENT]:从指定位置开始,对指定类型范围的二进制值做加法

HyperLogLog

HyperLogLog 可以计算集合的基数,通过牺牲一定的精确度换取非常小的内存占用

  • PFADD [KEY] [VALUE...]:将元素添加到 HyperLogLog 中
  • PFCOUNT [KEY]:获取集合的基数估算值
  • PFMERGE [DEST_KEY] [SRC_KEY...]:合并多个 HyperLogLog,基数由多个集合的并集计算得到

GEO

GEO 用于存储地理位置信息,一个坐标点用 (经度, 纬度, 名称) 来表示

  • GEOADD [KEY] [LONGITUDE LATITUDE MEMBER...]:添加坐标点
  • GEOPOS [KEY] [MEMBER]:获取坐标点的坐标
  • GEODIST [KEY] [MEMBER1] [MEMBER2]:计算两个坐标点之间的距离
  • GEORADIUS [KEY] [LONGITUDE] [LATITUDE] [RADIUS]:获取指定经纬度为中心,指定半径内的坐标点
  • GEORADIUSBYMEMBER [KEY] [MEMBER] [RADIUS]:获取指定坐标点为中心,指定半径内的坐标点
  • GEOHASH [KEY] [MEMBER...]:获取坐标点的 GEOHash 值

Stream

Stream 用于消息队列,使用 redis 的发布订阅模式可以实现简单的消息队列功能,但缺点是消息无法持久化,Stream 提供了消息的持久化和主从复制功能

  • Message Content:消息内容,每个消息都有一个唯一 ID 和对应的消息内容
  • Consumer Group:消费组,一个消费组中包含多个消费者 Consumer
  • Last_delivered_id:游标,每个消费组内都有一个游标,当消费者读取消息,游标向前移动
  • Pending_ids:记录了当前已经被客户端读取,但没有收到 ACK 的消息 id

常用命令见:Redis Stream

持久化

redis 持久化将内存中的数据写入磁盘,使得断电恢复后依然可以使用内存中缓存的数据

redis 的持久化主要有两种方式

  • RDB:将缓存数据的快照保存到 dump.rdb 文件中
  • AOF:将执行过的写指令记录到文件中,在数据库恢复时,重新执行记录的指令

更多操作见文档:Redis persistence

事务

redis 事务相比关系型数据库事务,仅仅是能够隔离地执行一系列指令,不具有隔离级别、不能保证原子性

1
2
3
4
5
6
7
8
9
> MULTI
OK
> INCR foo
QUEUED
> INCR bar
QUEUED
> EXEC
1) (integer) 1
2) (integer) 1

文档见:Transactions

管道

redis 是一种基于客户端 - 服务端模型以及请求/响应协议的 TCP 服务

  • 客户端向服务端发送一个查询请求,并监听 Socket 返回,通常是以阻塞模式,等待服务端响应
  • 服务端处理命令,并将结果返回给客户端

管道用于在服务端和客户端之间连续执行大量命令,可以减少 RTT

文档见:Redis pipelining

发布订阅模式

redis 提供了发布订阅功能

  • PUBLISH [CHANNEL] [MESSAGE]:向指定通道发布一个消息
  • SUBSCRIBE [CHANNEL]:订阅一个通道

文档见:Redis Pub/Sub

主从复制

主从复制实现了 redis 的高可用性,使用一个 redis 节点作为 master 节点,其余作为 slave 节点,一个 master 节点可有多个 slave 节点,

  • master 节点:可读写数据,每次执行写数据,都会自动同步到 slave 节点
  • slave 节点:只可读数据

文档见:Redis replication

哨兵监控

哨兵监控用于监控 master 节点,当 master 节点宕机,自动选取一个 slave 节点作为新的 master 节点

文档见:High availability with Redis Sentinel