Redis的学习之路

1.Redis概述

1.1 Redis由来

2008年,意大利的一家创业公司Merzia推出了一款基于MySQL的网站实时统计系统LLOOGG,然而没过多久该公司的创始人 Salvatore Sanfilippo便 对MySQL的性能感到失望,于是他决定亲自为LLOOGG量身定做一个数据库,并于2009年开发完成,这个数据库就是Redis。 不过Salvatore Sanfilippo并不满足只将Redis用于LLOOGG这一款产品,而是希望更多的人使用它,于是在同一年Salvatore Sanfilippo将Redis开源发布,并开始和Redis的另一名主要的代码贡献者Pieter Noordhuis一起继续着Redis的开发,直到今天。
Salvatore Sanfilippo自己也没有想到,短短的几年时间,Redis就拥有了庞大的用户群体。Hacker News在2012年发布了一份数据库的使用情况调查,结果显示有近12%的公司在使用Redis。国内如新浪微博、街旁网、知乎网,国外如GitHub、Stack Overflow、Flickr等都是Redis的用户。
VMware公司从2010年开始赞助Redis的开发, Salvatore Sanfilippo和Pieter Noordhuis也分别在3月和5月加入VMware,全职开发Redis。

Redis官网: https://redis.io

1.2 什么是Redis

Redis是用C语言开发的一个开源的高性能键值对(key-value)数据库。它通过提供多种键值数据类型来适应不同场景下的存储需求,目前为止Redis支持的键值数据类型如下:

  • 1、 字符串类型
  • 2、 散列类型
  • 3、 列表类型
  • 4、 集合类型
  • 5、 有序集合类型

2 为什么使用Redis

性能:
Redis完全开源免费,遵守BSD协议,是高性能的key-value数据库。

性能高执行速度快,对于一些耗时久且结果不会频繁变动的SQL,我们就可以将运行结果放入缓存。这样后面的请求就去缓存中读取,使得请求能够迅速响应。
在这里插入图片描述
用于解决高并发的问题:
当所有请求直接访问数据库,数据库极容易出现连接异常。这个时候就需要使用Redis做一个缓存,让请求先访问到redis,而不是直接访问数据库。在分布式系统中有着极其广泛的应用。
在这里插入图片描述

3 Redis 的应用场景

  • 缓存(数据查询、短连接、新闻内容、商品内容等等)。(最多使用)
  • 聊天室的在线好友列表。
  • 任务队列。(秒杀、抢购、12306等等)
  • 应用排行榜。
  • 网站访问统计。
  • 数据过期处理(可以精确到毫秒)
  • 分布式集群架构中的session分离。
一. String
这个其实没啥好说的,最常规的set/get操作,value可以是String也可以是数字。一般做一些复杂的计数功能的缓存。

(二)hash
这里value存放的是结构化的对象,比较方便的就是操作其中的某个字段。博主在做单点登录的时候,就是用这种数据结构存储用户信息,以cookieId作为key,设置30分钟为缓存过期时间,能很好的模拟出类似session的效果。

(三)list
使用List的数据结构,可以做简单的消息队列的功能。另外还有一个就是,可以利用lrange命令,做基于redis的分页功能,性能极佳,用户体验好。

(四)set
因为set堆放的是一堆不重复值的集合。所以可以做全局去重的功能。为什么不用JVM自带的Set进行去重?因为我们的系统一般都是集群部署,使用JVM自带的Set,比较麻烦,难道为了一个做一个全局去重,再起一个公共服务,太麻烦了。
另外,就是利用交集、并集、差集等操作,可以计算共同喜好,全部的喜好,自己独有的喜好等功能。

(五)sorted set

sorted set多了一个权重参数score,集合中的元素能够按score进行排列。可以做排行榜应用,取TOP N操作。另外,参照另一篇《分布式之延时任务方案解析》,该文指出了sorted set可以用来做延时任务。最后一个应用就是可以做范围查找。

4. Redis 的特性

一、速度快

    这主要时因为这些数据都时存在雨内存中的。另外当你打开Redis的源码时,你会发现Redis都是用C语言写的,C语言时最接近计算级语言的,且只有五万行代码,从而保证了Redis的速度。同时,因为Redis是单线程的,因为单线程在内存中是效率最高的。

二、持久化

    Redis的持久化可以保证将内存中的数据每隔一段时间就保存在磁盘中,重启的时候会重新加载到内存中。齿芥花方式是RDB和AOF。(RDB和AOF区别在最后)

三、支持多种数据结构

    Redis支持哈希、集合、BitMaps、还有位图(用于活跃用户数统计等)、HyperLogLog(超小内存唯一值计数)、GEO(地理信息定位)。

四、支持多种编程语言

    支持Java、PHP、Python、Ruby、Lua、Nodejs。

五、功能丰富

    如发布订阅、Lua脚本、事物、Pipeline(管道,即当指令到达一定数量后,客户端才会执行)。

六、简单

    不依赖外部库、单线程、只有23000行的Code。

七、主从复制

    主节点的数据做副本、这事做高可用的基石。

八、高可用和分布式

    Redis-Sentinel(v2.8)支持高可用、Redis-Cluster(v3.0)支持分布式。

5. Redis 优势及缺点

优势:

- 性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。
- 丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
- 原子 – Redis的所有操作都是原子性的,同时Redis还支持对几个操作全并后的原子性执行。
- 丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。

缺点:

存和数据库双写一致性问题
缓存雪崩问题
缓存击穿问题
缓存的并发竞争问题

关于 Redis 疑难问题

在各种场景中,无论是什么架构,你都可以将 Redis 融入项目中来,这可以解决很多关系数据库无法解决的问题。

比如,现有数据库处理缓慢的任务,或者在原有的基础上开发新的功能,都可以使用 Redis。但大家在实践中总会遇到难题,下面我们盘点一下:

1. redis和数据库双写一致性问题

一致性问题是分布式常见问题,还可以再分为最终一致性和强一致性。数据库和缓存双写,就必然会存在不一致的问题。答这个问题,先明白一个前提。就是如果对数据有强一致性要求,不能放缓存。我们所做的一切,只能保证最终一致性。另外,我们所做的方案其实从根本上来说,只能说降低不一致发生的概率,无法完全避免。因此,有强一致性要求的数据,不能放缓存。

推荐看《分布式之数据库和缓存双写一致性方案解析》给出了详细的分析 首先,采取正确更新策略,先更新数据库,再删缓存。其次,因为可能存在删除缓存失败的问题,提供一个补偿措施即可,例如利用消息队列。

2. 如何应对缓存穿透和缓存雪崩问题

这两个问题,在一般中小型软件企业中,很难碰到这个问题。如果有大并发的项目,流量有几百万+左右会碰到 意思是说故意去请求缓存中不存在的数据,导致所有的请求都访问数据库上,从而数据库连接异常 目前接触不到

发布了31 篇原创文章 · 获赞 11 · 访问量 819

猜你喜欢

转载自blog.csdn.net/Eros1onz/article/details/105049997