Redis特性
速度快
Redis使用标准C编写实现,而且将所有数据加载到内存中,所以速度非常快。官方提供的数据表明,在一个普通的Linux机器上,Redis读写速度分别达到81000/s和110000/s。
数据结构
可以将Redis看做“数据结构服务器”。目前,Redis支持5种数据结构。
持久化
由于所有数据保持在内存中,所以对数据的更新将异步地保存到磁盘上,Redis提供了一些策略来保存数据,比如根据时间或更新次数。数据超过内存,使用swap,保证数据;
memcacache不能持久化,mongo是部分在内存;
自动操作
Redis对不同数据类型的操作是自动的,因此设置或增加key值,从一个集合中增加或删除一个元素都能安全的操作。
支持多种语言
Redis支持多种语言,诸如Ruby,Python, Twisted Python, PHP, Erlang, Tcl, Perl, Lua, Java, Scala, Clojure等。
主-从复制
Redis支持简单而快速的主-从复制。
官方提供了一个数据,Slave在21秒即完成了对Amazon网站10Gkey set的复制。
Sharding
很容易将数据分布到多个Redis实例中,但这主要看该语言是否支持。目前支持Sharding功能的语言只有PHP、Ruby和Scala。
常见应用场景
1、缓存
String类型
例如:热点数据缓存(例如头条、报表),对象缓存、全页缓存、可以提升热点数据的访问数据。
2、分布式锁
String 类型setnx方法,只有不存在时才能添加成功,返回true
public static boolean getLock(String key) {
Long flag = jedis.setnx(key, "1");
if (flag == 1) {
jedis.expire(key, 10);
}
return flag == 1;
}
public static void releaseLock(String key) {
jedis.del(key);
}
3、计数器相关问题
redis由于incrby命令可以实现原子性的递增,所以可以运用于高并发的秒杀活动、分布式序列号的生成、具体业务还体现在比如限制一个手机号发多少条短信、一个接口一分钟限制多少请求、一个接口一天限制调用多少次等等。
4、消息队列系统
使用list可以构建队列系统,使用sorted set甚至可以构建有优先级的队列系统。
比如:将Redis用作日志收集器
实际上还是一个队列,多个端点将日志信息写入Redis,然后一个worker统一将所有日志写到磁盘。
5.文章点赞/阅读量
这样的数据放缓存是因为文章的阅读量和点赞量变化太快了,如果频繁的更新数据库,数据库压力太大了,顶不住的。如果放到redis中缓存起来,读写更快。加入开启redis的数据持久化,就算redis崩掉也没事,因为数据都存到磁盘里面了,然后定时或者一定次数的写入数据库,同步数据就行了。就算数据丢了也没有问题,不是什么影响业务的数据。
6.秒杀
东西少并发高,如果直接访问数据库的话数据库顶不住。加上redis的话,我们可以把库存放到redis中存储,redis本身有一个单线程模型,可以来一个请求,我们访问一下数据库,如果库存没有了直接返回结果,不会再访问数据库了。
7.过期项目处理
另一种常用的项目排序是按照时间排序。我们使用unix时间作为得分即可。
模式如下:
-
每次有新项目添加到我们的非Redis数据库时,我们把它加入到排序集合中。这时我们用的是时间属性,current_time和time_to_live。
-
另一项后台任务使用ZRANGE…SCORES查询排序集合,取出最新的10个项目。如果发现unix时间已经过期,则在数据库中删除条目。
8.计数
Redis是一个很好的计数器,这要感谢INCRBY和其他相似命令。
你曾许多次想要给数据库加上新的计数器,用来获取统计或显示新信息,但是最后却由于写入敏感而不得不放弃它们。
好了,现在使用Redis就不需要再担心了。有了原子递增(atomic increment),你可以放心的加上各种计数,用GETSET重置,或者是让它们过期。
例如这样操作:
INCR user: EXPIRE
user: 60
待补充。。。