Redis的应用场景非常丰富,可以从以下角度去理解和挖掘Redis的应用:
下面我们从以上三个方法分别介绍一些Redis的典型应用场景。
应用需要分布式缓存(相对于本地换粗而言)时,可以使用Redis作为分布是缓存,使用字符串作为KEY,存储内容选用适当的序列化(JdkSerializationRedisSerializer, JacksonJsonRedisSerializer) 存储对象类型。 或则作为Spring cache等缓存抽象的缓存底层实现提供缓存能力。
Redis是一个单独运行的中间件,作为一个分布式服务提供分布式应用数据共享,任何需要在分布式环境中共享的数据都可以通过Redis实现,如消息通知应用:将通知保存到Redis,其他应用读取。如Session共享:
Redis作为可以应用数据库提供业务数据管理功能,再根据同步策略同步底层的关系型数据库中。
缓存更新策略:
Redis提供丰富的数据类型及相关命令,带来了丰富的应用场景。
SETEX/PSETEX: key过期设置命令。可以应用在具有时效性数据应用场景, 如订单超时支付取消,
INCR/INCRBY: 对key存储的数据进行递增加一或指定数据。 可以作为计数器或分布式ID生成器。
DECR/DECRBY:对key存储的数据进行递减一或指定数据。可以应用于限流、阈值等应用。
SETNX:在健key不存在时,将键key的值设置为value,返回1,如果key已经存在不进行任何操作,返回0. 结合key过期时间设置命令,实现分布式锁:当返回1则表示已经获取锁,返回0代表锁已经被其他应用占有,需等待重试获取锁。
HSETNX,HINCRYBY,提供类似于SETNX, INCRYBY的功能。 分布式Hash可以作为应用程序HashTable本地应用的分布式版本。Hash表通常用于高性能的查找,Redis的key的管理也是使用Hash表的数据结构实现。
双向列表的灵活读取方式可以应用于
列表本身的基础应用,如消息队列、任务队列等都可以通过Redis是达到分布式应用的目的, 如任务队列, 可以作为任务调动使用,A应用发布任务到任务队列, 工作应用使用阻塞或非阻塞的POP命令获取任务进行消息的消费或任务处理,另外RPOPLPUSH相关命令在获取队列的元素的同时原子性的将元素转移到目标队列(待确认队列), 可以实现消息消费的确认或任务执行的确认和重试。如任务正常执行,则从待确认队列中移除, 超时未确认的任务则重新挪回任务队列重新执行。
SPOP: 返回集合中的随机元素,提供随机性应用, 如抽奖等
SADD/SREM/SISMEMBER: 集合元素的增加、删除以及判断是否成员,可以应用于快速确认元素关系的场景,如点赞、签到、打卡、资源tag、倒排索引等。
SINTERSTORE/SUNION:集合交集/并集。如区域是否重叠、关注是否相关等应用。
有序集合: 如ZINCRBY等命令,通过维护有序结合可以实现如排行榜、优先队列(消息队列、任务队列)等应用。
BIGCOUNT/BIGSET/GETBIT: 针对key进行位运算,以及获取位中为1的数量。 BITMAP数据的应用,特定bit位的值代表不同含义,如统计某人的每月每天登陆情况,布隆过滤器等应用。
HyperLogLog,是一种概率性的统计算法,每个 HyperLogLog 对象最大占用空间为 12KB,应对巨量数据的统计,存在一定的误差。如网站用户总人数统计(当用户量超大时使用传统的SET会带来内存问题)。
PFADD/PFCOUNT/PFMERGE,分别用于添加、计数与合并。
Redis提供一下地理位置操作命令支持地理应用。
GEOADD/ GEOPOS: 添加和获取位置经纬度。
GEODIST: 计算两个位置之间的距离。
GEORADIUS/ GEORADIUSBYMEMBER:以给定的经纬度为中心,返回键包含的位置元素当中,与中心的距离不超过给定的最大距离的所有位置元素。
Redis提供发布/订阅应用支持。
PUBLISH/SUBSCRIBE/UNSUBSCRIBE: 发布、订阅、取消订阅通道信息
PSUBSCRIBE/PUNSUBSCRIBE: 按模式订阅和取消订阅通道