redis理解

1、redis是什么
Redis是完全开源免费的,遵守BSD协议,高性能,非关系、Key-Value数据库,通常称为数据结构服务器;它存储了五种不同类型值的键映射。用作数据库,缓存和消息代理。
Redis和其他键值数据库之间的主要区别之一是Redis存储和操作高级数据类型的能力。这些数据类型是大多数开发人员熟悉的基本数据结构(列表,映射,集合和排序集)。Redis的卓越性能,简单性和数据结构的原子操作有助于解决使用传统关系数据库实现时难以实现或执行不佳的问题。
2、redis使用场景
2.1、redis可以做什么
缓存:毫无疑问这是Redis当今最为人熟知的使用场景,在提升服务器性能方面非常有效
排行榜:如果使用传统的关系型数据库来做这个事儿,非常的麻烦,而利用Redis的SortSet数据结构能够非常方便搞定
计算器:利用Redis中原子性的自增操作,我们可以统计比如用户点赞数、用户访问数等等数据,这些数据如果用MySQL,频繁的读写会带来很大的压力
限速器:限速器比较典型的使用场景是限制某个用户访问某个API的频率,常用的有抢购时,防止用户疯狂点击带来不必要的压力
好友关系:利用集合的一些命令,比如求交集、并集、差集等。可以方便搞定一些共同好友、共同爱好之类的功能
简单消息队列:除了Redis自身的发布/订阅模式,也可以利用List来实现一个队列机制,比如:通知、邮件发送之类的需求,不需要高可靠,但是会带来非常大的DB压力,完全可以用List来完成异步解耦
Session共享:默认Session是保存在服务器的文件中,如果是集群服务,同一个用户过来可能落在不同机器上,这就会导致用户频繁登陆,采用Redis保存Session后,无论用户落在那台机器上都能够获取到对应的Session信息。
2.2、redis不擅长的事
redis感觉擅长的事情很多,但不是万能的,合适的地方用它事半功倍。如果滥用可能导致系统的不稳定、成本增高等等问题。
比如,用Redis去保存用户的基本信息,虽然它能够支持持久化,但是它的持久化方案并不能保证数据绝对的落地,并且还可能带来Redis性能下降,因为持久化太过频繁会增大Redis服务的压力。
就是数据量太大、数据访问频率非常低的业务都不适合使用Redis,数据太大会增加成本,访问频率太低,保存在内存中纯属浪费资源。
3、为什么要使用redis
上面说了这么多场景的解决方案也有很多其它选择,比如缓存可以用Memcache,Session共享还能用MySql来实现,消息队列可以用RabbitMQ,为什么一定要用Redis呢?
速度快,完全基于内存,使用C语言实现,网络层使用epoll解决高并发问题,单线程模型避免了不必要的上下文切换及竞争条件。
注意:单线程仅仅是说在网络请求这一模块上用一个线程处理客户端的请求,像持久化它就会重开一个线程/进程去进行处理
丰富的数据类型,Redis有8种数据类型,当然常用的主要是 String、Hash、List、Set、 SortSet 这5种类型,他们都是基于键值的方式组织数据。每一种数据类型提供了非常丰富的操作命令,可以满足绝大部分需求。
总结起来就是在大并发,高负载的网站中必须考虑。redis数据库中的所有数据都存储在内存中。由于内存的读写速度远快于硬盘,因此Redis的的的在性能上对比其他基于硬盘存储的数据库有非常明显的优势。
3.1、性能
在碰到需要执行耗时特别久,且结果不频繁变动的SQL,就特别适合将运行结果放入缓存。这样,后面的请求就去缓存中读取,使得请求能够迅速响应。如下图所示:
在这里插入图片描述
3.2、并发
大并发的情况下,所有的请求直接访问数据库,数据库会出现连接异常。这时就需要使用的的Redis的做一个缓冲操作,让请求先访问到的Redis的,而不是直接访问数据库。如下图所示:
在这里插入图片描述 3.3、redis为什么这么快?
纯内存操作
单线程操作,避免了频繁的上下文切换
采用了非阻塞I/O多路复用
4、缺点
缓存与数据库双写一致性问题
缓存穿透问题
缓存雪崩问题
缓存并发竞争问题
5、redis各种数据类型及其使用场景
5.1、String
最常规的set/get操作,value可以是String也可以是数字。一般做一些复杂的计数功能的缓存。
5.2、hash
value存放的是结构化的对象,比较方便的就是操作其中的某个字段。在做单点登录的时候,可以用这种数据结构存储用户信息,以cookieId作为key,设置30分钟为缓存过期时间,能很好的做出类似session的效果。
5.3、list
可以做简单的消息队列的功能。另外还有一个就是,可以利用lrange命令,做基于redis的分页功能,性能极佳,用户体验好。
5.4、set
因为set堆放的是一堆不重复值的集合。所以可以做全局去重的功能。为什么不用JVM自带的Set进行去重?因为我们的系统一般都是集群部署,使用JVM自带的Set,比较麻烦,难道为了一个做一个全局去重,再起一个公共服务,太麻烦了。
5.5、sorted set
sortedset多了一个权重参数score,集合中的元素能够按score进行排列,可以做排行榜系统。
6.、思考
redis的过期策略以及内存淘汰机制
redis和数据库双写一致性问题
缓存穿透问题
缓存雪崩问题

安利一门超级好课!
扫码下单输优惠码【csdnfxzs】再减5元,比官网还便宜!
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Alinlx

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值