一文带你了解什么是redis
这篇文章我来简单介绍它的发展与使用,所以就不阐述更高阶的知识了(事务,锁,集群),主要是为后面redis的使用来做铺垫
一、web的发展
谈到为什么使用redis不得不说web的发展
-
单机
一般的单机系统都可以承受几百到千级别的QPS,所以一般的官网,管理系统都采用单机部署,不需要采取任何措施都可以承受用户的访问。 -
缓存中间件的引入
但是随着互联网的发展,以及一些特殊的需求的出现,比如:秒杀,千万级数据变动等一些需求的出现,增加了系统的负载,一般的系统容易出现连接池满,或者响应时间过长导致无法满足业务要求,这个时候中间件的出现就很好的解决了这个问题。
举两个例子
- 假如系统中有2千万用户信息,用户信息基本固定,一旦录入很少变动,那么你每次加载所有用户信息时,如果都要请求数据库,数据库编译并执行你的查询语句,这样效率就会低下很多,针对这种信息不经常变动并且数据量。
- 在比如刚发布一件商品的时候,用户大量点击造成请求徒增,如果直接请求数据库,就会可能导致数据库宕机。
这个时候,如果在数据库与请求之间增加一层缓存,那么就能很好的避免这样的问题产生。
终于通过不断的探索,redis的产生完美解决上述的要求,下面我会详细讲解redis的使用。
- 集群
发展到如今,淘宝每年的双十一每秒钟万级别的QPS,单靠一般的中间件也已很难应对。
这个时候只能靠堆叠产品来进行横向扩展,下面我放一张图来供大家理解。
它将所有请求进行分配让后通过轮询来将请求分派给各个redis中,用于环节服务器压力。如果想详细了解后续实现原理可以关注我【dog】,会继续讲解
二、redis介绍
先上一段网上的介绍
Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
简单一点来说呢它是一个高性能的存储系统
redis的高性能
为什么说它是高性能呢?
-
基于内存实现
它与其他的数据库相比较,不需要从磁盘中读取到内存中,这样就大大的减少了I/O次数
-
特殊的线程模型
非阻塞的I/O多路复用模型 -
单线程
redis的单线程避免了线程之间切换产生的消耗
常用数据结构
string
string是最基本的类型,可以理解成与memcached一模一样的类型,一个key对应一个value
string是一个二进制安全的,意味着redis的String可以包含任意的数据包含图片
结构(动态字符串):类似java的arrayList
list
list列表是简单的字符串列表,按照顺序插入顺序
结构(快速链表):即为双向链表,并且链表中的每一个节点是一个压缩链表
下面我引用一张快速链表的图
set
set是无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。
结构(hash表):它是一个value为null的hash表
zset
zset和set一样也是String类型元素的集合,且不允许重复的成员
结构:跳表
有序的多层双向链表组成,包含所有元素,当要查询指定元素时,从上向下可实现二分查找
hash
hash是一个String类型的field和value的映射表,即键值对的集合,hash特别适合存储对象
结构:主要为hash表如果v过长会使用拉链法
hash适合存储user对象
三、使用场景
缓存
借助redis高性能的key-value存储,可将用户登录状态保存到redis中。
排行榜
利用zset,进行存储以实现排行榜功能。
社交列表
比如使用Sets结构存储关注列表、收藏列表、点赞列表等。
四、总结
以上就是redis的基本入门了,后续我会根据上述的知识针对redis做具体的功能实现。