Redis
2023-04-23 23:51:40 0 举报
AI智能生成
Redis基础学习
作者其他创作
大纲/内容
Redis的缺点
不提供Sql支持,学习和使用成本较高
一般没有事务处理
复杂的查询方面不太行
为什么使用Redis
高性能
因为用户第一次访问数据库中的某些数据,这个过程会比较慢,原因是因为它是从硬盘上读取的,所以这时候就需要Redis了,第一次用户去数据库里查询某些数据,查询到顺便把这些数据放到redis里,这样下次访问直接从redis上读取,至于为什么用redis是因为它是直接操作内存的,所以速度相当快,以后数据库内容改变,只需要同步redis就行
高并发
因为Redis能承受住的请求远远大于直接访问数据库,所以可以把数据库里的某些数据放到Redis里,这样用户的一部分请求会直接到Redis这里而不需要经过数据库,一般放的数据大概都是一些访问多的或者一些临时或者实时更新的数据.比如:排行榜,热门视频,图片,文章或者推荐商品.
Redis的持久化
Redis提供了两种持久化的方式
RDB(Redis DataBase)
就是再不同的时间点,将Redis存储的数据生成快照并且存储到磁盘等介质上
AOF(Append Only File)
则是换了一个角度来实现持久化,将Redis执行过的所有写指令记录下来,在下次redis重新启动时,只要把这些写指令从前到后重新执行一遍,就可以实现数据恢复了.
ROB和AOF可以同时使用,在这情况下,如果redis重新启动的话,则会优先AOF方式进行数据恢复,这是因为AOD方式恢复数据完整度更高
Redis里的问题
redis和数据库双写一致性问题
这个问题很常见,因为加入了缓存之后,请求是先从Redis中查询,如果redis中存在数据就不会走数据库了,如果不能保证缓存和数据库的一致性就会导致请求获取到的数据不是最新的数据.
解决方案
编写删除缓存的接口,在更新数据库的同时,调用删除缓存的接口删除缓存中的数据.但是这么做会有耦合高以及调用接口失败的情况
消息队列: ActiveMQ,消息通知
redis的并发竞争问题
并发竞争,指的是同时有多个子系统去set同一个key值
解决方案
争抢,意思就是准备一个分布式锁,谁抢到这个锁,谁就做Set操作
redis雪崩问题
即缓存同一时间大面积的失效,这个时候又来了一波请求,结果请求都进不去,堆积在数据据库上,从而导致数据库连接异常
解决方案
给缓存的失效时间,加上一个随机值,避免集体失效
使用互斥锁,但是有弊端,它的吞吐量会下降
搭建redis集群
redis击穿问题
去请求缓存中不存在的数据,会导致所有的请求都堆积在数据库上,会让数据库连接异常
解决问题
利用互斥锁,当缓存失效的时候,先去获得锁,得到锁后去请求数据库,如果没有得到锁,则休眠一段时间然后在重试
采用异步更新策略,无论key是否取到值,都直接返回,value值中维护一个缓存失效的时间,缓存如果过期,异步起一个线程去读数据库,更新缓存.
redis穿透问题
缓存穿透是指缓存和数据库中都没有的数据,而用户不断发起请求,如发起为id为"-1"的数据或id为特别大不存在的数据。这时的用户很可能是攻击者,攻击会导致数据库压力过大.
解决案例
接口层增加校验,如用户鉴权校验,id做基础校验,id<=0的直接拦截
从缓存取不到的数据,在数据库中也没有取到,这时也可以将key-value对写为key-null,缓存有效时间可以设置短点,如30秒(设置太长会导致正常情况也没法使用)。这样可以防止攻击用户反复用同一个id暴力攻击
Redis介绍
是C语言开发的一个开源的(遵从BSD协议)高性能非关系型(NoSQL)的(key-value)键值对数据库,并且存入的数据都在内存里.
可以作为数据库,缓存,消息中间件等.
适用于热点,商品
例如:热门新闻,畅销商品等等
Redis存储结构
String: 字符串
它是redis的最基本的类型
一个key对应一个value
是二进制安全的
最大存储512MB
Hash: 散列
是一个键值对集合
Hash类型极其类似于java中的Map
该类型非常适合于存储java中对象的信息
每个Hash可以存储2的32平方-1键值对(大约40多亿)
List: 列表
是最简单的字符串列表
List类型底层是一个双向字符串链表。里面的元素是有序的,可重复的
我们可以从链表的任何一端进行元素的增删
每个列表可以存储40多亿
Set: 集合
Set类型底层是一张hash表。里面的元素是无序的,不可重复的
每个集合可以存储40多亿个成员
Zset: 有序集合
也称sortedSet
和set一样也是String类型元素的集合,且不允许重复的成员,但是他俩不同的是每个元素都会关联一个double类型的分数.
通过分数在集合中的成员从小到大排序
Zset的成员是唯一的,但是分数(score)可以重复
Redis的优点
因为是纯内存操作,所以Redis的性能非常出色,每秒可以处理超过10万次读写操作,是已知性能最快的键值对数据库.Redis支持事务,持久化
单线程操作,避免了频繁的上下文切换
成本低:部署简单,都是开源的
0 条评论
下一页
为你推荐
查看更多