redis
1. redis常用命令:
info memory 查看内存使用 config get memory 获取配置 config set memory 100mb 配置,实时生效,不需要重启。 flushall 清空所有数据库,从的数据也会被清空
flushdb 只清除当前的数据库下的数据,不会影响到其他数据库
slaveof no one 从:删除从结点 info replication 查看主从结点信息 select n 选择数据库,每个数据库都有属于自己的空间,不必担心之间的key冲突。
2.事务
redis单个命令是原子性的,但是事务不具有原子性。Redis会将事务中的所有命令序列化,然后按顺序执行。Redis不可能在一个Redis事务的执行过程中插入执行另一个客户端发出的请求。
redis事务在提交前对其他事务不可见。
//redis 对命令不会做正确性判断,都会加入到队列中
127.0.0.1:6379> multi OK 127.0.0.1:6379> set name xiaoming time sdfsi dsfs ssdfs d sdfsdf sfsfs QUEUED
redis事务中在redis中,对于一个存在问题的命令,如果在入队的时候就已经出错,整个事务内的命令将都不会被执行(其后续的命令依然可以入队),如果这个错误命令在入队的时候并没有报错,在执行时出错,那么redis会继续执行后续命令,之前的命令也不会回滚。
WATCH:监控一个或者多个key,如果这些key在提交事务(EXEC)之前被其他用户修改过,那么事务将执行失败
Redis事务作用:在一个队列中一次性、顺序性、排他性的执行一系列的命令。
127.0.0.1:6379> multi OK 127.0.0.1:6379> set name xiaoming QUEUED 127.0.0.1:6379> set age 1 QUEUED 127.0.0.1:6379> set time 1111 QUEUED 127.0.0.1:6379> exec 1) OK 2) OK 3) OK
3.redis线程模型
io多路复用监控多个fd,事件分发器会把监控到的不同事件分发到不同的处理器。
redis为什么这么快:纯内存,单线程,io多路复用epoll。
4.redis内存使用完
volatile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰
volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰
volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰
allkeys-lru:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰
allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰
no-enviction(驱逐):禁止驱逐数据,默认的回收策略。
注意这里的6种机制,volatile和allkeys规定了是对已设置过期时间的数据集淘汰数据还是从全部数据集淘汰数据,后面的lru、ttl以及random是三种不同的淘汰策略,再加上一种no-enviction永不回收的策略。
使用策略规则:
1、如果数据呈现幂律分布,也就是一部分数据访问频率高,一部分数据访问频率低,则使用allkeys-lru
2、如果数据呈现平等分布,也就是所有的数据访问频率都相同,则使用allkeys-random
5.BGSAVE和SAVE命令的区别
bgsave:另外fork一个子进程来将内存中的数据写入快照,不会阻塞主线程的写操作。
save命令会阻塞主线程的写操作。
5. AOF文件重写
AOF追加写操作,会先将写命令缓存到内存中,再采用各种策略同步到硬盘中:逐条同步硬盘或者每秒同步一次。
AOF通过重写机制来减小AOF文件的大小,重写后的AOF文件只保留最终的写命令。
AOF的数据恢复速度慢于RDB。