博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
redis
阅读量:3942 次
发布时间:2019-05-24

本文共 3839 字,大约阅读时间需要 12 分钟。

文章目录

redis是什么?

Redis 是一个基于内存的高性能key-value数据库。 数据存储在内存中,访问的速度较快

什么时候用到redis?

  • 会话缓存
  • 全页缓存
  • 发布/订阅
  • 队列
  • 排行榜/计数器

redis的优点有哪些?

  • redis的速度快,因为数据存储在内存上,相比于关系型的数据库来说,读写的速度更快。
  • 支持丰富的数据类型,string、set、hash、list 、sort set
  • 支持事务,操作都是原子性,所谓的原子性就是对数据的更改要么全部执行,要么全部不执行 事务是一组操作的集合,事务不具有原子性
  • 丰富的特性:可用于缓存,消息,按key设置过期时间,过期后将会自动删除

redis的缺点由哪些

  • 缓存雪崩的问题
    (缓存在同一时间内大量过期,随后大量的请求落在数据可上导致连接异常)
  • 缓存和数据库之间的数据一致性的问题
    (缓存无法保证强缓存一致性,如果允许有一定的不一致性的出现,可以使用缓存)
  • 缓存击穿的问题
    (恶意用户模拟请求很多缓存中不存在的数据,由于缓存中不存在这些数据,导致这些请求落在数据库上,数据库中也没有,返回为空,一直重复,导致数据库异常)
  • 缓存的并发竞争问题
    (多个客户端同时发送请求,由于redis 是单线程,在同一时刻只能处理一个请求,其他的请求会阻塞等待)

redis 相比于memcached由哪些好处

  • memcached所有的值均是简单的字符串,redis作为其替代者,支持更为丰富的数据类型
  • redis的速度比memcached快很多
  • redis可以持久化其数据
  • memcached采用的是多线程非阻塞IO复用,redis采用的是单线程的IO复用,单线程消除了并发控制的开销。

redis 采用单进程单线程的为什么这么快

消除了传统数据库并发控制产生的开销

单线程消除了线程/进程频繁的上下文切换的开销
纯内存操作
采用非阻塞IO复用的机制

redis 并发竞争问题如何解决

redis 采用了单进程单线程,采用队列模式将并发访问改为串行访问,对于多个客户端链接不存在竞争。但是如果多个客户端并发请求连接的过程,可能出现连接超时、阻塞、客户端连接关闭等错误

解决方案:
1、客户端角度:创建连接池
2、服务器角度:用setnx 实现锁

redis 持久化

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文件中了。

redis 发布与订阅

用于同一频道的客户端之间的通信

redis事务处理

  1. MULTI用来组装一个事务;
  2. EXEC用来执行一个事务;
  3. DISCARD用来取消一个事务;
  4. WATCH用来监视一些key,一旦这些key在事务执行之前被改变,则取消事务的执行。

redis的c++接口函数的使用

#include 
redisConnect()redisCommand()redisCommandArgv()//redisFree() //释放一个链接freeReplayObject() //释放一个获取的结果redisAppendCommandArgv() //redisAppentCommend()//

redis 数据结构以及应用的场景

分析:是不是觉得这个问题很基础,其实我也这么觉得。然而根据面试经验发现,至少百分八十的人答不上这个问题。建议,在项目中用到后,再类比记忆,体会更深,不要硬记。基本上,一个合格的程序员,五种类型都会用到。

回答:一共五种

(一)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 缓存中的数据都是经常被访问的热点数据,不经常被访问的数据会再一定的时间后被redis清除。

redis 与memcached 的区别

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常见的性能问题以及解决方案

  • master 最好不要做任何持久化的工作
  • 对与关键数据,采用某个slove数据库来进行AOF备份数据
  • 尽量避免在压力较大的主库上增加从库
  • 为了主从复制的速度和链接的稳定性,master和slove最好在同一个局域网内
  • 为了master 的稳定性,不采用图状的数据结构,而采用单链表的结构,master—>slove—>solve…,当master 主库挂掉了,可以直接启用下一个slove作为master.

redis 的数据淘汰策略

能够保证当前内存中的数据都是热点数据,

  • 回收最少使用的键
  • 回收最少使用的设置过期时间的集合的键
  • 回收随机的键
  • 回收随机的设置过期时间的集合的键
  • 从设置过期时间的集合中删除
  • noeviction:不回收键,新的数据不能写入到数据库中,(返回错误,禁止回收数据)

redis 大量数据的插入

redis 支持管道,通过管道插入大量的数据的效率较高,

redis命令从开始执行到返回,有一定的时延,大量的插入,即便是多个客户端的并发插入,效率也不会太高。一次redis 请求就要在客户端和服务器端调用一次write() 和 read() 操作,在linux中系统调用的开销是比较大的,
通过管道批量插入,只有一次的往返,节省了大量的往返的时延,减少了系统调用的次数,降低了系统的开销。

redis 分区

分区的优势:

  • 通过利用多台计算机,构建更大的数据库
  • 通过多核和多台计算机,允许扩展计算能力,通过多台计算机和网络适配器,可以扩展网络带宽。

分区的不足:

  • 涉及多个key的操作通常是不被支持的
  • 涉及多个key的事务不能使用
  • 采用分区,数据的操作较复杂
  • 增加或删除容量较复杂,

分区的类型:

  • 范围分区
  • 哈希分区

redis 持久化数据和缓存怎么扩容

通过集群的方式扩容,也可以通过分区的方式扩容。

转载地址:http://lanwi.baihongyu.com/

你可能感兴趣的文章
Codeforces Round #400 (Div. 1 + Div. 2, combined)D - The Door Problem(2-sat)
查看>>
IDEA中Struts2文件上传时404错误The origin server did not find a current representation for the target resour
查看>>
Perl/Tk 变量追踪及类线程实现
查看>>
1.嵌入式开发环境搭建--虚拟机安装(unbutu)系统
查看>>
2.嵌入式开发环境搭建--(unbutu)系统
查看>>
Linux USB驱动分析之USB2.0协议分析
查看>>
关于iwpriv :no private ioctls 的问题
查看>>
SQL Server Union等操作时解决不同数据库字符集冲突的问题
查看>>
Linq GroupJoin(二)
查看>>
递归:访问页面的控件或文件夹的下文件
查看>>
DataGridView分頁控件
查看>>
Linq 使用entity framework查询视图返回重复记录的问题(转)
查看>>
项目中得到执行文件版本或其它信息
查看>>
WinForm DatagridView绑定大量数据卡顿的问题
查看>>
DataGridView或 DataTable导出到excel
查看>>
Ilist To DataTable
查看>>
SQL @@IDENTITY, IDENT_CURRENT,SCOPE_IDENTITY
查看>>
簡單工廠模式
查看>>
SQL Server的數據類型
查看>>
允許文本框輸入數字,退格鍵,小數點,負號
查看>>