文章

Redis基础

开始

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提供了消息的持久化和主从复制功能

img

  • 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

本文由作者按照 CC BY 4.0 进行授权