这是我参与「第五届青训营 」伴学笔记创作活动的第 15 天
写在开头
本人是一个第一次参加字节青训营的学生,主要是简单记录一下自己学习的过程以及复习(详细的需要自己去看每天对应的课程),每天会发前一天课程的笔记或者是自己的思考
Redis是什么
Redis是现在最受欢迎的NoSQL数据库之一,Redis是一个使用ANSI C编写的开源、包含多种数据结构、支持网络、基于内存、可选持久性的键值对存储数据库,其具备如下特性:
- 基于内存运行,性能高效
- 支持分布式,理论上可以无限扩展
- key-value存储系统
- 开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API
相比于其他数据库类型,Redis具备的特点是:
- C/S通讯模型
- 单进程单线程模型
- 丰富的数据类型
- 操作具有原子性
- 持久化
- 高并发读写
- 支持lua脚本
哪些大厂在使用Redis?
- github
- 微博
- Stack Overflow
- 阿里巴巴
- 百度
- 美团
- 字节
Redis的应用场景有哪些?
Redis 的应用场景包括:缓存系统(“热点”数据:高频读、低频写)、计数器、消息队列系统、排行榜、社交网络和实时系统。
Redis的数据类型及主要特性
Redis提供的数据类型主要分为5种自有类型和一种自定义类型,这5种自有类型包括:String类型、哈希类型、列表类型、集合类型和顺序集合类型。
redis的几种数据类型
5 种基础数据结构:string (字符串)、list (列表)、set (集合)、hash (哈希) 和 zset (有序集合)。
String
动态可修改,容量capacity一般要高于实际长度len,当len小于1M时容量翻倍;超过1M时,增加1M的容量;最大长度为512M;如果value为整数,可以进行自增操作;可以用于:常规的计数操作,如文章数、粉丝数。
list
Redis 的列表相当于 Java 语言里面的 LinkedList;这意味着 list 的插入和删除操作非常快,时间复杂度为 O(1),但是索引定位很慢,时间复杂度为 O(n);当列表弹出了最后一个元素之后,该数据结构自动被删除,内存被回收。
可以用于:粉丝列表、异步队列:把需要延后处理的数据序列化成字符串装进列表,另起线程进行轮询操作;比如记录用户浏览记录,根据记录进行相关内容的推荐的实现;另外可以通过push和pop进行头部/尾部进行增删,即可以为队列又可以为数组。
hash (字典)
Redis 的字典相当于 Java 语言里面的 HashMap,它是无序字典。内部实现结构上同 Java 的 HashMap 也是一致的,同样的数组 + 链表二维结构可以用于:存储部分变更信息,如用户信息(存放的是结构化的对象)。
set (集合)
Redis 的集合相当于 Java 语言里面的 HashSet;无序且自动去重,并提供判断某个成员是否存在集合中的接口;当集合中最后一个元素移除之后,数据结构自动删除,内存被回收。
可以用于:共同好友、二度好友等功能。
Zset(有序集合)
与set类似,Zset是有序的,并且提供给每个value设置score,代表value排序权重;内部实现为跳跃列表;zest集合中最后一个value被移除后,数据结构自动删除,内存被回收。
可以用于:学生与分数。