1. redis 介绍
Redis是一个开源的(BSD许可)使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库。
2.redis 数据类型
string 、hash、list、set、zset
3. redis 主要配置
3.1 绑定可以连接 redis 的 Ip
bind 127.0.0.1(如果注释掉说明接受任何IP的连接)
3.2 端口
port 6379
3.3 设置数据库的个数
databases 16
3.4 rdb 快照保存策略
save 900 1 :900秒内如果超过1个key被修改,则发起快照保存。
save 300 10:300秒内如果超过10个key被修改,则发起快照保存。
save 60 10000:60秒内如果超过10000个key被修改,则发起快照保存。
3.5 rdb文件的名字
dbfilename dump.rdb
3.6 rdb文件存放路径
dir ./
3.7 从节点配置
slaveof
3.8 密码设置
requirepass foobared
3.9 淘汰策略
volatile-lru -> remove the key with an expire set using an LRU algorithm
allkeys-lru -> remove any key according to the LRU algorithm
volatile-random -> remove a random key with an expire set
allkeys-random -> remove a random key, any key
volatile-ttl -> remove the key with the nearest expire time (minor TTL)
noeviction -> don't expire at all, just return an error on write operations
3.10 Aof 开启
appendonly no(no:不开启,yes:开启)
3.11 Aof文件名
appendfilename "appendonly.aof"
3.12 Aof保存策略
appendfsync always appendfsync everysec appendfsync no
4. redis 持久化
4.1 rdb
4.1.1 rdb 原理
redis 会复制一个与当前进程一模一样的进程来进行持久化,会先将数据写入临时文件,等持久化结束后,
再将临时文件替换之前的持久化文件,过程中主线程不进行IO操作,确保了性能。
(rdb 是可以被关闭的,一种情况除外:如果是主从配置的情况下,即使关闭了rdb配置,也不起作用)
4.1.2 手动执行快照操作
使用 save 或者 bgsave :save 会发生阻塞(不会用);bgsave 后台异步进行操作,不阻塞。
(flushall 命令也会触发,但是并没有意义,数据会被清空)
4.2 aof
4.2.1 aof 原理
将 redis 的操作日志以追加的方式写到文件中,读的操作不做记录。
4.2.2 aof 重写
aof 文件会越来越大,当满足 auto-aof-rewrite-percentage 100, auto-aof-rewrite-min-size 64mb,就会重写。
4.3 rdb 与 aof 比较
rdb 适合大规模数据恢复,对数据的一致性不高,是隔一段时间做备份,可能会丢失最后一次快照的数据。
aof 根据配置决定,丢失数据的可能性小。
5. redis 事务
multi 开启事务, 将多个命令入队到事务中,exec 触发事务 , discard 放弃事务。
事务可以理解为一个打包的批量执行脚本,但批量指令并非原子化的操作,中间某条指令的失败不会导致前面已做指令的回滚,也不会造成后续的指令不做。
在开启事务之前,可以使用 watch 监控某个值,如果在事务未执行期间,发生了改变,会导致事务的失败。
6. 缓存
6.1 缓存穿透
用户查询一个数据,发现在Redis中没有,就会去数据库查询,数据库查询,发现也没有这个数据,该次查询就会失败,当发起查询的用户数量很大时,缓存都没有命中,会给数据库带来巨大压力,这就是缓存穿透。
解决方案:如果数据库查询不到数据就缓存空数据,并给数据设置有效时间。
6.2 缓存雪崩
大批量的缓存在同一时间失效了,导致了大批量的请求查询数据库的操作,就是缓存雪崩。
解决方案:1.加锁或者使用队列让请求操作串行化;2.缓存失效的时间均匀的分布,不要同时失效。