- 简介
1.1 什么是redis?
Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。从2010年3月15日起,Redis的开发工作由VMware主持。从2013年5月开始,Redis的开发由Pivotal赞助。总结:Redis是个非关系型数据库,也就是传说中的key-value数据库。具体能干些啥,请继续往下看。
2 为啥要用Redis?
当大量请求去访问/修改的时候,不仅可能会出现加载慢更有可以会造成其他的一些事故,比如凌晨两点作为一个程序员你可能会接到老大叫你起来修复程序的电话 - -!,所以在此时,redis显得尤为重要了,redis基本的工作流程如下图:
<图1>
![image](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X3BuZy84cGliek1zaWJpYlhmaGljSFNCN3lvZFQzOFYwWVJhd1p5UDJFUWNVNHp4aE5XZWFZT0tmd3ZtVWpTTHEzdmRCcWd4NXJiaG5YZXRIRU84UjNNR245b0gxV1EvP3d4X2ZtdD1wbmc?x-oss-process=image/format,png)
<图2>
通过上图可以明确redis工作的基本流程,不仅可以为数据库分担压力,还会为响应增加速度;不过这里心细的小伙伴可能会感觉这样会有问题:高并发的时候使用,在请求修改的时候又有人过来请求读操作,岂不是拿不到正确的值?这里我们就来看下redis的几个过期策略。
2.1 简单粗暴-所有的数据结构都可以设置过期时间,时间一到,就会自动删除。
2.2 定期删除策略:redis默认每个100ms检查,从字典里随机抽取20个key --> 删除过期的数据 --> 如果过期的数量超过1/4就继续执行。为了避免循环过度导致线程卡死,默认扫描时间上限为25ms。定期删除会导致有过期的key没有被删除。
2.3 惰性删除:在客户端请求获取某个key的时候,redis会检查一下,这个key如果过期了此时就会删除。
2.4 内存淘汰机制:常见的两种:一种是在设置了过期时间的键空间中,优先移除最近未使用的key,另一种设置就是直接优先移除最近未使用的key。
3 redis的几种数据类型
5 种基础数据结构:string (字符串)、list (列表)、set (集合)、hash (哈希) 和 zset (有序集合)。
3.1 String
动态可修改,容量capacity一般要高于实际长度len,当len小于1M时容量翻倍;超过1M时,增加1M的容量;最大长度为512M;如果value为整数,可以进行自增操作;可以用于:常规的计数操作,如文章数、粉丝数。
3.2 list
Redis 的列表相当于 Java 语言里面的 LinkedList;这意味着 list 的插入和删除操作非常快,时间复杂度为 O(1),但是索引定位很慢,时间复杂度为 O(n);当列表弹出了最后一个元素之后,该数据结构自动被删除,内存被回收。
可以用于:粉丝列表、异步队列:把需要延后处理的数据序列化成字符串装进列表,另起线程进行轮询操作;比如记录用户浏览记录,根据记录进行相关内容的推荐的实现;另外可以通过push和pop进行头部/尾部进行增删,即可以为队列又可以为数组。
3.3 hash (字典)
Redis 的字典相当于 Java 语言里面的 HashMap,它是无序字典。内部实现结构上同 Java 的 HashMap 也是一致的,同样的数组 + 链表二维结构可以用于:存储部分变更信息,如用户信息(存放的是结构化的对象)。
3.4 set (集合)
Redis 的集合相当于 Java 语言里面的 HashSet;无序且自动去重,并提供判断某个成员是否存在集合中的接口;当集合中最后一个元素移除之后,数据结构自动删除,内存被回收。
可以用于:共同好友、二度好友等功能。
3.5 Zset(有序集合)
与set类似,Zset是有序的,并且提供给每个value设置score,代表value排序权重;内部实现为跳跃列表;zest集合中最后一个value被移除后,数据结构自动删除,内存被回收。
可以用于:学生与分数。
至于redis的安装及几种数据类型的操作我们下集再讲
喜欢请扫码关注我,谢谢!