redis从入门到熟练
速度快:10w ops(每秒10万次读写)
原因:在内存中;C语言开发;单线程(按优先级从前到后)
数据结构:string,list,hash tabls,sets,sorted sets,bitmap,hyperloglog(本质字符串)
一,redis八个特性
1,安装和启动
安装:
- wget http://download.redis.io/releases/redis-5.0.7.tar.gz
- tar -xzf redis-5.0.7.tar.gz
- ln -s redis-5.0.7 redis 建立软连接
- cd redis-5.0.7
- make && make install
然后进入redis-5.0.7下的src目录中,主要看6个可执行文件:
redis-server, redis-cli, redis-benchmark, redis-check-aof, redis-check-dump, redis-sentinel
分别对应redis服务器,redis命令行,性能测试,AOF修复,RDB修复, sentinel服务器
启动:
直接启动:执行redis-server,默认端口6379
参数启动:增加参数
配置文件启动:文件路径以命令行参数传入(生产环境推荐)
常用配置:
daemonize: no|yes 是否以守护进程启动,默认no
port:端口 默认6379
logfile:日志文件
dir:工作目录
2,API
1,常用命令
注意:单线程的redis最好不要使用耗时的命令
keys [pattern] # 用通配符展示key o(n)的命令,生产环境少用,或者在从节点使用
dbsize # 显示key的总数
exists key # 判断存在 返回1/0
del key (get set) # 删除键值对 del b d si 同时删除多个
expire key seconds # 设置过期时间
ttl key # 产看剩余过期时间 返回 -2 表示key不存在 返回-1表示key存在,但是没有过期时间
persist key # 去掉过期时间
type key # 返回key的数据类型
# 以上命令 keys时间复杂度是o(n),其余都是o(1)
mget,mset # 批量存取
2,数据结构,单线程
字符串:用做缓存,计数器,分布式锁 命令:incr, decr, incrby, decrby(增减,计数)
哈希:hget, hset, hdel
列表:有序,可以重复
3,其他功能
1),慢查询
符合慢查询条件的查询会插入到慢查询队列中(先进先出)
慢查询配置一:
slowlog-max-len,设置慢查询队列长度,超出长度,先进的元素会被舍弃,默认128,同常1000(存在内存中,断电丢失)
慢查询配置二:
slowlog-log-slower-than,阙值,超过这个时间会加入慢查询队列,单位微秒,默认10000,通常设置1000
=0,记录所有,<0都不加入慢查询
常用命令:
slowlog get [n]:获取慢查询队列 指定条数
slowlog len:获取队列长度
slowlog reset:清空慢查询
2),pipeline
批量传输redis命令,节省网络时间开销(1次网络传输10ms级起步,redis命令微秒级)
pipeline非原子操作,顺序执行和返回,执行中可能插入其他命令
pipeline命令不易过多,返回数据有压力
每次只作用一个redis节点
3),发布订阅
发布者publisher 订阅者subscriber (实际上都是客户端)
消息队列(抢占式,只有一个订阅者收到)
频道channel
API:
publish channel message
subscribe [channel] 多个
unsubscribe [channel] 多个
psubscribe [pattern] 模式,通配符
4),bitmap,位图
getbit, setbit直接操作value的二进制的位
setbit key offset value value智能位0和1,offset为设置第几位,返回值为这个位原值
bitcount key [start end] 获取二进制位图值为一的个数
案例:独立用户统计,节省内存
用户统计.png 用户统计续.png
5),hyperloglog,极小空间完成数量统计
6),GEO,经纬度
4,持久化
持久化:redis数据的更新异步的保存在硬盘中
主流方式:AOF(日志) RDB(快照)
1),RDB
快照:数据在某个时间点的映像(类似于拷贝)
RDB触发机制:
- save命令:同步命令,阻塞(数据量大会等待拷贝),如果存在老文件会替换
- bgsave命令:异步的save,使用Linux fork函数生成子进程来执行save。fork函数有较小几率阻塞redis
- 自动:使用save config文件,然后使用bgsave
- 其他触发机制:shutdown,全量复制,主从复制
2),AOF
RDB的缺点:耗时,耗性能;不稳定,易丢失;
aof写命令的日志会先写入缓冲区,然后在进入硬盘
缓冲区到硬盘的三种策略:
- always 一直同步写入,每条命令同步一次
- everysec 每秒同步一次
-
no 以操作系统特性自动操作
对比
重写:
命令过多导致AOF文件过大,处理难;为了减小文件大小和加快恢复速度。
原理:把过期的命令,可以覆盖的命令优化掉
实现:
- bgrewriteaof命令 启用fork进程
- 配置文件:auto-aof-rewrite-min-size 重写的文件尺寸标准,达到即触发重写;auto-aof-rewrite-percentage AOF文件增长率,每次重写后,文件增加了多少后再次触发重写
3),AOF对比RDB,与选择
todo:此部分写完主从,再来补充。。。。。。
对比