Redis是什么
Redis的特点
- 性能极⾼ – Redis能读的速度是110000次/s,写的速度是81000次/s 。
- 丰富的数据类型 – Redis⽀持⼆进制的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
- 原⼦ – Redis的所有操作都是原⼦性的,同时Redis还⽀持对⼏个操作全部的原⼦ 性执⾏。
- 丰富的特性 – Redis还⽀持 publish/subscribe, 通知, key 过期等等特性。
- ⾼速读写-Redis使⽤⾃⼰实现的分离器,代码量短,没有使⽤Lock(锁MySQL), 因此效率⾼
- 持久化-Redis直接将数据存储到内存中,要将数据保存到磁盘上,Redis可以通 过两种⽅式实现持久化。
- 线程安全-因为Redis所有操作都是原⼦性(要么都成功,要么都失败),同时还没有锁,所以Redis的每个命令都是线程安全的
Redis优势
高性能
高并发
Redis缺点
Redis应⽤场景
- 缓存
- 秒杀
- 计数器
- 排⾏榜
- 热点数据(经常查询,但是不经常修改或者删除的数据)
- 分布式锁
- 分布式ID
- 消息系统
Redis快的真正原因
- 内存存储: Redis将所有数据保存在内存中,内存读写速度⾮常快,远快于硬盘。这也是Redis最主要的性能优势。
- 数据结构简单: Redis⽀持的数据结构⽐较简单(例如字符串,哈希,列表, 集合和有序集合),这也在⼀定程度上提⾼了其效率。
- 非阻塞IO: Redis使⽤单线程和⾮阻塞I/O多路复⽤库处理并发连接。在处理大量并发连接时,这种模型⽐多线程和阻塞I/O的模型要⾼效。
- 持久化策略: Redis提供了多种灵活的数据持久化⽅式,包括RDB快照和AOF⽇志。⽤户可以根据需求选择最合适的持久化策略,以平衡性能和数据安全之间的关系。
- 优化的数据结构: Redis为了⾼效地实现其命令,使⽤了许多优化的数据结构 和算法,例如快速列表,跳跃列表和压缩列表
如何理解Redis是单线程的
Redis数据类型
Redis 有 5 种基础数据结构,分别为:string (字符串)、list (列表)、set (集合)、hash (哈希) 和 zset (有序集合)。
Redis 所有的数据结构都是一个key对应一个value,不同类型的数据结构之间的差异就在于value的结构不同,例如string数据类型,他的value就是一个字符串,list数据类型,他的value是一个链表。
String类型
String 是 Redis 最简单的数据结构,可以存储字符串、整数或者浮点数。最常见的应用场景就是对象缓存,例如缓存用户对象,key是"userInfo"+#{用户ID},value是用户信息对象的JSON字符串。
案例:
key:userInfo123
value:{"gender":1,"nickname":"java程序鱼","userId":123}
list类型
Redis 的列表相当于 Java 语言里面的 LinkedList。
LinkedList优点:插入性能高,不管是从末尾插入还是中间插入
LinkedList缺点:随机读性能差,例如LinkedList.get(10),这种操作,性能就很低,因为他需要遍历这个链表,从头开始遍历这个链表,直到找到index = 10的这个元素为止。
set类型
Redis的set集合相当于Java的HashSet。Redis 中的 set 类型是一种无序集合,集合中的元素没有先后顺序。
补充:HashSet就是基于HashMap来实现的,HashSet,他其实就是说一个集合,里面的元素是无序的,他里面的元素不能重复的,HashMap的key是无顺序的,你插入进去的顺序,跟你迭代遍历的顺序是不一样的,而且HashMap的key是没有重复的,HashSet直接基于HashMap实现的。
hash类型
Redis的Hash结构相当于Java语言的HashMap,内部实现结构上与JDK1.7的HashMap一致,底层通过数据+链表实现。
zset类型
sorted set 有序集合,sorted set 增加了一个权重参数 score,使得集合中的元素能够按 score 进行有序排列,还可以通过 score 的范围来获取元素的列表。使得它类似于Java的TreeSet和HashMap的结合体。