目录
=================== 持续更新中 ===================
十二、有没有尝试进行多机Redis的部署?如何保证数据一致的?
=================== 持续更新中 ===================
=================== 持续更新中 ===================
一、什么是redis
redis是一个高性能的键值数据库,是noSQL的一种。
二、为什么要用redis
解决性能问题。
三、redis持久化机制
redis是一个支持持久化的内存数据库,通过持久化机制把内存中的数据同步到硬盘文件夹来保证数据持久化。当redis重启后通过把硬盘文件重新加载到内存,就能达到恢复数据的目的。
实现:单独创建fork()一个子进程,将当前父进程的数据复制到子进程的内存中,然后由子进程写入到临时文件中,持久化的过程结束了,再用这个临时文件替换上次的快照文件,然后子进程退出,内存释放。
四、redis持久化有几种持久化方式
有RDB、AOF两种。
RDB:是redis默认的持久化方式。按照一定的时间周期策略把内存的数据以快照的形式保存到硬盘的二进制文件。即Snapshot快照存储,对应产生的数据文件为dump.rdb,通过配置文件中的save参数来定义快照的周期。(快照可以是其所表示的数据的一个副本,也可以是数据的一个复制品。)
AOF:redis会将每一个收到的写命令都通过Write函数追加到文件最后,类似于MySql的binlog。当redis重启时会通过重新执行文件中保存的写命令来在内存中重建整个数据库的内容。
当两种方式同时开启时,数据恢复redis会优先选择AOF恢复。
五、缓存雪崩
由于原有缓存失效,新缓存未到期间(例如:我们设置缓存时采用了相同的过期时间,在同一时刻出现大面积的缓存过期),所有原本应该访问缓存的请求都去查询数据库了,而对数据库、CPU和内存造成巨大压力,严重的会造成数据库宕机。从而形成一系列连锁反应,造成整个系统崩溃。
解决办法:大多数系统设计者考虑用加锁(最多的解决方案)或者队列的方式来保证不会有大量的线程对数据库一次性进行读写,从而避免失效时大量的并发请求落到底层存储系统上。还有一个简单方案就是将缓存失效时间分散开。
六、缓存穿透
七、缓存预热
八、缓存更新
九、缓存降级
十、Memcache与Redis的区别都有哪些
1)存储方式,Memcache把数据全部存在内存之中,断点后会挂掉,数据不能超过内存大小。Redis有部分存在硬盘上,Redis可以持久化其数据。
2)数据支持类型,Memcache所有的值均是简单的字符串,Redis作为其替代者,支持更丰富的数据类型,提供string、list、set、zset、hash等数据结构的存储。
3)使用底层模型不同,它们之间底层实现方式以及与客户端之间通信的应用协议不一样。Redis直接自己构建了VM机制,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求。
4)value值大小不同,Redis最大可以达到512M,Memcache只有1M。
5)Redis的速度比Memcache快很多。
6)Redis支持数据的备份,即master-slave模式的数据备份。
十一、单线程的Redis为什么这么快
1)纯内存操作。
2)单线程操作,避免了频繁的上下文切换。
3)采用了非阻塞I/O多路复用机制。
十二、有没有尝试进行多机Redis的部署?如何保证数据一致的?
主从复制,读写分离
一类是主数据库(master)一类是从数据库(slave),主数据库可以进行读写操作,当发生写操作的时候自动将数据同步到从数据库,而从数据库一般是只读的,并接收主数据库同步过来的数据,一个主数据库可以有多个从数据库,而一个从数据库只能有一个主数据库。
十三、Redis常见性能问题和解决方案
1)Master最好不要做任何持久化工作,如RDB内存快照和AOF日志文件。
2)如果数据比较重要,某个Slave开启AOF备份数据,策略设置为每秒同步一次。
3)为了主从复制的速度和连接的稳定性,Master和Slave最好在同一个局域网内。
4)尽量避免在压力很大的主库上增加从库。
5)主从复制不要用图状结构,用单向链表结构更为稳定,即:Master < Slave1 < Slave2 < Slave
十四、Redis的数据类型,已经每种数据类型的使用场景
1)String
最常规的set/get操作,value可以是String也可以是数字。一般做一些复杂的计数功能的缓存。
2)hash
这里value存放的是结构化的对象,比较方便的就是操作其中的某个字段。(做单点登录的时候,用这种数据结构存储用户信息,已cookiedId作为key,设置30分钟为缓存过期时间,能很好的模拟出类似session的效果。)
3)list
使用list的数据结构,可以做简单的消息队列的功能。另外还有一个就是,可以利用lrange命令,做基于redis的分页功能,性能极佳,用户体验好。(生产者和消费者的场景,list可以很好的完成排队,先进先出的原则。)
4)set
因为堆放的是一堆不重复的集合,所以可以做全局去重的功能。为什么不用JVM自带的Set进行去重?因为我们的系统一般都是集群部署,使用JVM自带的Set,比较麻烦,难道为了做一个全局去重,再起一个公共服务,太麻烦了。另外,就是利用交集、并集、差集等操作,可以计算共同喜好,全部的喜好,自己独有的喜好等功能。
5)sorted set
sorted set多了一个权重参数score,集合中的元素能够按score进行排列。可以做排行榜应用,取TOP N操作。
十五、对于大量的请求怎么样处理
redis是一个单线程程序,也就是说同一时刻它只能处理一个客户端请求;
redis是通过I/O多路复用来处理多个客户端请求的。
十六、Redis如何做内存优化
尽量使用Redis的散列表,把相关的信息放到散列表里面存储,而不是把每个字段单独存储,这样可以有效的减少内存使用。比如将Web系统的用户对象放到散列表里面再整体存储到Redis,而不是把用户的姓名、年龄、密码、邮箱等字段分别设置key进行存储。