Redis 是什么
Redis,英文全称是 Remote Dictionary Server(远程字典服务),是一个开源的使用 ANSI C 语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
与 MySQL 数据库不同的是,Redis 的数据是存在内存中的。它的读写速度非常快,每秒可以处理超过10万次读写操作。因此 Redis 被 广泛应用于缓存,另外,Redis 也经常用来做分布式锁。除此之外,Redis支持事务、持久化、LUA 脚本、LRU 驱动事件、多种集群方案。
Redis 数据结构
Redis 作为常见数据结构类型有:
- String 字符串:Redis 中最基础的数据结构类型,它是二进制安全的,可以存储图片或者序列化的对象,值最大存储为 512M。
- Hash 哈希:在 Redis中,哈希类型是指v(值)本身又是一个键值对(k-v)结构。
- List 列表:用来存储多个有序的字符串,一个列表最多可以存储 2^32-1 个元素。
- Set 集合:集合(set)类型也是用来保存多个的字符串元素,但是不允许重复元素。
- Zset 有序集合:已排序的字符串集合,同时元素不能重复。
此外,Redis还有三种特殊的数据结构类型:
- Geo:地理位置定位,用于存储地理位置信息,并对存储的信息进行操作。
- HyperLogLog:用来做基数统计算法的数据结构,如统计网站的 UV。
- Bitmaps :用一个比特位来映射某个元素的状态,在 Redis 中,它的底层是基于字符串类型实现的,可以把 bitmaps 成作一个以比特位为单位的数组。
高性能的 Redis
- 基于内存存储实现:Redis基于内存存储实现的数据库,相对于数据存在磁盘的 MySQL 数据库,省去磁盘I/O的消耗。
- 高效的数据结构:Redis 每种数据结构都是经过精心设计,力求高效的。例如 String 底层使用 SDS 简单动态字符串。
- 合理的数据编码:每种基本类型可能对多种数据结构。什么时候使用什么样数据结构使用什么样编码,是设计者总结优化的结果。
- 合理的线程模型:而Redis使用用 epoll 作为 I/O 多路复用技术的实现。并且,Redis 自身的事件处理模型将 epoll 中的连接、读写、关闭都转换为事件,不在网络I/O上浪费过多的时间。Redis 是单线程模型的,而单线程避免了 CPU 不必要的上下文切换和竞争锁的消耗。Redis 6.0 引入了多线程提速,它的执行命令操作内存的仍然是个单线程。
- 虚拟内存机制:Redis直接自己构建了VM机制 ,不会像一般的系统会调用系统函数处理,会浪费一定的时间去移动和请求。
Redis 使用场景
- 缓存:Redis 常常被用来缓存热点数据,不仅可以提升网站的访问速度,还可以降低数据库 DB 的压力。
- 统计:Redis 可以实现排行榜,统计网站流量,做计数器,使用 Bitmaps 实现上亿数据量场景下的用户登录统计。
- 分布式锁:在并发量高的场合中,利用数据库锁来控制资源的并发访问,会影响数据库的性能,可以使用setnx来实现分布式的锁。
- 消息队列:Redis提供了发布/订阅及阻塞队列功能,能实现一个简单的消息队列系统。另外,这个不能和专业的消息中间件相比。