1、Redis是线程安全的吗?
Redis是单进程的,所以是线程安全的。Redis是利用队列技术将并发访问变为串行访问。
2、为什么使用Redis,它有什么好处?
(1)速度快,因为数据存放在内存中。
(2)支持多种数据类型,支持String,List,Set,Sorted set,Hash(底层相当于一个Map结构)。
(3)提供了RDB和AOF两种持久化方式。
(4)丰富的特性:可用作缓存,消息,可以按key设置过期时间,过期将会自动删除。
(5)支持事务,操作都是原子性。
Redis的事务没有关系数据库事务提供的回滚(rollback)功能。为此开发者必须在事务执行出错后自己收拾剩下的摊子(将数据库复原回事务执行前的状态等,这里我们一般采取日志记录然后业务补偿的方式来处理,但是一般情况下,在redis做的操作不应该有这种强一致性要求的需求,我们认为这种需求为不合理的设计)。
3、RDB和AOF的区别
RDB持久化:是将在指定的时间间隔内生成的数据集备份到磁盘中。(可能丢失一段时间的数据)。
AOF持久化:记录的是服务器执行的所有写操作指令,并在服务器启动时,通过重新执行这些命令来还原数据集。AOF可以每秒同步一次(默认方式),也可以每次执行写入命令时同步一次。
4、redis常见性能问题和解决方案?
(1)Master最好不要做任何持久化工作,如RDB内存快照和AOF日志文件,特别是不要启用内存快照做持久化。
Master写内存快照,save命令调度rdbSave函数,会阻塞主线程的工作,当快照比较大时对性能影响是非常大的,会间断性暂停服务,所以Master最好不要写内存快照。对于Master AOF持久化,如果不重写AOF文件,这个持久化方式对性能的影响是最小的,但是AOF文件会不断增大,AOF文件过大会影响Master重启的恢复速度,如果重写AOF文件,AOF在重写的时候会占大量的CPU和内存资源,出现短暂服务暂停现象。
(2)如果数据比较重要,某个Slave开启AOF备份数据,策略设置为每秒同步一次。
(3)为了主从复制的速度和连接的稳定性,Master和Slave最好在同一个局域网内。
5、mySQL里有2000w数据,redis中只存20w的数据,如何保证redis中的数据都是热点数据?
相关知识:redis内存数据集大小上升到一定大小的时候,就会施行数据淘汰策略。redis提供6种数据淘汰策略:
volatile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰。
volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰。
volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰。
allkeys-lru:从数据集(serverdb[i].dict)中挑选最近最少使用的数据淘汰。
allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰。
no-enviction(驱逐):禁止驱逐数据。
6、redis的多路复用技术
redis是一个单线程却性能非常好的内存数据库,主要用来作为缓存系统。redis采用网络IO多路复用技术来保证在多连接的时候,系统的高吞吐量。
为什么redis中要使用I/O多路复用这种技术呢?
首先,redis是跑在在单线程中的,所有的操作都是按照顺序线性执行的,但是由于读写操作等待用户输入或输出都是阻塞的,所以I/O操作在一般情况下往往不能直接返回,这会导致某一文件的I/O阻塞导致整个进程无法对其他用户提供服务,而I/O多路复用技术就是为了解决这个问题而出现的。
redis的io模型主要基于epoll实现的,不过它也提供了select和kqueue的实现,默认采用epoll。
那么epoll到底是个什么东西呢?其实是众多i/o多路复用技术当中的一种而已,但是相比其他io多路复用技术(select,poll等等),epoll有诸多优点:
(1)epoll没有最大并发连接的限制,上限是最大可以打开文件的数目,这个数字一般远大于 2048, 一般来说这个数目和系统内存关系很大 ,具体数目可以 cat /proc/sys/fs/file-max 察看。
(2)效率提升,Epoll最大的优点就在于它只管你“活跃”的连接,而与连接总数无关,因此在实际的网络环境中,Epoll的效率就会远远高于select和poll。
(3)Epoll使用了“共享内存”,就省略了内存拷贝。