本文共 3839 字,大约阅读时间需要 12 分钟。
Redis 是一个基于内存的高性能key-value数据库。 数据存储在内存中,访问的速度较快
消除了传统数据库并发控制产生的开销
单线程消除了线程/进程频繁的上下文切换的开销 纯内存操作 采用非阻塞IO复用的机制redis 采用了单进程单线程,采用队列模式将并发访问改为串行访问,对于多个客户端链接不存在竞争。但是如果多个客户端并发请求连接的过程,可能出现连接超时、阻塞、客户端连接关闭等错误
解决方案: 1、客户端角度:创建连接池 2、服务器角度:用setnx 实现锁1. 快照保存(直接将数据库修改后的文件保存到本地的数据库)
在不同的时间点,将redis存储的数据生成快照存储在的磁盘上。 在持久化的过程中,先将数据写入到一个临时文件中,等到持久化过程结束,再用临时文件去替代上次持久化好的文件,正是这种特性,让我们可以随时来进行备份,因为快照文件总是完整可用的。 对于RDB方式,redis会单独创建(fork)一个子进程来进行持久化,而主进程是不会进行任何IO操作的,这样就确保了redis极高的性能。 如果需要进行大规模数据的恢复,且对于数据恢复的完整性不是非常敏感,那RDB方式要比AOF方式更加的高效。 虽然RDB有不少优点,但它的缺点也是不容忽视的。如果你对数据的完整性非常敏感,那么RDB方式就不太适合你,因为即使你每5分钟都持久化一次,当redis故障时,仍然会有近5分钟的数据丢失。所以,redis还提供了另一种持久化方式,那就是AOF。2. AOF 文件保存(将修改的指令保存在文件中)
AOF重写的内部运行原理,我们有必要了解一下。在重写即将开始之际,redis会创建(fork)一个“重写子进程”,这个子进程会首先读取现有的AOF文件,并将其包含的指令进行分析压缩并写入到一个临时文件中。
与此同时,主工作进程会将新接收到的写指令一边累积到内存缓冲区中,一边继续写入到原有的AOF文件中,这样做是保证原有的AOF文件的可用性,避免在重写过程中出现意外。
当“重写子进程”完成重写工作后,它会给父进程发一个信号,父进程收到信号后就会将内存中缓存的写指令追加到新AOF文件中。
当追加结束后,redis就会用新AOF文件来代替旧AOF文件,之后再有新的写指令,就都会追加到新的AOF文件中了。
用于同一频道的客户端之间的通信
#includeredisConnect()redisCommand()redisCommandArgv()//redisFree() //释放一个链接freeReplayObject() //释放一个获取的结果redisAppendCommandArgv() //redisAppentCommend()//
分析:是不是觉得这个问题很基础,其实我也这么觉得。然而根据面试经验发现,至少百分八十的人答不上这个问题。建议,在项目中用到后,再类比记忆,体会更深,不要硬记。基本上,一个合格的程序员,五种类型都会用到。
回答:一共五种(一)String
这个其实没啥好说的,最常规的set/get操作,value可以是String也可以是数字。一般做一些复杂的计数功能的缓存。(二)hash
这里value存放的是结构化的对象,比较方便的就是操作其中的某个字段。做单点登录的时候,就是用这种数据结构存储用户信息,以cookieId作为key,设置30分钟为缓存过期时间,能很好的模拟出类似session的效果。(三)list
使用List的数据结构,可以做简单的消息队列的功能。另外还有一个就是,可以利用lrange命令,做基于redis的分页功能,性能极佳,用户体验好。(四)set
因为set堆放的是一堆不重复值的集合。所以可以做全局去重的功能 另外,就是利用交集、并集、差集等操作,可以计算共同喜好,全部的喜好,自己独有的喜好等功能。(五)sorted set
sorted set多了一个权重参数score,集合中的元素能够按score进行排列。可以做排行榜应用,取TOP N操作。最后一个应用就是可以做范围查找。延时任务解析—订单30分钟没有确认自动取消等功能。
redis 数据结构
redis 持久化 redis 事务 redis 主从同步 redis 用作缓存的时候,过期策略以及内存淘汰机制保证了redis 缓存中的数据都是经常被访问的热点数据,不经常被访问的数据会再一定的时间后被redis清除。memcache 与 redis 的数据都是存放再内存上,但是redis的数据支持持久化,即再redis会定期将新的数据更新到磁盘上,所以redis服务器重启之后数据不会丢失,memcached服务器重启之后数据会丢失
redis 支持更多的数据结构,string 、list 、set 、sort set、hash redis 支持事务 redis 的速度更快 redis 能够支持的value的值为1G 而 memcached 能够支持的value的最大值为1M redis 物理内存用完的时候,可以将很久没用的交换到虚拟内存上 redis 支持数据库的备份 master-solved (主从)模式的数据备份能够保证当前内存中的数据都是热点数据,
redis 支持管道,通过管道插入大量的数据的效率较高,
redis命令从开始执行到返回,有一定的时延,大量的插入,即便是多个客户端的并发插入,效率也不会太高。一次redis 请求就要在客户端和服务器端调用一次write() 和 read() 操作,在linux中系统调用的开销是比较大的, 通过管道批量插入,只有一次的往返,节省了大量的往返的时延,减少了系统调用的次数,降低了系统的开销。分区的优势:
分区的不足:
分区的类型:
通过集群的方式扩容,也可以通过分区的方式扩容。
转载地址:http://lanwi.baihongyu.com/