Redis(Remote Dictionary Server) 是一个 key-value 式的NoSQL数据库,是跨平台的非关系型数据库。可用于缓存,事件发布或订阅,高速队列等场景。支持网络,基于内存,可持久化。
一、什么是 Redis
Redis 是一款内存高速缓存数据库。Redis全称为:Remote Dictionary Server(远程数据服务),使用C语言编写,Redis是一个key-value存储系统(键值存储系统),value支持丰富的数据类型,如:String、list、set、zset、hash。可用于缓存,事件发布或订阅,高速队列等场景。支持网络,提供字符串,哈希,列表,队列,集合结构直接存取,基于内存,可持久化。
二、Redis 有哪些特性
在了解使用场景之前我们先看一下它有哪些特性。
读写性能优异
Redis 能读的速度是110000次/s,写的速度是81000次/s 。
数据类型丰富
Redis支持二进制案例的 String, List, Hash, Set 及 Sorted Set 数据类型操作。
原子性
Redis的所有操作都是原子性的,同时Redis还支持对几个操作全并后的原子性执行。Redis 的原子性得益于 Redis 的单线程架构。
丰富的特性
Redis支持 publish/subscribe, 通知, key 过期等特性。
持久化
发布订阅
分布式
三、Redis 的使用场景
Redis有某些特性才可以在某些场景中使用Redis,也就是说先有【特性】才有【使用场景】,本小结将给读者带来不同场景的总结。
热点数据缓存
因为Redis优异的读写性能相比于常见的结构型数据库MySQL有更快的读写速度,此外Redis内部是支持事务的,在使用时候能有效保证数据的一致性。
限时业务的运用
Redis中可以使用 expire 命令设置一个键的生存时间,到期后Redis会将数据删除它。利用这一特性可以运用在限时的优惠活动信息、手机验证码等业务场景。
计数
Redis由于incrby命令可以实现原子性的递增,所以可以运用于高并发的秒杀活动、分布式序列号的生成、具体业务还体现在比如限制一个手机号发多少条短信、一个接口一分钟限制多少请求、一个接口一天限制调用多少次等等。
分布式锁
这个主要利用redis的setnx命令进行,setnx:”set if not exists”就是如果不存在则成功设置缓存同时返回1,否则返回0 ,这个特性在俞你奔远方的后台中有所运用,因为我们服务器是集群的,定时任务可能在两台机器上都会运行,所以在定时任务中首先 通过setnx设置一个lock, 如果成功设置则执行,如果没有成功设置,则表明该定时任务已执行。 当然结合具体业务,我们可以给这个lock加一个过期时间,比如说30分钟执行一次的定时任务,那么这个过期时间设置为小于30分钟的一个时间就可以,这个与定时任务的周期以及定时任务执行消耗时间相关。在分布式锁的场景中,主要用在比如秒杀系统等。
延时操作
比如在订单生产后我们占用了库存,10分钟后去检验用户是够真正购买,如果没有购买将该单据设置无效,同时还原库存。 由于redis自2.8.0之后版本提供Keyspace Notifications功能,允许客户订阅Pub/Sub频道,以便以某种方式接收影响Redis数据集的事件。 所以我们对于上面的需求就可以用以下解决方案,我们在订单生产时,设置一个key,同时设置10分钟后过期, 我们在后台实现一个监听器,监听key的实效,监听到key失效时将后续逻辑加上。
当然我们也可以利用 RabbitMQ 、ActiveMQ 、RocketMQ 等消息中间件的延迟队列服务实现该需求。
排行榜
关系型数据库在排行榜方面查询速度普遍偏慢,所以可以借助redis的SortedSet进行热点数据的排序。
比如点赞排行榜,做一个zset, 然后以用户的id作为value, 以用户的点赞数作为score, 然后针对每个用户的信息保存在hash中, 通过zrangebyscore就可以按照点赞数获取排行榜,然后再根据zset中的id在hash中获取用户的信息。
点赞、好友等相互关系的存储
Redis 利用集合的一些命令,比如求交集、并集、差集等。
在微博应用中,每个用户关注的人存在一个集合中,就很容易实现求两个人的共同好友功能。
简单队列
由于Redis有 【list push】 和【 list pop】 这样的命令,所以能够很方便的执行队列操作。