一、什么是Redis?
Redis是用C语言开发的一个开源的高性能键值对(key-value)数据库。它通过提供多种键值数据类型来适应不同场景下的存储需求。目前为止Redis支持的键值数据类型如下:
二、Redis支持的键值数据类型:
1、 字符串类型(String),常规的set/get操作,value可以是String也可以是数字。一般做一些复杂的计数功能的缓存。
2、 散列类型(hash),value存放的是结构化的对象,比较方便的就是操作其中的某个字段。ps:hash被(string和json)取代了
3、 列表类型(list),使用List的数据结构,可以做简单的消息队列的功能。
4、 集合类型(set),set堆放的是一堆不重复值的集合,可以做全局去重的功能。
5、 有序集合类型(sorted set sorted set),多了一个权重参数score,集合中的元素能够按score进行排列。可以做范围查找。
三、redis的可以应用于哪些地方?
1、缓存(数据查询、短连接、新闻内容、商品内容等等)。
2、聊天室的在线好友列表。
3、任务队列。(秒杀、抢购、等)
4、应用排行榜。
5、网站访问统计。
6、数据过期处理(可以精确到毫秒)
7、分布式集群架构中的session分离。
四、为什么使用redis(优点)?
1、性能 ,我们在碰到需要执行耗时特别久,且结果不频繁变动的SQL,就特别适合将运行结果放入缓存。这样,后面的请求就去缓存中读取,使得请求能够迅速响应。
2、并发 ,在大并发的情况下,所有的请求直接访问数据库,数据库会出现连接异常。这个时候,就需要使用redis做一个缓冲操作,让请求先访问到redis,而不是直接访问数据库。
五、使用redis有什么缺点以及解决方案?
1、缓存和数据库双写一致性问题
原因:当一个数据需要更新时因为不可能做到同时更新数据库和缓存、那么此时读取数据的时候就一定会发生数据不一致问题,而数据不一致问题在金融交易领域的系统中是肯定不允许的。
解决措施:1、读的时候,先读缓存,缓存没有的话,就读数据库,然后取出数据后放入缓存,同时返回响应。 2、更新的时候,先更新数据库,然后再删除缓存。
2、缓存雪崩问题
原因:由于Redis是基于内存的应用,可以很容易做到高性能、高并发从而起到保护数据库的作用。如果缓存意外挂了、所有的请求落到了数据上就形成了缓存雪崩。
解决措施:1、事前:使用主从复制+哨兵或者Redis集群。Redis主从复制、Redis的哨兵机制、Redis集群环境搭建 2、事中:本地缓存结合限流和降级。基于注解的分布式限流组件 3、事后:开启持久化配置,实现快速缓存的快速恢复。 Redis 的持久化机制
3、缓存击穿问题
原因:热点key问题,当一个正有非常巨大的访问量访问的key 在失效的瞬间,大量的请求击穿了缓存,直接落到了数据库上,然后所有从数据获取到数据的线程又都并发的想要把数据缓存到redis中。
解决措施:1、使用互斥锁,同一时刻只允许一个线程去构建缓存,其他线程等待构建完毕后去缓存取 。2、定时更新,假如缓存过期时间为60分钟,则单独设置一个线程每59分钟去负责更新缓存
4、缓存的并发竞争问题
原因:1、可能是客户端同时并发写一个 key,可能本来应该先到的数据后到了,导致数据版本错了 2、或者是多客户端同时获取一个 key,修改值之后再写回去,只要顺序错了,数据就错了。
解决措施:1、针对客户端来的,在代码里要对redis操作的时候,针对同一key的资源,就先进行加锁(java里的synchronized或lock)。2、可以基于 zookeeper 实现分布式锁。每个系统通过 zookeeper 获取分布式锁,确保同一时间,只能有一个系统实例在操作某个 key,别人都不允许读和写。
来源:CSDN
作者:鲸语丶
链接:https://blog.csdn.net/hushilin_/article/details/104024478