Redis是一个key-value存储系统,如今在各类系统中的使用愈来愈多,大部分状况下是由于其高性能的特性,被当作缓存使用,这里介绍下Redis常常遇到的使用场景。 java
一个产品的使用场景确定是须要根据产品的特性,先列举一下Redis的特色:redis
这里咱们经过几个场景,不一样维度说下Redis的应用。数据库
缓存是Redis最多见的应用场景,之全部这么使用,主要是由于Redis读写性能优异。并且逐渐有取代memcached,成为首选服务端缓存的组件。并且,Redis内部是支持事务的,在使用时候能有效保证数据的一致性。
做为缓存使用时,通常有两种方式保存数据:缓存
方案一:实施起来简单,可是有两个须要注意的地方:
一、避免缓存击穿。(数据库没有就须要命中的数据,致使Redis一直没有数据,而一直命中数据库。)
二、数据的实时性相对会差一点。 服务器
方案二:数据实时性强,可是开发时不便于统一处理。
。微信
固然,两种方式根据实际状况来适用。如:方案一适用于对于数据实时性要求不是特别高的场景。方案二适用于字典表、数据量不大的数据存储。数据结构
Redis相比其余缓存,有一个很是大的优点,就是支持多种数据类型。多线程
数据类型 | 说明 |
---|---|
string | 字符串,最简单的k-v存储 |
hash | hash格式,value为field和value,适合ID-Detail这样的场景。 |
list | 简单的list,顺序列表,支持首位或者末尾插入数据 |
set | 无序list,查找速度快,适合交集、并集、差集处理 |
sorted set | 有序的set |
其实,经过上面的数据类型的特性,基本就能想到合适的应用场景了。并发
如上所述,虽然Redis不像关系数据库那么复杂的数据结构,可是,也能适合不少场景,比通常的缓存数据结构要多。了解每种数据结构适合的业务场景,不只有利于提高开发效率,也能有效利用Redis的性能。框架
谈到Redis和Memcached 的区别,你们更多的是谈到数据结构和持久化这两个特性,其实还有一个比较大的区别就是:
因此Redis单线程的这个特性,其实也是很重要的应用场景,最经常使用的就是分布式锁。
应对高并发的系统,都是用多服务器部署,每一个技术框架针对数据锁都有很好的处理方式,如 .net 的lock,java 的synchronized,都能经过锁住某个对象来应对线程致使的数据污染问题。可是毕竟,只能控制本服务器的线程,分布式部署之后数据污染问题,就比较难处理了。Redis的单线程这个特性,就很是符合这个需求,伪代码以下:
//产生锁
while lock!=1
//过时时间是为了不死锁
now = int(time.time())
lock_timeout = now + LOCK_TIMEOUT + 1
lock = redis_client.setnx(lock_key, lock_timeout)
//真正要处理的业务
doing()
//释放锁
now = int(time.time())
if now < lock_timeout:
redis_client.delete(lock_key)复制代码
以上是一个只说明流程的伪代码,其实总体的逻辑是很简单的,只要考虑到死锁时的状况,就比较好处理了。Redis做为分布式锁,由于其性能的优点,不会成为瓶颈,通常会产生瓶颈的是真正的业务处理内容,仍是尽可能缩小锁的范围来确保系统性能。
Redis针对数据均可以设置过时时间,这个特色也是你们应用比较多的,过时的数据清理无需使用方去关注,因此开发效率也比较高,固然,性能也比较高。最多见的就是:短信验证码、具备时间性的商品展现等。无需像数据库还要去查时间进行对比。由于使用比较简单,就不赘述了。
Redis初期的版本官方只是支持单机或者简单的主从,大多应用则都是本身去开发集群的中间件,可是随着应用愈来愈普遍,用户关于分布式的呼声愈来愈高,因此Redis 3.0版本时候官方加入了分布式的支持,主要是两个方面:
并且Redis虽然是一个内存缓存,数据存在内存,可是Redis支持多种方式将数据持久化,写入硬盘,全部,Redis数据的稳定性也是很是有保障的,结合Redis的集群方案,有的系统已经将Redis当作一种NoSql数据存储来适用。
秒杀是如今互联网系统中常见的营销模式,做为开发者,其实最不肯意这样的活动,由于非技术人员没法理解到其中的技术难度,致使在资源协调上老是有些误差。秒杀其实常常会出现的问题包括:
其实解决这些问题基本就两个方案:
如今说明一下,若是如今作一个秒杀,那么,Redis应该如何结合进行使用?
以上是一个简略的秒杀系统和Redis结合的方案,固然实际可能还会引入http缓存,或者将消息对接用MQ代替等方案,也会出现业务遗漏的状况,这个只是但愿能抛砖引玉。
每一个技术都有属于本身的应用场景,只有对技术的特色有必定清晰的认识,才能更好的利用技术,发挥其最大的优点。
欢迎你们关注个人公众号交流、学习、第一时间获取最新的文章。
微信号:itmifen