Redis是什么?
redis是一个key-value数据库。
储存的类型有:string,哈希结构,集合,有序集合。
是数据库就必须提一下他的事务,
它的事务会经历三个阶段:
1.开始事务。(multi)
2.命令入队
3.执行事务(exec)
1)Discard是取消事务,已经执行完毕的事务是无法撤销的。
2)在执行事务的时候如果遇到错误的命令redis不会回滚,它只会告诉你这个命令是错误的。不影响当前事务队列里其他命令的执行。 而关系型数据库,则会回滚到最初的状态。
3)在执行事务的时候,命令本身没有问题,只是操作对象有问题,不会直接报错,而是把该命令放到事务队列当中。
事务结束后,其他命令执行成功,此命令报错,说类型不一致,
此问题的解决,需要交给程序员。
Redis的数据储存在缓存当中,所以需要持久化。
Redis的持久化有2种方式,
第一种是rdb,又称快照。简单来说就是通过配置文件,来指定每隔几分钟或者N次写操作之后,从内存中dump数据形成rdb文件,压缩放在备份目录下。
4(例如:假设redis2次快照之间间隔20分钟,在快照的过程中,不断有命令操作,当快照完毕,快照过程中的命令操作没有持久化的时候,宕机。这些命令操作的数据就会丢失)
第二种方式是aof。 Redis2.4版本之后推出的,
Aof是通过日志的方式,来持久化。
主进程执行命令,后台日志进程会把命令写进aof文件中。
这就产生了问题:1.每个命令重写依次aof?2.某key操作100次,产生100行记录,aof文件会很大?
通过配置文件,可以指定aof持久化。
Aof重写可以解决,问题2.就是aof会把aof文件逆化成命令,写入aof日志里。
(例如:incr age 此命令执行了100次,从1变成101,aof日志只会记录age 101)
如果aof和rdb都存在,优先使用aof来恢复数据。
因为aof丢失的数据更少。
Redis和memcached的区别。
redis和memcached相比,的独特之处:
1: redis可以用来做存储(storge), 而memccached是用来做缓存(cache)
这个特点主要因为其有”持久化”的功能.
2: 存储的数据有”结构”,对于memcached来说,存储的数据,只有1种类型--”字符串”,
而redis则可以存储字符串,链表,哈希结构,集合,有序集合.
注: 在dump rdb过程中,aof如果停止同步,会不会丢失?
答: 不会,所有的操作缓存在内存的队列里, dump完成后,统一操作.
注: aof重写是指什么?
答: aof重写是指把内存中的数据,逆化成命令,写入到.aof日志里.
以解决 aof日志过大的问题.
问: 如果rdb文件,和aof文件都存在,优先用谁来恢复数据?
答: aof(因为aof恢复的丢失的数据更少)
问: 2种是否可以同时用?
答: 可以,而且推荐这么做
问: 恢复时rdb和aof哪个恢复的快
答: rdb快,因为其是数据的内存映射,直接载入到内存,而aof是命令,需要逐条执行
Redis集群宕机,有哨兵机制
Master---salve2
|
Salve1
Master宕机了,手动操作,运行过程中动态的改变集群,slave1位主,slave为salve1的从,,
用config 运维命令,
运行时更改master-slave
1.命令该服务不做其他redis服务的slave
命令:slaveof no one
Sentinel监控主从服务器,
Redis给key设置过期时间。涉及到的过期key处理的问题。
1.定时删除(每个设置时间的key都得维护一个定时器之类的)
我定个时间,到点就删除,有什么好处呢,对内存是最友好的,可以保证过期键会被尽快的删除掉,内存被尽早的释放出来,但是对cpu是不友好的,因为过期key很多,到点儿删除,cpu不干别的事儿,光做删除过期的健的操作了,
2.懒惰删除
客户端现在取这个数据了,这个key已经过期了,就把该key给删除掉
3.定期删除
定期?比定时时间长一点,不会时刻的去检查过期键,删除过期键,定期删除,是每隔一段时间检查一次数据库,删除里面的过期键,很明显定期删除是定时删除和懒惰删除的一个折中。
Redis时间上采用了惰性删除和定期删除两种策略配合使用,可以更好的使CUP时间和内存区的平衡