一 什么是redis
Redis(全称:Remote Dictionary Server 远程字典服务)是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库
。
二 redis的特性
- 速度快
- 数据存储在内存中,
降低了磁盘io,极大提高了查询效率
- 单线程架构,
减少了线程切换的开销
- 丰富的数据结构
- 支持
字符串、哈希、列表、集合、有序集合
、BitMaps(位图)、HyperLogLog(超小内存唯一值计数)、GEO(地理信息定位)
- 功能丰富
- 发布订阅、Lua脚本、事务、pipeline
- 简单稳定
- 源码少,早期版本只有 2 万行左右,3.0 版本之后增加了集群特性,代码增至 5 万行左右
- 单线程模型
- 不依赖操作系统中的类库
- 客户端语言多
- 支持 Java、php、python、ruby、lua、nodeJS…
- 持久化
- Redis 所有数据保存在内存当中,对数据的更新将异步地保存到磁盘上
- 主从复制
- 高可用、分布式
三 Redis典型使用场景
Redis可以用来做什么
- 缓存
- 缓存基本在所有的大型网站得以使用,合理的使用缓存
不经可以加快数据的访问速度,还能有效的降低后端数据资源的压力
,Redis提供了键值对的过期时间设置,同时也提供了灵活控制最大内存和内存溢出后的淘汰策略
,是目前比较主流的缓存架构
- 排行榜
- Redis提供了
列表和有序集合数据结构
,可以和方便的实现各种排行榜
- 消息队列系统
- Redis
提供了发布和订阅和阻塞队列的功能
,轻量级的消息队列系统,一些对于消息队列功能不是有很强要求的系统,可以通过redis来实现消息队列
- 计数器
- 比如微博的转发数、评论数、点赞数等,为了保证数据的实时性,每一次都要做加 1 的操作,如果并发量很大对于传统关系型数据的性能是一种挑战。Redis
天然支持计数
功能而且计数的性能也非常好,是计数器系统的重要选择。
- 分布式锁
- 在分布式系统常常利用redis来实现系统的分布式锁,可以参考笔者的自定义springboot组件–基于redisson实现分布式锁
Redis不可以用来做什么
- 从
数据规模来看
,Redis是将数据存放在内存中的,数据量非常大的是不适合存储在redis中 - 从
数据的冷热程度
,Redis适合存放一些热点数据,冷数据反而造成一些内存的浪费
四 为什么单线程Redis还这么快
- redis将所有的数据存放在内存中,内存的读取非常的快,采用多线程的话,线程的切换反而影响Redis的效率
非阻塞I/O
,Redis使用epoll作为I/O多路复用技术
的实现,不在网络I/O上浪费过多时间
注意:因为是单线程,同一时间只运行一条命令,所以它拒绝长(慢)命令
,单线程对于每个命令的执行时间是有要求的。如果命令执行过长,会造成其他命令的阻塞,对于 Redis 这种高性能的服务来说是致命的。