昨天和一位前辈聊天,谈到关于redis到场景问题,这里做一下小结。
Redis呢,百科这样说,是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
在官方上讲的很仔细,这里就简单说一下redis几个特点,因为场景是由特点决定的嘛。
单线程、并发转串行、强大的QPS、基础类型的数据结构是比较独秀的特点;
单线程呢,可以引申出计数器;
由于单线程,可以避免并发问题,保证不会出错,而且100%毫秒级性能!(注意持久化,redis是内存数据库,存储于内存中)
并发转串行呢,是中间件消息处理,秒杀场景;
由于redis把数据添加到队列是返回添加元素在队列的第几位,所以可以做判断用户是第几个访问这种业务
秒杀系统,基于redis是单线程特征,防止出现数据库“爆破”
强大的QPS,是热缓存(并发场景需注意同步),缓存session判断是否重复请求;
热点数据(经常会被查询,但是不经常被修改或者删除的数据),首选是使用redis缓存,比memcached还提供了丰富的数据类型可以用
验证前端的重复请求(可以自由扩展类似情况),可以通过redis进行过滤:每次请求将request Ip、参数、接口等hash作为key存储redis(幂等性请求),设置多长时间有效期,然后下次请求过来的时候先在redis中检索有没有这个key,进而验证是不是一定时间内过来的重复提交
数据结构呢,排行榜场景,大数据处理场景;
排行榜可以使用redis中的sorted set数据类型
判断大量对象的状态,通过位图的方式进行构建
redis内构建一个足够长的数组,每个数组元素只能是0和1两个值,然后这个数组的下标index用来表示我们上面例子里面的用户id(必须是数字哈),那么很显然,这个几亿长的大数组就能通过下标和元素值(0和1)来构建一个记忆系统
其中还谈到了关于区分服务之外特定的网站的跨域访问问题(钓鱼网站),可以通过http的heaer中referer参数(浏览器在向 web 服务器发送一个 http 请求的时候,服务器会把 http 的请求包装成一个 request 对象,在这些请求里面就包括 referer,告诉服务器,该请求来自哪里。)进行判断,从而保证只有白名单中的域名可以访问。(referer除了在这里用到外,一般还经常用于链接访问量的统计。)
读万卷书不如行万里路,行万里路不如阅人无数。不断积累,共同进步!