redis(10):redis五种数据结构应用场景
看完了redis的数据结构 ,在学习下各个数据结构的试用场景;
一、string
字符串有以下几个典型应用场景:
- 缓存功能 最常用的功能,将热数据的查询结果缓存到redis;
- 计数 也是减少数据库压力的方法之一,比如文章的点击量,统计网站访问次;
- 共享session 这个在分布式或者负载均衡的web服务中非常常用,用户被负载均衡到不同服务器上的时候并不希望session丢失而重新登录;
- 可以用redis做一个session管理的服务;
同时还可以规定用户需要重新登录的时间间隔; - 限速 比如短信接口,我们不希望用户能无限访问,可以用string可以设置过期时间的特性;类似其他ip访问限制也同理
- 自增ID的分配 其他关系型数据库分库分表时候,主键ID可以从redis分配
- 其他 String类型是二进制安全的,可以用来缓存一些静态文件,如图片、视频、css文件等;
二、hash
Hash的典型使用场景:
缓存用户数据
,可以将数据库中的用户数据的每一列在哈希结构里表示出来,更新较为灵活;
三、list
lpush + rpop可以形成了一个队列,lpush+brpop可以作为消息队列;
- 消息队列
- 新消息排行榜
- 关注列表
- 粉丝列表
- 论坛中所有回帖的ID
四、set
集合的特性也比较丰富:
- 集合中不会存在重复元素;
- 集合元素是无序的;
- 集合内可以增删改查;
- 可以取多个集合的交并差集;
主要应用场景:
- 集合的能实现的最贴合的功能可能就是标签了,比如每个用户有不用的兴趣标签,每个标签有不用的用户;
- 使用sinter就可以计算出两个用户兴趣的交集,这在社交软件中非常常用;
- spop可以从集合中随机弹出元素,srandmember可以随机取出一个元素,但是不删除这个元素,这两个命令都可以实现不用需求的
抽奖系统
;
部分应用中有靓号系统,也可以通过集合实现,可以srandmember多个靓号以供选择,spop删除那个被选中的靓号,sismember确定系统随机生成的数是不是靓号,以免被下发; - 可以快速查找元素是否存在,用于
记录一些不能重复的数据
。例如: 在网站注册账号时,用户名不能重复,使用Set记录注册用户,如果注册的用户名已经存在于Set中,就拒绝该用户注册。或者用于记录做过某些事情。例如: 在某些投票系统中,每个用户一天只能投票一次,就可以用Set来记录某个用户的投票情况;
五、zset
Zset区别于Set最大的特点是可以给每个元素设置分数,作为排序的依据;
这里就有必要整理一下列表、集合、和有序集合的异同点了:
数据结构 | 是否可重复 | 是否有序 | 有序实现方式 | 应用场景 |
---|---|---|---|---|
list | 是 | 是 | 索引下标 | 时间轴,消息队列等 |
set | 否 | 否 | 无 | 标签 社交等 |
zset | 否 | 是 | 分值 | 排行榜 社交 |
- zset: 可以通过其score 做排行榜或者带权重的消息队列
- 各种排行榜系统
- zrank\zrevrank等可以查看排名前几位或者后几位的条目
六、总结
在使用基本数据结构时,有两个点需要注意:
- 命令的时间复杂度:因为Redis是单线程,
时间过长的查询会阻塞其他任务
; - 数据结构的编码:虽然Redis会自动根据情况切换数据编码,但是要优化Redis还是要了解数据编码的形式和设置合理的参数;
下面一个表,表示基本数据结构能实现的功能:
数据结构 | 命令 | 功能 |
---|---|---|
String | 几乎所有命令 | 大部分的缓存任务 热数据访问缓存 高频写入缓存 |
Hash | - | - |
List | lpush + lpop | 栈 |
List | lpush + rpop | 队列 |
List | lpush + brpop | 消息队列 |
List | lpush + ltrim | 有序集合 |
Set | sadd | 标签 |
Set | spop/srandmember | 抽奖系统 |
Set | sadd + sinter | 社交需求 |
Zset | 许多常用命令 | 排行榜系统 |
还没有评论,来说两句吧...