Redis是一款内存高速缓存数据库。Redis全称为:Remote Dictionary Server(远程数据服务),使用C语言编写,Redis是一个key-value存储系统(键值存储系统),支持丰富的数据类型。
Redis是一种支持key-value等多种数据结构的存储系统。可用于缓存,事件发布或订阅,高速队列等场景。支持网络,提供字符串,哈希,列表,队列,集合结构直接存取,基于内存,可持久化。
Redis读数据的速度是110000次/s,写数据的速度是81000次/s (测试条件见下文)
Redis支持二进制的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
Redis的所有操作都是原子性的,同时Redis还支持对几个操作全并后的原子性执行。
Redis支持 publish/subscribe, 通知, key 过期等特性。
Redis支持RDB, AOF等持久化方式
Redis支持发布/订阅模式
Redis 支持 Cluster模式、哨兵模式、主从复制模式
官方的bench-mark根据如下条件获得的性能测试(读的速度是110000次/s,写的速度是81000次/s)
数据缓存是最常用的场景,因为Redis的性能优异。作为缓存使用,一般有两种缓存方式:
1、读取数据的时候先读Redis,没有数据则从数据库获取,再将数据写入Redis。该方案实施起来简单,但是要注意两个问题:
避免缓存击穿(数据库就没有需要的数据,导致每次都访问数据库)
数据的实时性相对会差一点
2、写数据到数据库的时候,同步写到Redis。方案实时性强但是不便于统一处理。
redis中使用expire命令设置一个key的过期时间,到期后redis会删除它。利用这一特性可以运用在限时的优惠活动信息、手机验证码等业务场景
Redis由于incrby的原子性的特征,常用于一些计数器的业务场景
Redisz实现分布式锁也是常见的场景,简单的用法是使用setnx命令("set if not exists"就是如果不存在则成功设置缓存同时返回1,否则返回0),结合过期时间的使用实现分布式锁。这个过程中加锁解锁涉及到原子性的问题一般还会配合lua脚本实现。复杂的实现有Redission本身就实现了分布式锁
一些场景需要再延时多久之后再进行一些业务操作。使用Redis的key过期时间,搭配订阅Pub/Sub频道监听key实现
借助Redis的SortedSet进行热点数据的排序。
在线访问统计借助BitMap的数据结构进行实现
Redis 利用集合的一些命令,比如求交集、并集、差集等。
在微博应用中,每个用户关注的人存在一个集合中,就很容易实现求两个人的共同好友功能
由于Redis有list push和list pop这样的命令,所以能够很方便的执行队列操作