Redis的使用和认识
目录
1.Redis的认识
2.Memcached和redis的区别和联系
3.为什么要用redis/为什么要用缓存
4.Redis的单线程模型
5.Redis的过期时间
6.Redis 保证持久化
7.Redis遇到的问题
1.Redis的认识
redis是一个高性能的 key-value 数据库,
是使用C语言开发的数据库,
它和传统数据库不一样的是redis的数据存在内存中,也就是说,它是内存数据 库,所以读写速度很快,
因此redis经常用于缓存。
2.Memcached和redis的区别和联系
相同点:
都是内存数据库,一般都用来做缓存。
都有过期策略。
性能都很高。
不同点:
redis支持多种数据类型。它除了支持简单的k/v类型【String :⼀般常⽤在需要计数的场景,⽐如⽤户的访问次数、热点⽂章的点赞转发数量 】,还支持list【存有序可重复,朋友圈点赞】、set【存无序不重复,共同好友】、hash【 存map,系统中对象数据的存储 】、sorted_set【 各种礼物排行榜】等类型的数据结构;Memcached只支持k/v数据类型。
redis支持数据的持久化,可以把内存中的数据保存到磁盘,重启后,可以再加载使用,而Memcached把数据全部保存到内存中。
redis有灾难恢复机制。因为可以把缓存中的数据持久化到磁盘上。
redis在服务器内存使用完后,可以把不用的数据放到磁盘。但是Memcached在服务器内存使用完后,会直接报异常。
Memcached没有原生的集群模式,需要靠客户端往集群中分片写入数据;但是Redis目前是原生支持cluster 模式的。
Memcached是多线程,非阻塞I/O复用网络模型;Redis是单线程的多路I/O复用模型。(Redis6.0引入了多 线程I/O)
Memcached过期数据的删除策略,只有惰性删除;而Redis同时使用了惰性删除和定期删除。
3.为什么要用redis/为什么要用缓存
高性能:提高用户体验
如果用户第一次访问数据库中的某些数据,过程会很慢。但是用户访问的数据如果是高频数据而且不经常改变的 话,我们就可以把它存到缓存中。这样可以保证用户下一次再访问这些数据的时候,访问速度更快。
高并发:应对更多的用户
直接操作缓存可以承受的数据库请求数量远大于直接访问数据库的,所以我们可以把数据库中的部分数据转移 到缓存中,这样一部分的请求会直接到缓存,不用经过数据库,我们也就提高了系统整体的并发能力。
4.Redis的单线程模型
Redis采用多路IO复用模型,也就是监听多个套接字,每个套接字关联不同的事件处理器。
使用单线程的好处:
单线程编程容易并且更容易维护;
Redis 的性能瓶颈不再 CPU ,主要在内存和⽹络;
多线程就会存在死锁、线程上下⽂切换等问题,甚⾄会影响性能。
但是Redis6.0开始引入多线程:来提⾼⽹络 IO 读写性能,
Redis6.0 的多线程默认是禁⽤的,只使⽤主线程。如需开启需要修改 redis 配置文件 io-threads-do-reads:yes;开启多线程后,还需要设置线程数,否则是不⽣效的:io-threads 4
5.Redis的过期时间
一方面设置过期时间来减少内存,否则会出现堆内存溢出的现象;另一方面设置过期时间是因为有一些业务就是需要某个数据在一段时间内出现,比如:短信验证码在60s内存在。
Redis的过期时间是通过过期字典来保存过期数据的。过期字典的键指向 Redis数据库中的某个key(键),过期字典的值是⼀个long long类型的整数,这个整数保存了key所 指向的数据库键的过期时间。
Redis过期数据的删除策略:
- 惰性删除:只会在取出key的时候才对数据进行过期检查。这样对CPU最友好,但是可能会 造成太多过期 key 没有被删除。
- 定期删除:每隔⼀段时间抽取⼀批 key 执行删除过期key操作。
Redis的内存淘汰机制:
仅仅通过给 key 设置过期时间还是可能存在定期删除和惰性删除漏掉了很多过期 key 的情况。
- 从已经设置过期时间的数据集中挑选最少使用的数据淘汰;
- 从已经设置过期时间的数据集中挑选即将过期的数据淘汰;
- 从已经设置过期时间的数据集中挑选随机的数据淘汰;
- 从已经设置过期时间的数据集中挑选最不经常使用的数据淘汰;
- 当内存不⾜以容纳新写⼊数据时,挑选最少使用的数据淘汰;
- 当内存不⾜以容纳新写⼊数据时,挑选即将过期的数据淘汰;
- 当内存不⾜以容纳新写⼊数据时,挑选随机的数据淘汰;
- 当内存不⾜以容纳新写⼊数据时,挑选最不经常使用的数据淘汰。
6.Redis 保证持久化
快照:获得存储在内存⾥面的数据在某个时间点上的副本。
可以将快照复制到其他服务器从⽽创建具有相同数据的服务器副本,还可以将快照留在原地以便重启服务器的时候 使⽤。
只追加:与快照持久化相⽐,AOF 持久化 的实时 性更好
appendfsync always # 每次有数据修改发⽣时都会写⼊AOF⽂件,这样会严重降低Redis的速度
appendfsync everysec # 每秒钟同步⼀次,显示地将多个写命令同步到硬盘
appendfsync no # 让操作系统决定何时进行同步
7.Redis遇到的问题
缓存穿透:
问题:高并发情况下,由于缓存和数据库中都没有需要的数据。
解决:
客户端进行授权(判断id>0)
在缓存中缓存空数据(key=-1,value=null,需要设置失效时间)
布隆过滤器:把所有可能查询的参数放在布隆过滤器中,当用户发送请求,先判断查询的参数是否在布隆过滤器 中。不存在的话,直接返回请求参数错误信息给客户端。
缓存击穿:
问题:大量并发访问同一个数据,缓存中没有,但是数据库中有(可能失效了)
解决:
热点数据永不失效(不推荐)
互斥锁
缓存雪崩:
问题:大量并发访问不同的数据,缓存中没有数据,但数据库中有。
解决:
针对redis服务不可用:
如果缓存数据库是分布式部署,将热点数据均匀分布在不同的缓存数据库中,设置热点数据永不过期。
限流,避免同时处理大量请求。
针对缓存失效的情况:
设置不同的失效时间,比如随机设置缓存失效时间。
Redis的使用和认识相关推荐
- Spring AOP + Redis解决重复提交的问题
Spring AOP + Redis解决重复提交的问题 用户在点击操作的时候,可能会连续点击多次,虽然前端可以通过设置按钮的disable的属性来控制按钮不可连续点击,但是如果别人拿到请求进行模拟,依 ...
- Redis问题——Error: 磁盘在使用中,或被另一个进程锁定。
Redis出于对数据保护,默认只能本地客户端连接.远程连接就会出现以上错误.如何解决这一问题,看下: server -A,PC-A, 修改server-A的redis.conf:注释掉本地绑定: bi ...
- 实现 连续15签到记录_MySQL和Redis实现用户签到,你喜欢怎么实现?
现在的网站和app开发中,签到是一个很常见的功能 如微博签到送积分,签到排行榜 微博签到 如移动app ,签到送流量等活动, 移动app签到 用户签到是提高用户粘性的有效手段,用的好能事半功倍! 下面 ...
- Redis 笔记(16)— info 指令和命令行工具(查看内存、状态、客户端连接数、监控服务器、扫描大key、采样服务器、执行批量命令等)
Info 命令返回关于 Redis 服务器的各种信息和统计数值.通过给定可选的参数 section ,可以让命令只返回某一部分的信息. 1. 显示模块 server : 一般 Redis 服务器信息, ...
- Redis 笔记(15)— 管道 pipeline(客户端将批量命令打包发送用来节省网络开销)
Redis 是一种基于客户端-服务端模型以及请求/响应协议的 TCP 服务.这意味着通常情况下一个请求会遵循以下步骤: 客户端向服务端发送一个查询请求,并监听 Socket 返回,通常是以阻塞模式,等 ...
- Redis 笔记(14)— 持久化及数据恢复(数据持久方式 RDB 和 AOF、数据恢复、混合持久化)
1. 持久化 所谓持久化是指将数据从内存中以某种形式同步到硬盘中,在 Redis 重启后能够根据硬盘中的记录恢复数据.Redis 持久化有两种方式,分别为 RDB(redis data base) [ ...
- Redis 笔记(13)— scan 和 keys 寻找特定前缀key 字段(命令格式、使用示例、定位大key)
1. keys Redis 提供了一个简单暴力的指令 keys 用来列出所有满足特定正则字符串规则的 key. 127.0.0.1:6379> keys * (empty array) 127. ...
- Redis 笔记(12)— 单线程架构(非阻塞 IO、多路复用)和多个异步线程
Redis 使用了单线程架构.非阻塞 I/O .多路复用模型来实现高性能的内存数据库服务.Redis 是单线程的.那么为什么说是单线程呢? Redis 在 Reactor 模型内开发了事件处理器,这个 ...
- Redis 笔记(11)— 文本协议 RESP(单行、多行字符串、整数、错误、数组、空值、空串格式、telnet 登录 redis)
RESP 是 Redis 序列化协议Redis Serialization Protocol 的简写.它是一种直观的文本协议,优势在于实现异常简单,解析性能极好. Redis 协议将传输的结构数据 ...
- Redis 笔记(10)— 发布订阅模式(发布订阅单个信道、订阅信道后的返回值分类、发布订阅多个信道)
1. 发布-订阅概念 发布-订阅 模式包含两种角色,分别为发布者和订阅者. 订阅者可以订阅一个或者若干个频道(channel): 而发布者可以向指定的频道发送消息,所有订阅此频道的订阅者都可以收到此消 ...
最新文章
- java项目怎样强制删除手机缓存_Myeclipse清理项目缓存的几大方法
- Hadoop生成HFile直接入库HBase心得
- Java堆内存是线程共享的!面试官:你确定吗?
- Mysql之外连接_OUTER JOIN
- Shady 深度学习课程
- 【惊天】京东任命周伯文担任京东云与AI事业部负责人 全面负责AI、云计算、IoT三大技术领域!
- 动画分析步骤“三步曲”
- Theano 中文文档 0.9 - 5.2 Mac OS安装说明
- 50秒开门,3分钟开走,特斯拉Model S就这样不翼而飞
- python中惩罚的代码_如何只为在python中使用的实现支付依赖惩罚?
- 行业研究方法与框架合集
- 微信小程序不支持使用本地图片设置背景图片解决方法
- 解决网络栏只剩下飞行模式
- 用BAT创建文件夹,创建文件,回显环境变量
- 阿里云虚拟主机项目根目录指向public目录下
- 2017华为实习生招聘机考模拟题——0交换排序
- JAVAswing编写界面
- 仓库码放要求_仓库货物堆放标准是怎样的?货物堆放原则和方法详解
- 五十二.用户配额管理 云主机类型管理 、 镜像管理 网络管理 案例和实例管理 、 安装额外计算节点...
- PHPExcel导出Excel基本操作,实现设置字体、合并单元格、加粗等功能
热门文章
- redis存取数据流
- python pandas中 inplace 参数理解
- 静态路由出接口和下一跳
- 你看到的是乱,我看到的是月亮,如是而已。
- go-micro使用Grpc
- “SqlSession[xxx] was not registered for synchronization because synchronization is not active”问题成功解决
- NEUQ图灵杯之A题——蔡老板的会议
- 用java实现的文本编辑器可以媲美windows自带的编辑器吗?(功能全,超详细)
- 在北京注册公司的全过程
- flutter创建/导入区块链钱包,获取余额