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-valueGET [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节点:只可读数据
哨兵监控
哨兵监控用于监控master节点,当master节点宕机,自动选取一个slave节点作为新的master节点