Redis思维导图
2021-01-21 21:53:02 7 举报
AI智能生成
Redis思维导图
作者其他创作
大纲/内容
特性及应用场景
特性
文件事件处理器:单线程
内存操作
支持数据持久化
非阻塞IO(epoll),IO多路复用
支持事务
应用场景
缓存
队列
网站访问统计
分布式Session
应用排行榜
社交关系图
日活/月活记录,用户签到,用户在线状态
版本新特性
2.8
主从断线重连后采取部分复制(Psync)
Redis Sentinel Stable
3.0
Redis Cluster
3.2
GEO
4.0
提供模块系统方便第三方拓展
非阻塞del和flushall/flushdb功能
RDB和AOF混合持久化模式
Redis Cluster兼容NAT和Docker
5.0
新数据类型Stream(借鉴了Kafka的设计,消息可持久化)
新Redis模块API:Timers and Cluster API
RDB现在存储LFU和LRU信息
集群管理器从Ruby(redis-trib.rb)改成C重写
新sorted set命令:ZPOPMIN/MAX和阻塞变量
主动碎片整理
增强HyperLogLog实现
内存统计报告更直观
Jemalloc升级到5.1版
数据结构及内部编码
基本数据类型
字符串(String)
基础知识
整型(int)
embstr编码的简单动态字符串
简单动态字符串
常用命令
SET
为一个key设置value,可以配合EX/PX参数指定key的有效期,通过NX/XX参数针对key是否存在的情况进行区别操作,时间复杂度O(1)
GET
获取某个key对应的value,时间复杂度O(1)
SETNX
只有在 key 不存在时设置 key 的值。返回1表示设置成功,0表示设置失败
SETEX
SETEX key seconds value 将值 value 关联到 key ,并将 key 的过期时间设为 seconds (以秒为单位)。
GETSET
为一个key设置value,并返回该key的原value,时间复杂度O(1)
MSET
同时设置一个或多个 key-value 对。
MSETNX
同时设置一个或多个 key-value 对,当且仅当所有给定 key 都不存在。
MGET
获取所有(一个或多个)给定 key 的值
INCR
将 key 中储存的数字值增一。
INCRBY
将 key 所储存的值加上给定的增量值(increment)
DECR
将 key 中储存的数字值减一。
DECRBY
key 所储存的值减去给定的减量值(decrement) 。
APPEND
如果 key 已经存在并且是一个字符串, APPEND 命令将指定的 value 追加到该 key 原来值(value)的末尾。
列表(List)
基础知识
链表(Linkedlist)
快速列表(Quicklist)
常用命令
LINDEX key index
通过索引获取列表中的元素
LINSERT key BEFORE|AFTER pivot value
通过索引获取列表中的元素
LLEN key
获取列表长度
LPOP key
移出并获取列表的第一个元素
LPUSH key value1 [value2]
将一个或多个值插入到列表头部
LPUSHX key value
将一个值插入到已存在的列表头部
LRANGE key start stop
获取列表指定范围内的元素
LREM key count value
移除列表元素
LSET key index value
通过索引设置列表元素的值
LTRIM key start stop
对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除。
RPOP key
移除列表的最后一个元素,返回值为移除的元素。
RPOPLPUSH source destination
移除列表的最后一个元素,并将该元素添加到另一个列表并返回
RPUSH key value1 [value2]
在列表中添加一个或多个值
RPUSHX key value
为已存在的列表添加值
BLPOP key1 [key2 ] timeout
移出并获取列表的第一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
BRPOP key1 [key2 ] timeout
移出并获取列表的最后一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
BRPOPLPUSH source destination timeout
从列表中弹出一个值,将弹出的元素插入到另外一个列表中并返回它; 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
哈希(Hash)
基础知识
哈希表(Hashtable)
压缩表(Ziplist)
常用命令
HDEL key field1 [field2]
删除一个或多个哈希表字段
HEXISTS key field
查看哈希表 key 中,指定的字段是否存在。
HGET key field
获取存储在哈希表中指定字段的值。
HGETALL key
获取在哈希表中指定 key 的所有字段和值
HINCRBY key field increment
为哈希表 key 中的指定字段的整数值加上增量 increment 。
HINCRBYFLOAT key field increment
为哈希表 key 中的指定字段的浮点数值加上增量 increment 。
HKEYS key
获取所有哈希表中的字段
HLEN key
获取哈希表中字段的数量
HMGET key field1 [field2]
获取所有给定字段的值
HMSET key field1 value1 [field2 value2 ]
同时将多个 field-value (域-值)对设置到哈希表 key 中。
HSET key field value
将哈希表 key 中的字段 field 的值设为 value 。
HSETNX key field value
只有在字段 field 不存在时,设置哈希表字段的值。
HVALS key
获取哈希表中所有值
HSCAN key cursor [MATCH pattern] [COUNT count]
迭代哈希表中的键值对。
集合(Set)
基础知识
整型集合(intset)
哈希表(Hashtable)
常用命令
SADD key member1 [member2]
向集合添加一个或多个成员
SCARD key
获取集合的成员数
SDIFF key1 [key2]
返回第一个集合与其他集合之间的差异。
SDIFFSTORE destination key1 [key2]
返回给定所有集合的差集并存储在 destination 中
SINTER key1 [key2]
返回给定所有集合的交集
SINTERSTORE destination key1 [key2]
返回给定所有集合的交集并存储在 destination 中
SISMEMBER key member
判断 member 元素是否是集合 key 的成员
SMEMBERS key
返回集合中的所有成员
SMOVE source destination member
将 member 元素从 source 集合移动到 destination 集合
SPOP key
移除并返回集合中的一个随机元素
SRANDMEMBER key [count]
返回集合中一个或多个随机数
SREM key member1 [member2]
移除集合中一个或多个成员
SUNION key1 [key2]
返回所有给定集合的并集
SUNIONSTORE destination key1 [key2]
所有给定集合的并集存储在 destination 集合中
SSCAN key cursor [MATCH pattern] [COUNT count]
迭代集合中的元素
有序集合(Zset)
基础知识
压缩表(Ziplist)
跳跃表(Skiplist)
常用命令
ZADD key score1 member1 [score2 member2]
向有序集合添加一个或多个成员,或者更新已存在成员的分数
ZCARD key
获取有序集合的成员数
ZCOUNT key min max
计算在有序集合中指定区间分数的成员数
ZINCRBY key increment member
有序集合中对指定成员的分数加上增量 increment
ZINTERSTORE destination numkeys key [key ...]
计算给定的一个或多个有序集的交集并将结果集存储在新的有序集合 destination 中
ZLEXCOUNT key min max
在有序集合中计算指定字典区间内成员数量
ZRANGE key start stop [WITHSCORES]
通过索引区间返回有序集合指定区间内的成员
ZRANGEBYLEX key min max [LIMIT offset count]
通过字典区间返回有序集合的成员
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT]
通过分数返回有序集合指定区间内的成员
ZRANK key member
返回有序集合中指定成员的索引
ZREM key member [member ...]
移除有序集合中的一个或多个成员
ZREMRANGEBYLEX key min max
移除有序集合中给定的字典区间的所有成员
ZREMRANGEBYRANK key start stop
移除有序集合中给定的排名区间的所有成员
ZREMRANGEBYSCORE key min max
移除有序集合中给定的分数区间的所有成员
ZREVRANGE key start stop [WITHSCORES]
返回有序集中指定区间内的成员,通过索引,分数从高到低
ZREVRANGEBYSCORE key max min [WITHSCORES]
返回有序集中指定分数区间内的成员,分数从高到低排序
ZREVRANK key member
返回有序集合中指定成员的排名,有序集成员按分数值递减(从大到小)排序
ZSCORE key member
返回有序集中,成员的分数值
ZUNIONSTORE destination numkeys key [key ...]
计算给定的一个或多个有序集的并集,并存储在新的 key 中
ZSCAN key cursor [MATCH pattern] [COUNT count]
迭代有序集合中的元素(包括元素成员和元素分值)
其他数据类型
Bitmap
基础知识
Bitmap在Redis中不是一种实际的数据类型,而是一种将String作为Bitmap使用的方法。可以理解为将String转换为bit数组。使用Bitmap来存储true/false类型的简单数据极为节省空间。
常用命令
SETBIT key offset value
设置或者清空key的value(字符串)在offset处的bit值(只能只0或者1)。
GETBIT
BITCOUNT
BITOP operation destkey key [key ...]
说明:对一个或多个保存二进制位的字符串 key 进行位元操作,并将结果保存到 destkey 上。
说明:BITOP 命令支持 AND 、 OR 、 NOT 、 XOR 这四种操作中的任意一种参数
Hyperloglog
基础知识
HyperLogLog 是用来做基数统计的算法,HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定 的、并且是很小的。
在 Redis 里面,每个 HyperLogLog 键只需要花费 12 KB 内存,就可以计算接近 2^64 个不同元素的基 数。这和计算基数时,元素越多耗费内存就越多的集合形成鲜明对比。
但是,因为 HyperLogLog 只会根据输入元素来计算基数,而不会储存输入元素本身,所以 HyperLogLog 不能像集合那样,返回输入的各个元素。
在 Redis 里面,每个 HyperLogLog 键只需要花费 12 KB 内存,就可以计算接近 2^64 个不同元素的基 数。这和计算基数时,元素越多耗费内存就越多的集合形成鲜明对比。
但是,因为 HyperLogLog 只会根据输入元素来计算基数,而不会储存输入元素本身,所以 HyperLogLog 不能像集合那样,返回输入的各个元素。
常用命令
PFADD key element [element ...]
添加指定元素到 HyperLogLog 中。
PFCOUNT key [key ...]
返回给定 HyperLogLog 的基数估算值。
PFMERGE destkey sourcekey [sourcekey ...]
将多个 HyperLogLog 合并为一个 HyperLogLog
GEOspatial
基础知识
Redis GEO 主要用于存储地理位置信息,并对存储的信息进行操作,该功能在 Redis 3.2 版本新增。
常用命令
geoadd:添加地理位置的坐标。
geopos:获取地理位置的坐标。
geodist:计算两个位置之间的距离。
georadius:根据用户给定的经纬度坐标来获取指定范围内的地理位置集合。
georadiusbymember:根据储存在位置集合里面的某个地点获取指定范围内的地理位置集合。
geohash:返回一个或多个位置对象的 geohash 值
Stream
基础知识
Redis Stream 是 Redis 5.0 版本新增加的数据结构。
Redis Stream 主要用于消息队列(MQ,Message Queue),Redis 本身是有一个 Redis 发布订阅 (pub/sub) 来实现消息队列的功能,但它有个缺点就是消息无法持久化,如果出现网络断开、Redis 宕机等,消息就会被丢弃。
简单来说发布订阅 (pub/sub) 可以分发消息,但无法记录历史消息。
而 Redis Stream 提供了消息的持久化和主备复制功能,可以让任何客户端访问任何时刻的数据,并且能记住每一个客户端的访问位置,还能保证消息不丢失。
Redis Stream 主要用于消息队列(MQ,Message Queue),Redis 本身是有一个 Redis 发布订阅 (pub/sub) 来实现消息队列的功能,但它有个缺点就是消息无法持久化,如果出现网络断开、Redis 宕机等,消息就会被丢弃。
简单来说发布订阅 (pub/sub) 可以分发消息,但无法记录历史消息。
而 Redis Stream 提供了消息的持久化和主备复制功能,可以让任何客户端访问任何时刻的数据,并且能记住每一个客户端的访问位置,还能保证消息不丢失。
常用命令
消息队列相关命令:
XADD - 添加消息到末尾
XTRIM - 对流进行修剪,限制长度
XDEL - 删除消息
XLEN - 获取流包含的元素数量,即消息长度
XRANGE - 获取消息列表,会自动过滤已经删除的消息
XREVRANGE - 反向获取消息列表,ID 从大到小
XREAD - 以阻塞或非阻塞方式获取消息列表
消费者组相关命令:
XGROUP CREATE - 创建消费者组
XREADGROUP GROUP - 读取消费者组中的消息
XACK - 将消息标记为"已处理"
XGROUP SETID - 为消费者组设置新的最后递送消息ID
XGROUP DELCONSUMER - 删除消费者
XGROUP DESTROY - 删除消费者组
XPENDING - 显示待处理消息的相关信息
XCLAIM - 转移消息的归属权
XINFO - 查看流和消费者组的相关信息;
XINFO GROUPS - 打印消费者组的信息;
XINFO STREAM - 打印流信息
XADD - 添加消息到末尾
XTRIM - 对流进行修剪,限制长度
XDEL - 删除消息
XLEN - 获取流包含的元素数量,即消息长度
XRANGE - 获取消息列表,会自动过滤已经删除的消息
XREVRANGE - 反向获取消息列表,ID 从大到小
XREAD - 以阻塞或非阻塞方式获取消息列表
消费者组相关命令:
XGROUP CREATE - 创建消费者组
XREADGROUP GROUP - 读取消费者组中的消息
XACK - 将消息标记为"已处理"
XGROUP SETID - 为消费者组设置新的最后递送消息ID
XGROUP DELCONSUMER - 删除消费者
XGROUP DESTROY - 删除消费者组
XPENDING - 显示待处理消息的相关信息
XCLAIM - 转移消息的归属权
XINFO - 查看流和消费者组的相关信息;
XINFO GROUPS - 打印消费者组的信息;
XINFO STREAM - 打印流信息
持久化
RDB
内存快照
恢复速度快,持久化性能高.但是存在数据丢失风险
AOF
日志文件追加记录
实时持久化,数据安全性更高.持久化效率低
复制
原理
同步RDB文件
复制缓冲区
类型
部分复制(Psync,2.8版本之后)
全量复制(Sync)
拓扑
星型
主 - 从(单节点)
主 - 从(多节点)
树型
主 - 从(主) - 从
高可用
Redis Sentinel
Redis Cluster(集群自带高可用)
Keepalived
分布式
方案
集群
Redis Cluster
中间件分片
TwemProxy
CodisProxy
客户端分片
业务程序
原理
客户端分片
一致性哈希算法
Codis
虚拟槽分区(1024个槽)
集群内部数据节点独立运作,无需相互通信
Redis Cluster
Gossip协议 -- 集群数据节点内部相互通信
Raft算法 -- 集群内选主
虚拟槽分区(16384个槽)
阻塞
持久化阻塞
Fork子进程
RDB持久化
AOF文件重写
命令阻塞
keys *
smembers
lrange
hgetall
内存
内存消耗
对象内存
存储着所有数据
缓冲内存
客户端缓冲
通过参数client-output-buffer-limit控制
复制积压缓冲区
根据repl-backlog-size参数控制
AOF缓冲区
用于在Redis重写AOF文件期间保存最近的写入命令
内存碎片
可采用数据对齐和安全重启等方式规避内存碎片的问题
内存回收策略
no-enviction
禁止驱逐数据,这也是默认策略。意思是当内存不足以容纳新入数据时,新写入操作就会报错,
请求可以继续进行,线上任务也不能持续进行,采用no-enviction策略可以保证数据不被丢失
请求可以继续进行,线上任务也不能持续进行,采用no-enviction策略可以保证数据不被丢失
allkeys-random
从数据集(server.db[i].dict)中任意选择数据淘汰
allkeys-lfu
从数据集中挑选使用频率最低的数据淘汰
allkeys-lru
从数据集中挑选最近最少使用的数据淘汰
volatile-random
从已设置过期时间的数据集中任意选择数据淘汰
volatile-lfu
从已设置过期时间的数据集挑选使用频率最低的数据淘汰
volatile-ttl
从已设置过期时间的数据集中挑选将要过期的数据淘汰
volatile-lru
从已设置过期时间的数据集中挑选最近最少使用的数据淘汰
内存淘汰机制实现
消极方法(passive way),在主键被访问时如果发现它已经失效,那么就删除它。redis在实现GET、MGET、HGET、LRANGE等所有涉及到读取数据的命令时都会调用 expireIfNeeded,它存在的意义就是在读取数据之前先检查一下它有没有失效,如果失效了就删除它
积极方法(active way),周期性地探测,发现失效就删除。消极方法的缺点是,如果key 迟迟不被访问,就会占用很多内存空间,所以才有积极方式
主动删除:当内存超过maxmemory限定时,触发主动清理策略,该策略由启动参数的配置决定
内存优化
缩减键值对象的长度
共享对象池
字符串优化
编码优化(使用ziplist编码能节约内存但会提高耗时-空间换时间)
控制键的数量(如使用hash结构重构字符串结构)
客户端
Jedis(Java)
Redis-py(Python)
Redigo(GO)
辅助功能
慢查询(slowquery)
管道(pipeline)
缓存问题隐患
缓存无底洞
缓存穿透
缓存雪崩
热点key倾斜
热点key重建
性能调优
vm.overcommit_memory=1
vm.swapiness=1
关闭THP特性
echo never > /sys/kernel/mm/transparent_hugepage/enabled
调大ulimit
调大TCP Backlog
Redis参数调优
appendfsync
no-appendfsync-on-rewrite
auto-aof-rewrite-percentage
auto-aof-rewrite-min-size
hash-max-ziplist-entries
hash-max-ziplist-value
list-max-ziplist-size
set-max-intset-entries
zset-max-ziplist-entries
zset-max-ziplist-value
hll-sparse-max-bytes
client-output-buffer-limit
监控
info
redis-stat
redislive
redis-cli monitor
redis-cli --latency
Codis Dashboard
Zabbix
Grafana
事务
Redis 事务可以一次执行多个命令, 并且带有以下三个重要的保证:
批量操作在发送 EXEC 命令前被放入队列缓存。
收到 EXEC 命令后进入事务执行,事务中任意命令执行失败,其余的命令依然被执行。
在事务执行过程,其他客户端提交的命令请求不会插入到事务执行命令序列中。
一个事务从开始到执行会经历以下三个阶段:
开始事务:MUITI
命令入队:写操作命令
执行事务:EXEC
批量操作在发送 EXEC 命令前被放入队列缓存。
收到 EXEC 命令后进入事务执行,事务中任意命令执行失败,其余的命令依然被执行。
在事务执行过程,其他客户端提交的命令请求不会插入到事务执行命令序列中。
一个事务从开始到执行会经历以下三个阶段:
开始事务:MUITI
命令入队:写操作命令
执行事务:EXEC
0 条评论
下一页