What:
支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
1、redis基于内存,可支持持久化。
基于内存:使存取数据更快速。支持持久化:服务器宕机、意外关机,数据不会丢失。
2、支持多种数据类型:较其他缓存,redis支持存储丰富的数据结构:string、Hashes、list、sets、sorted sets与范围查询:bitmaps、hyperloglogs和geospatial索引半径查询。
丰富的功能:
3、支持事务:
事务可以一次执行多个命令, 并且带有以下两个重要的保证:
-
事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。
-
事务是一个原子操作:事务中的命令要么全部被执行,要么全部都不执行。
EXEC命令负责触发并执行事务中的所有命令:
- 如果客户端在使用MULTI开启了一个事务之后,却因为断线而没有成功执行EXEC,那么事务中的所有命令都不会被执行。
- 另一方面,如果客户端成功在开启事务之后执行EXEC,那么事务中的所有命令都会被执行。
4、pub/sub
订阅,取消订阅和发布实现了发布/订阅消息范式(引自wikipedia),发送者(发布者)不是计划发送消息给特定的接收者(订阅者)。而是发布的消息分到不同的频道,不需要知道什么样的订阅者订阅。订阅者对一个或多个频道感兴趣,只需接收感兴趣的消息,不需要知道什么样的发布者发布的。这种发布者和订阅者的解耦合可以带来更大的扩展性和更加动态的网络拓扑。
这也是redis可以作为消息中间件的基础
5、LUA脚本(暂时略过)
我们可以设置key的过期时间,超过时间后,将会自动删除该key。该功能在应用中很实用。如:
案例: Navigation session
想象一下,你有一个网络服务器,你对用户最近访问的N个网页感兴趣,每一个相邻的页面设置超时时间为60秒。在概念上你为这些网页添加Navigation session,如果你的用户,可能包含有趣的信息,他或她正在寻找什么样的产品,你可以推荐相关产品。
你可以使用下面的策略模型,使用这种模式:每次用户浏览网页调用下面的命令:
MULTI RPUSH pagewviews.user:<userid> http://..... EXPIRE pagewviews.user:<userid> 60 EXEC
如果用户60秒没有操作,这个key将会被删除,不到60秒的话,后续网页将会被继续记录。
后面还会总结自动删除key的应用场景7、内存回收
回收策略:
- noeviction:返回错误当内存限制达到并且客户端尝试执行会让更多内存被使用的命令(大部分的写入指令,但DEL和几个例外)
- allkeys-lru: 尝试回收最少使用的键(LRU),使得新添加的数据有空间存放。
- volatile-lru: 尝试回收最少使用的键(LRU),但仅限于在过期集合的键,使得新添加的数据有空间存放。
- allkeys-random: 回收随机的键使得新添加的数据有空间存放。
- volatile-random: 回收随机的键使得新添加的数据有空间存放,但仅限于在过期集合的键。
- volatile-ttl: 回收在过期集合的键,并且优先回收存活时间(TTL)较短的键,使得新添加的数据有空间存放。
这要与redis的主从集群结合:
Redis 的 Sentinel 系统用于管理多个 Redis 服务器(instance), 该系统执行以下三个任务:
- 监控(Monitoring): Sentinel 会不断地检查你的主服务器和从服务器是否运作正常。
- 提醒(Notification): 当被监控的某个 Redis 服务器出现问题时, Sentinel 可以通过 API 向管理员或者其他应用程序发送通知。
- 自动故障迁移(Automatic failover): 当一个主服务器不能正常工作时, Sentinel 会开始一次自动故障迁移操作, 它会将失效主服务器的其中一个从服务器升级为新的主服务器, 并让失效主服务器的其他从服务器改为复制新的主服务器; 当客户端试图连接失效的主服务器时, 集群也会向客户端返回新主服务器的地址, 使得集群可以使用新主服务器代替失效服务器。
应用场景:
大的方面:redis可以作为缓存、数据库、MQ
具体的一些示例场景如:
a、 取最新N个数据的操作:
LPUSH latest.comments<ID>命令,向list集合中插入数据
插入完成后用LTRIM latest.comments 0 5000 命令使其永远只保存最新的5000个ID
b、排行榜、TOP10
这个需求与上面需求的不同之处在于,前面操作以时间为权重,这个是以某个条件为权重,比如按订的次数,这时候需要我们的sorted set 出马了,将你要排序的值设置成sorted set 的score,将具体的数据设置成相应的value,每次只需要执行一条ZADD命令即可。
c、需要精准设定过期时间
比如你可以把上面说到的sorted set 的score值设置成过期时间的时间戳,那么就可以简单的通过时间排序,定时清空过期数据了,不仅是清除Redis中的过期数据,你完全可以把Redis里这个过期时间当成是对数据库中数据的索引,用Redis来找出哪些数据需要过期删除,然后再精准地从数据库中删除相应的记录。
了解一下什么是Redis,适用于什么场景,今后遇到这样的业务,能想到Redis就好了~~~