导图社区 Redis
Redis从基础命令到核心概念。Redis即远程字典服务,是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。本思维导图包括其缓存、数据库、知识点、配置、常用命令、总结等内容,希望对你有帮助!
编辑于2021-04-11 14:59:47Redis
数据结构
字符串
命令
基本命令
GET
SET
set hello world
key hello
value world
DEL
自增
命令
INCR
+1
DECR
-1
INCRBY
incrby key num
+num
DECRBY
decrby key num
-num
INCRBYFLOAT
变化
无键/空值
按0处理
无法解释为浮点数或整数
返回错误
字符串操作
APPEND
append key value
值 value 追加到 key 存储值的末尾
GETRANGE
getrange key start end
包含 start 和 end
SETRANGE
setrange key offset value
从偏移量offset开始设值
二进制
GETBIT
getbit key offset
SETBIT
setbit key offset value
BITCOUNT
bitcount key [start end]
BITOP
bitop Operation dest-key key
按位操作
值类型
字符串
整数
浮点数
列表
命令
基本命令
RPUSH
rpush key value
LPUSH
LPOP
RPOP
LINDEX
LRANGE
lrang key 0 -1
0 - start;-1 - end
此时取列表中所有的元素
LTRIM
LTRIM key start end
保留左侧开始从start到 end 的值
修剪
阻塞式的列表弹出
BLOP
BLOP key1 key2 key3... timeout
从第一个非空列表中弹出最左侧的元素
或者在 timeout 时间内阻塞并等待可以弹出的元素出现
BROP
列表之间的传递
RPOPLPUSH
RPOPLPUSH source-key dest-key
从 sorce 的右侧弹出元素; 并放在 dest 的左侧; 并向用户返回这个元素
BRPOPLPUSH
BRPOPLPUSH source dest timeout
从source 中弹出最右端的元素,放在dest的最左端,并返回。 如果 source 为空,等待 timeout
常用于消息队列和任务队列
优点
同时保存多个字符串的值
集合
命令
基本命令
SADD
SMEMBERS
集合所有成员
SISMEMBER
是否在集合
SREM
remove;移除
SCARD
数量
SPOP
随机删除,并返回删除的元素
SMOVE
SMOVE source dest item
从 souce中删除item,并添加到 dest 中
集合运算
SINTER
交集
第一个集合只保存所有都存在的
SINTERSTORE
SUNION
并集
SUNIONSTORE
SDIFF
SDIFF key-name key-name key-name
差集
将第一个集合中元素移除其余集合包含的元素
SDIFFSTORE
SDIFFSTORE dest-key key-name key-name...
key-name... 的不相同的放入 dest-key中
散列
命令
基本命令
HSET
hset key sub-key value
HGET
hget key sub-key
HGETALL
hgetall key
HDEL
HDEL key-name key key
HLEN
HLEN key-name
散列所包含的键值对数量
批量操作
HMGET
HMGET key-name key key...
散列中获取一个或者多个值
HMSET
HMSET key-name key-value, key-name key-value
HEXISTS
健是否在散列中
HKEYS
散列所有的键
HVALS
散列所有的值
HGETALL
散列所有的键值
HINCRBY
HINCRBY key-name key num
给散列key-name的健key的值➕num
HINCRBYFLOAT
无法对value里的字段操作
有序集合
命令
基本命令
ZADD
ZRANGE
ZRANGEBYSCORE
ZREM
remove
ZCARD
成员数量
ZINCRBY
ZINCRBY key-name increment member
将关键为 member 的值➕increment
ZCOUNT
ZOCOUNT key-name min max
返回介于 min 和 max 之间的成员数量
ZRANK
成员在有序集合里的排名
ZSCORE
ZSCORE key-name member
获取成员的分值
范围型
获取
ZREVRANK
有序集合里成员的排名,分值从大到小
ZREVRANGE
ZREVRANGE key-name start stop[WITHSCORES]
有序集合里给定排名范围的成员 成员按照从大到小排列
ZRANGEBYSCORE
ZRANGEBYSCORE key min max [WITHSCORE] [LIMIT offset count]
ZREVRANGEBYSCORE
ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT offset count]
REV - 代表了有序
删除
ZREMRANGEBYRANK
ZREMRANGEBYRANK key-name min max
移除有序集合中排名介于 min 和 max 之间的所有成员
集合类
交集
ZINTERSTORE
ZINTERSTORE dest-key key-count key [key ....][WEGIHTS weight [weight...]][AGGREGATE SUM|MAX|MIN]
差集
ZUNIONSTORE
根据AGGREGATE 聚合函数 SUM|MIN|MAX 决定最后的结果
因为相同的键在不同的集合可能存在不同的值
特点
键
成员
值
分值
类型
整数
双精度浮点数
简单应用
登陆和Cookie缓存
用户信息
访问时长
已浏览商品的数量
所有的商品
最后一次下单浏览的访问时间
购物车
网页缓存
动态生成页面使用模版语言
将可以缓存的页面加入到 redis中
不可缓存的页面直接访问
通过中间件来实现
数据缓存
例如折扣活动,数据库的数量是变化非常快的
创建持续运行的守护进程
通过两个集合实现
调度集合
时间戳
延迟集合
缓存需要每隔多少秒更新一次
如果调度集合达到时间。 延迟集合>0 ;进行缓存 等于或小于0,删除记录
网页分析
统计网页的浏览次数等
核心概念
事务
命令
基本事务
MULTI
EXEC
其他事务
WATCH
直到执行EXEC之前,如果有其他客户端对被监视的键值进行了替换、更新或删除操作时,在执行EXEC命令的时候,事务将失败并返回一个错误
UNWATCH
在WATCH执行后,MULTI执行前,对连接重置
DISCARD
MULTI执行后,EXEC执行前进行重置
基本事务
事务的执行,从MULTI开始,到EXEC结束
是多条指令一起执行,自上而下执行
可以同时发送多条命令,减少Redis与服务器之间的连接次数
没有回滚操作
存在问题
1 MULTI时,在EXEC命令被调用之前不会执行任何的实际操作
导致用户无法根据读取到的数据做决定
2 无法以一致性的形式读取到数据
3 面对同一对象的二阶提交问题
持久化
快照持久化
方式
BGSAVE
不支持windows
通过 fork 创建一个子进程
父进程同时接收请求
发送SYNC请求时,会先执行BGSAVE
SAVE
产生阻塞
收到关闭或者TERM会执行
案例
save 900 1
在上次保存900秒之后,至少一次写命令成功后,执行save
数据恢复
通过快照和日志对比做恢复
AOF持久化
将被执行的写命令放在AOF文件的末尾
配置选项
always 每一次写入会向硬盘中追加
everysec 每秒钟向硬盘中追加
no 系统自己决定何时同步
问题
AOF文件的大小
重写AOF文件
BGREWRITEAOF
重写或删除旧的AOF文件
配置
auto-aof-rewrite-min-size 最小文件大小
auto-aof-rewrtite-precentage 比上一次增加百分之多少
复制
背景
负载量上升,数据完整性越来越重要
扩展读的请求或者需要写入临时数据的时候
1从服务器接收来自主服务器的初始副本
2客户端向主服务器写入时,从服务器会实时地得到更新
3 客户端也可以向从服务器发送请求
基本配置
主服务器
dir
dbfilename
保证两个路径可写
从服务器
slaveof
开启
SLAVEOF host port
关闭
SLAVEOF no one
主从复制
过程
主服务器
1等待命令
2 执行BGSAVE,并保存BGSAVE之后的写记录
3 向从服务器发送快照文件,并保存BGSAVE之后的写记录
4 把所有缓冲区的写记录发送给从服务器
5每执行一个写命令,向从服务器上发送过去
从服务器
1连接主服务器,发送 SYNC 命令
2 根据配置选项决定新的请求是拒绝还是使用之前的数据
3 丢弃之前的数据,如果存在的话,并将主服务器的快照文件载入
4接收来自主服务器缓冲期的写命令
5接收并执行主服务器的写命令
没有主主复制
最好使用50%~65%的内存,留下用户执行快照和缓存命令
多从服务器时,可以利用已有的快照文件
主从链
背景
多个从服务器造成网络不可用
需要互联网复制
不同的数据中心
适用于
读的重要性要大于写的重要性
读的请求数量远大于写的请求数量
配置
从服务器
appendonly yes
appendsync everysec
验证硬盘写入
过程
1 向主服务器写入之后,在写入唯一的虚构值(unique dummy value)
2 判断虚构值是否存在从服务器来判断写数据是否到达从服务器
检查INFO名称输出结果 aof_pending_bio_fsync
故障处理
验证
redis-check-aof
redis-check-aof --fix file.conf
检验命令,直到第一个错误为止
删除从这个命令开始,后面所有的命令
redis-check-dump
更换主服务器
方法一
1从服务器SAVE保存快照
2新建主服务器
3从服务器把快照发送给主服务器
方法二
从服务器改为主服务器
新建从服务器
非事务流水线
1 同时向Redis发送多条命令
2 此时不再包含MULTI和EXEC命令
日志实现
常见两种日志实现方式
日志到文件,追加方式,每个系统有自己的日志文件
借助syslog服务
syslog-ng
不同的日志文件存储到一台服务器下的多个文件夹下面
基本功能
添加
删除
查询
命名
日志分级
非数据结构常用命令
发布/订阅
命令
发布
PUBLISH
PUBLISH channel message
给定频道发布消息
PSUBSCRIBE
PSUBSCRIBE pattern [pattern...]
订阅与给定模式匹配的所有频道
PUNSUBSCRIBE
退订给定的模式,如果没有给定,退订所有模式
订阅
SUBSCRIBE
subscribe channel
UNSUBSCRIBE
排序
SORT
使用范围
字符串
列表
集合
有序集合
散列
值排序
用例
SORT source 【BY pattern】 [LIMIT offset count] [GET pattern [GET pattern ...]] [ASC|DESC] [ALPHA] [STORE dest-key]
规则
默认-按数字排序
alpah=True 按字母排序
by = ‘d-*->field’,get='d-*->field' 按照某个字段排序
过期时间
PERSIST
移除过期时间
TTL
查看还有多少秒到期
EXPIRE
指定键多少秒之后过期
EXPIREAT
EXPIREAT key-name timestamp
指定的键设置一个过期的时间戳
PTTL
还有多少毫秒过期
PEXPIRE
设置多少毫秒后过期
PEXPIREAT
毫秒级别过期的时间戳
性能测试程序
redis-benchamrk
可能存在的问题
单个客户端达到50~60%
不使用流水线
其他
每个命令或每组命令使用新的连接
重用已有的连接