Redis教程(1)
如果觉得写的还可以,点个赞支持一下笔者呗!你的点赞和关注会让我更快更新哦。笔者会持续更新关于Java和大数据有关的文章。目前集中精力在更新java框架的内容。
1. 简介
Redis(全称:Remote Dictionary Server 远程字典服务)是一个开源的使用 ANSI C 语言编写、支持网络、可基于内存亦可持久化的、Key-Value 数据库,并提供多种语言的 API。主要提供了 5 种数据结构: 字符串、 哈希、 列表、 集合、 有序集合, 同时在字符串的基础之上演变出了位图(Bitmaps)和 HyperLogLog 两种神奇的 “数据结构”, 并且随着 LBS( Location Based Service, 基于位置服务) 的不断发展, Redis3.2 版本中加入有关 GEO( 地理信息定位) 的功能,
2. Redis 特性
没有无缘无故的爱,Redis 之所以集万千宠爱于一身,必然有它的原因所在。Redis 身上具有很多特性了,而这些特性恰好可以解决互联网应用中的一些非常棘手的难题。这些特性使它脱颖而出,成了架构师的心头好。说了这么多,Redis 究竟有什么本事呢?且听我慢慢道来~
2.1 高性能
天下武功无坚不破,唯快不破。Redis 是出了名的快呀,官方给出的数字是读写性能可以达到 10 万 / 秒。让 Redis 有如此性能的关键因素是因为 Redis 是基于内存的数据库。下表是各种计算机硬件处理数据的时间对比:
硬件及操作 | 所需时间 |
L1 cache reference 一级缓存引用 | 0.5 ns |
Branch mispredict 分支错误预测 | 5 ns |
L2 cache reference 二级缓存引用 | 7 ns |
Mutex lock/unlock 互斥锁定 / 解锁 | 25 ns |
Main memory reference 主存引用 | 100 ns |
Compress 1K bytes with Zippy 用 Zippy 压缩 1K 数据 | 3,000 ns |
Send 2K bytes over 1 Gbps network 通过 1Gbps 带宽网络发送 2K 数据 | 20,000 ns |
Read 1 MB sequentially from memory 从内存顺序读取 1M 数据 | 250,000 ns |
Round trip within same datacenter 同一数据中心往返一次,ping 一下 | 500,000 ns |
Disk seek 磁盘寻道 | 10,000,000 ns |
Read 1 MB sequentially from disk 从磁盘顺序读取 1MB 数据 | 20,000,000 ns |
Send packet CA->Netherlands->CA 在 CA 向荷兰发包再返回 | 150,000,000 ns |
从上表可知,计算机里除了 CPU 以外,就属内存快了。另外,Redis 是用 C 语言实现的,C 语言在我们的印象里,除了难学以外,另一个特点就是执行效率高了,这也是 Redis 具有高性能的因素之一。最后因为 Redis 使用了单线程架构(咦?不都说多线程快吗?怎么 Redis 单线程也这么快?留给你来寻找答案)。
2.2 丰富的数据结构
- String
- Hash
- List
- Set
- Sorted Set
- Bitmap
- Hyperloglog
- …
2.3 强大的功能
- 键过期,缓存的基础之一;
- 发布订阅,可以用来实现消息系统;
- 支持 Lua 脚本,可以扩展 Redis 功能;
- 简单的事务功能, 能在一定程度上保证事务特性;
- 流水线( Pipeline),可以批量提交,减少网络开销;
- 持久化,保证数据安全不丢失,提高容灾能力;
- 主从复制,为分布式高可用打下基础;
- 分布式,使 Redis 高可用、易扩展。
2.4 简单可靠
Redis 的代码量很少,早期版本只有两万行左右,即便是添加了集群特性以后,代码也不过五万行。作为一个 NoSQL 数据库来说,代码量已经相当的少了。这也使得作为非专攻 Redis 的技术人员可以将 Redis 研究透彻。再加上其作者的编码风格极其优雅,通过研究 Redis 的源码也可以很好的提高自己的编码水平。另外,基于单线程的实现方式,也使得客户端开发变得简单。
2.5 支持多种语言
使用简单的 TCP 协议就可以与 Redis 进行通信,众多编程语言都可以轻松的接入到 Redis。由于 Redis 以上的众多优点,使得它颇受开源社区以及公司认可,所以支持 Redis 的语言也越来越多,几乎涵盖了所有主流编程语言,真是有容乃大呀(有容是谁?)。强者愈强,马太效应在 Redis 身上表现得淋漓尽致。以下是来自 Redis 官网的编程语言支持列表:
3. Redis 可以做什么
通过上面的内容我们知道,Redis 拥有很多优点与强大的功能。蜘蛛侠的叔叔曾经告诉我们:With great power comes great responsibility。所以 Redis 一定也肩负着重任,那么我们就来看看人们通常会用 Redis 来做什么吧。
3.1 缓存
用于做缓存可是 Redis 的看家本领,也是 Redis 最广泛的用途没有之一。强大的性能加上优秀的缓存设计不但可以提升系统的访问速度,还能大大滴缓解数据库的压力。对于一些查询频率很高但很少修改的数据来说,使用 Redis 来缓存在合适不过了。 Redis 提供了键值过期时间设置,并且也提供了灵活控制最大内存和内存溢出后的淘汰策略。 一个合理的缓存设计能够为一个网站的稳定保驾护航。
3.2 排行榜
很多网站都有排行榜应用的,比如吃瓜群众每天都会关注的微博热搜,还有程序员关注的 GitHub 热度排行等。Redis 提供的有序集合(sorted set)能实现各种复杂的排行榜应用。
3.3 计数器
计数器在我们日常生活中也很常见,比如微博的点赞数、转发量,微信文章的阅读量、在看人数,视频网站的播放量等。这种累加的功能使用 Redis 的 incr 命令来实现非常合适。不但性能好,而且还能从容应对高并发的请求。
3.4 社交网络
微博的关注与粉丝、共同关注,传统关系型数据库不擅长处理这种数据。而 Redis 可以很好的实现并且有非常好的性能。例如,点赞列表、收藏列表、关注列表、粉丝列表等,使用 Hash 类型数据结构是个不错的选择。
3.5 消息队列系统
消息队列是大型网站必用中间件,如 ActiveMQ、RabbitMQ、Kafka 等流行的消息队列中间件,主要用于业务解耦、流量削峰及异步处理实时性低的业务。Redis 虽然和专业的消息队列比还不够足够强大, 但是对于一般的消息队列功能基本可以满足。
3.6 分布式锁
目前几乎所有互联网公司都用到了分布式技术,我们在享受新技术的同时也会面对一些新的问题。分布式系统在应对同一资源并发修改的时候,不管是 synchronized 还是 ReentrantLock 都显得力不存心了。而直接利用数据库的锁在高并发下容易将数据库服务器拖垮。这时候 Redis 又一次站了出来,利用其高性能以及具有原子性的命令 setnx 或者借助 Lua 脚本可以实现分布式锁的功能。