redis (remote dictionary server)
<meta charset="utf-8">http://download.redis.io/releases/
文档
expire k1 10 设置过期时间
ttl 查询过期时间
时间到期后 删除 keys * 就没有当前k1了
String 常用命令
set / get / del / append / strlen
incr / decr / incrby / decrby / 一定要是数据才能加减
getrange / setrange
setex(set with expire)键过期秒数 / setnx (set if not exist)
mset / mget / msetnx
getset
列表常用命令
lpush / rpush / lrange
lpop / rpop
lindex,按照索引下标获得元素(从上到下)
llen
lrem key 删N个value
ltrim key 开始index 结束index,截取制定范围的值后再赋给key
rpoplpush 源列表 目的列表
lset key index value 设置指定下标的value
linsert key before / after key 值2
列表 是一个字符串链表, left 和 right都可以插入添加;
如果键不存在,创建新的链表
如果键已存在,新增内容
如果值全部移除,对应的键也消失了
链表的操作无论是头和尾效率都很高,但假如是对中间的元素进行操作,效率就很惨淡了
list
set
hash 就是一个键值对,可以存储对象
zset
redis配置
daemonize:yes:redis采用的是单进程多线程的模式。当redis.conf中选项daemonize设置成yes时,代表开启守护进程模式。在该模式下,redis会在后台运行,并将进程pid号写入至redis.conf选项pidfile设置的文件中,此时redis将一直运行,除非手动kill该进程。
daemonize:no: 当daemonize选项设置成no时,当前界面将进入redis的命令行界面,exit强制退出或者关闭连接工具(putty,xshell等)都会导致redis进程退出。
1.redis 默认支持同时10000个客户端连接 Maxclients
2.redis value 最大 512M Maxmemory
3.Redis内存不足的缓存淘汰策略(maxmemeory-policy)
- noeviction:当内存使用超过配置的时候会返回错误,不会驱逐任何键
- allkeys-lru:加入键的时候,如果过限,首先通过LRU算法驱逐最久没有使用的键
- volatile-lru:加入键的时候如果过限,首先从设置了过期时间的键集合中驱逐最久没有使用的键
- allkeys-random:加入键的时候如果过限,从所有key随机删除
- volatile-random:加入键的时候如果过限,从过期键的集合中随机驱逐
- volatile-ttl:从配置了过期时间的键中驱逐马上就要过期的键
- volatile-lfu:从所有配置了过期时间的键中驱逐使用频率最少的键
- allkeys-lfu:从所有键中驱逐使用频率最少的键
redis默认测试,永不过期
4.maxmemeory-samples: 设置样本的数量,默认5个
redis持久化(重要)
介绍:
1.rdb redis database 指定的时间间隔内,将内存中的快照数据Snapshot写入磁盘
2.aof append only file
RDB 详解
rdb 出厂默认策略
1分钟内改了1万次
或5分钟内改了10次
或15分钟内改了1次
save " 代表禁用 RDB策略
在命令中使用save,立马备份当前操作的数据
save命令,马上就持久化,可以针对很重要的数据,set之后 立马执行save命令;
如果不执行save,默认使用.conf里面的备份策略
bgsave也可以里面备份当前操作,与save的区别是 bgsave是异步的,不会发生阻塞;save命令会发生阻塞
save和flushall都会立即将命令同步到rdb文件中
RDB配置
1、stop-writes-on-bgsave-error 当发生持久化错误的时候,redis是否停止接收数据。默认 yes
2、rdbcompression 快照文件是否用 LZF算法压缩,但会消耗CPU。 默认yes
配置异常 用 redis_check_dump 修复
AOF详解
配置文件:
appendonly true打开。默认no,关闭。
appendfilename aof文件名
appendfsync: allways 同步持久化,每次变化都会记录到磁盘,性能差,数据完整性好
everysec 出厂默认设置,异步操作。每秒记录一次,发生宕机,丢失1s数据
no 不同步
配置异常 用 redis_check_aof 修复 用法 : redis-check-aof --fix AOF文件
AOF rewrite
aof文件是追加的形式,所会越来越大。
rewrite aof 文件压缩精简机制
什么时候触发rewrite:默认 是记录上次rewrite之后文件大小的一倍 并且文件大小大于64M后 fork新的线程 触发
No-appendfsync-on-rewrite 重写时是否可以运用Appendfsync,默认 no,保证数据安全性
Auto-aof-rewirte-min-size 设置重写的基准值 默认 64M
Auto-aof-rewrite-percentage 设置重写的基准值(上次重写后大小的百分比)
AOF 关键点:同步策略,文件修复,rewrite
劣势:
1、数据会越来越大,不如rdb
2、恢复的速度也慢
redis事务
MULTI 开始事务
EXEC 提交事务
DISCARD 放弃事务
事务中有一条语句错误,所有的语句都会执行失败(编译时异常);
如果其中的语句是 incr这样的语句,错误了不会提醒,exec后单这条语句不会成功。所以redis对事务的支持并非是绝对的。
WATCH 监控:
悲观锁:对事情的发展很悲观,为了不出事,自动加锁
乐观锁:在每条记录后面加上version
redis发布与订阅
消息中间件
进程间的通信模式 pub发送者发送消息,sub 订阅者接收
订阅 subscribe c1 c2 c3 同时订阅 c1 c2 c3 三个频道的发布
publish c1 hello-redis -- 向c1频道发送消息 hello-redis
psubscribe news* 订阅 带有通配符的 频道
redis主从复制
1、配从不配主
2、从库配置 slaveof 主库IP 主库端口
1、命令 info replication 查看主从复制状态
2、成为从机那一刻,将会复制主机所有的数据
3、从库不能set值,只能get值 只读模式
4、主机挂了,重启之后,从机自动连接主机
5、从机挂了,重启之后 变成 master,不会从主机获取数据;如果需要连接主机,可以在配置文件中配置主机地址IP端口
6、主从复制原理:首次成为slave,全量同步;后面进行增量同步
7、主机down了之后,从机6380可以执行 slaveof no one,不再跟从任何主机。另外一台从机 slave of ip 6380 重新确认主机 --- 反客为主
主从三种方式:
一主多从 6379 ---》 6380、6381
薪火相传 6379 ---》 6380 ---》6381
反客为主 主机挂掉之后,其中一台从机 slaveof no one,其他从机 slaveof 新的slaveof no one的机器
如果主机挂了,不可能手动指定新的master;要使用哨兵模式
在redis 目录下 配置sentinel.conf,内容为:
sentinel monitor host6379 127.0.0.1 6379 1 代表 其他从机投票数多,就被选为主机
79挂掉之后,重新回来 会变成从机
redis主从复制原理:
从数据库连接主数据库,发送SYNC命令;
主数据库接收到SYNC命令后,可以执行BGSAVE命令生成RDB文件并使用缓冲区记录此后执行的所有写命令;
主数据库BGSAVE执行完后,向所有从数据库发送快照文件,并在发送期间继续记录被执行的写命令;
从数据库收到快照文件后丢弃所有旧数据,载入收到的快照;
主数据库快照发送完毕后开始向从数据库发送缓冲区中的写命令;
从数据库完成对快照的载入,开始接受命令请求,并执行来自主数据库缓冲区的写命令;(从数据库初始化完成)
主数据库每执行一个写命令就会向从数据库发送相同的写命令,从数据库接收并执行收到的写命令(从数据库初始化完成后的操作)
出现断开重连后,2.8之后的版本会将断线期间的命令传给从数据库,增量复制。
主从刚刚连接的时候,进行全量同步;全同步结束后,进行增量同步。当然,如果有需要,slave在任何时候都可以发起全量同步。Redis的策略是,无论如何,首先会尝试进行增量同步,如不成功,要求从机进行全量同步
redis哨兵模式工作模式:
https://www.jianshu.com/p/06ab9daf921d
问题:
数据穿透?
实现队列?