Redis使用场景

33 阅读6分钟

缓存

Redis数据类型:String,Hash

热点数据缓存,对象缓存、全页缓存、提升热点数据的访问效率

// EX:以秒为单位
// PX:以毫秒为单位
// NX:仅在键不存在时设置键
// XX:只有在键已存在时才设置
SET KEY VALUE [EX seconds] [PX milliseconds] [NX|XX]
// 当mykey不存在时,设置60s缓存,冷热数据分离
SET mykey "hotdata" EX 60 NX

计数器

Redis数据类型:String

例如:文章的阅读量、微博点赞数、允许一定的延迟,先写入Redis再定时同步到数据库

// 为key对应的数字字符串(整数)加上一
INCR key

// 为key对应的数字字符串(整数)加上increment
INCRBY key increment

分布式锁

Redis数据类型:String

String 类型setnx方法,只有不存在时才能添加成功,返回true

// EX:以秒为单位
// PX:以毫秒为单位
// NX:仅在键不存在时设置键
// XX:只有在键已存在时才设置
SET KEY VALUE [EX seconds] [PX milliseconds] [NX|XX]
// 当mykey不存在时,设置60s缓存,加锁成功
SET mykey "hotdata" EX 60 NX

限流

Redis数据类型:String

以访问者的ip和其他信息作为key,访问一次增加一次计数,超过次数则返回false

// 为key对应的数字字符串(整数)加上一
INCR key

// 为key对应的数字字符串(整数)加上increment
INCRBY key increment

全局ID

Redis数据类型:String

分库分表的场景,一次性拿一段,incrby userid 1000

位统计

Redis数据类型:String类型的bitcount

/* 6 7 代表的a的二进制位的修改  
a 对应的ASCII码是97,转换为二进制数据是01100001  
b 对应的ASCII码是98,转换为二进制数据是01100010  
  
因为bit非常节省空间(1 MB=8388608 bit),可以用来做大数据量的统计。  
*/    
set k1 a  
setbit k1 6 1  
setbit k1 7 0  
get k1

// 支持按位与、按位或等等操作
BITOPANDdestkeykey[key...] ,对一个或多个 key 求逻辑并,并将结果保存到 destkey 。         
BITOPORdestkeykey[key...] ,对一个或多个 key 求逻辑或,并将结果保存到 destkey 。   
BITOPXORdestkeykey[key...] ,对一个或多个 key 求逻辑异或,并将结果保存到 destkey 。   
BITOPNOTdestkeykey ,对给定 key 求逻辑非,并将结果保存到 destkey 。
// 在线用户统计,留存用户统计
setbit onlineusers 01   
setbit onlineusers 11   
setbit onlineusers 20

// 计算出7天都在线的用户
BITOP "AND" "7_days_both_online_users" "day_1_online_users" "day_2_online_users" ...  "day_7_online_users"

消息队列

Redis数据类型:list

// 将一个或多个值value插入到列表key的表头,并且各个值value按从左到右的顺序依次插入
LPUSH key value [value …]

// 阻塞式弹出,无timeout参数,无元素可弹出时,连接将被BLPOP命令阻塞,直到等待超时或发现可弹出的元素为止
// 有timeout参数,无元素可弹出时,连接将被BLPOP命令阻塞,直到等待超时或发现其中某一个列表有可弹出的元素为止
BLPOP key [key …] timeout
// 组合命令构成队列特性:先进先出
rpush mylist "hello"
blpop mylist

// 组合命令构成栈特性:先进后出
rpush mylist "hello"
brpop mylist

商品标签

Redis数据类型:set

// 将一个或多个member元素加入到集合key当中,已经存在于集合的member元素将被忽略(集合中的元素各不相同)
SADD key member [member …]

// 判断member元素是否是集合key中的成员
SISMEMBER key member
// myset不存在时先创建空集合再添加
sadd myset "画面清晰细腻" "真彩清晰显示屏" "流程至极"
// 查看集合中的元素
smembers myset
// 判断9是否在集合元素中,1-存在
sismember myset "流程至极"

点赞、签到、打卡

Redis数据类型:set

// 将一个或多个member元素加入到集合key当中,已经存在于集合的member元素将被忽略(集合中的元素各不相同)
SADD key member [member …]

// 判断member元素是否是集合key中的成员
SISMEMBER key member

// 命令返回集合中元素的数量
SCARD key

// 移除集合key中的一个或多个member元素,不存在的member元素会被忽略。
SREM key member [member …]

// 返回集合key中的所有成员
SMEMBERS key
// 查点赞数
scard like_wb001

// 查点赞用户
smembers like_wb001

// u001用户点赞
sadd like_wb001 u001

// u001用户取消点赞
srem like_wb001 u001

// 查u001是否点赞
sismember like_wb001 u001

商品筛选

Redis数据类型:set

// 将一个或多个member元素加入到集合key当中,已经存在于集合的member元素将被忽略(集合中的元素各不相同) SADD key member [member …]

// 命令返回给定集合之间的差集(求的是在第一个集合中但不在第二个集合中的元素),不存在的集合key将视为空集
sdiff key [key ...]

// 返回所有给定集合的交集(两个集合都存在的元素)。不存在的key会被视为空集
SINTER key [key …]

// 返回所有给定集合的并集(去重且唯一)。不存在的key同样被视为空集
SUNION key [key …]
sadd brand_apple iPhone11
sadd brand_ios iPhone11
sadd screentype_lcd iPhone 11
// 条件筛选
sinter brand_apple brand_ios screentype_lcd

用户关注、推荐模型

Redis数据类型:set

// 将一个或多个member元素加入到集合key当中,已经存在于集合的member元素将被忽略(集合中的元素各不相同) SADD key member [member …]

// 命令返回给定集合之间的差集(求的是在第一个集合中但不在第二个集合中的元素),不存在的集合key将视为空集
sdiff key [key ...]

// 返回所有给定集合的交集(两个集合都存在的元素)。不存在的key会被视为空集
SINTER key [key …]
// 互相关注
sadd u1_follow u2
sadd u2_follow u1

// 共同关注人(取交集)
sinter u1_follow u2_follow

// u1可能认识的人(u2集合的差集)
sdiff u2_follow u1_follow

排行榜

Redis数据类型:sorted_set

记录头条新闻的点击数,并提取出点击数最多的新闻

// 为有序集key中的成员member的score值加上增量increment
ZINCRBY key increment member

// 返回有序集合中指定分数区间内的成员,分数由高到低排序
ZREVRANGEBYSCORE key max min WITHSCORES LIMIT offset count
// hotNews:20190926集合中id为6001的新闻点击数加1
zincrby hotNews:20190926 1 6001

// 获取今天点击最多的15条
// +inf -inf:表示最大值和最小值
zrevrange hotNews:20190926 +inf -inf withscores LIMIT 0, 15

数据共享分布式

因为Redis是分布式的独立服务,可以在多个应用之间共享,如分布式Session

<dependency> 
    <groupId>org.springframework.session</groupId>
    <artifactId>spring-session-data-redis</artifactId>
</dependency>