【缓存】2-Redis数据类型以及应用场景

avatar 2020年11月26日16:07:44 0 588 views

redis 都有哪些数据类型?分别在哪些场景下使用比较合适?这两个问题都是Java初级面试中常见的问题。简单说一下。

一、Redis数据类型

  • String:纯字符串,可以进行incr、desc 加减操作
  • Hash:类似Map结构
  • List:类似数组或者链表
  • Set:无序的集合
  • Sorted Set:有序的集合

 

二、String应用场景

String 类型,基本上是公司用的最多的,也是最简单粗暴的。

1. 作为缓存

把一些查询比较频繁的且不常变的数据如公司机构、省份城市、车辆品牌等信息, 以JSON格式存储,减少直接查询DB耗费的时间。

 

2. 作为计数

如某案件号生成规则是:固定字母A + 4位产品代码 + 6位机构代码 + 4位年份 + 7 位序列号

这个序列号通过redis来计数,key为 SEQ_REPORT_NO_2020,每次通过 incr 加1。

当然 ID 生成自增,文章访问量,点击量 自增都可以用这个。

 

3. 作为业务配置开关

比如我需要控制一个推送数据的功能是否执行,我可以判断 PUSH_DATA_SWTICH 这个key的值是否等于 Y,如果是则执行,否则不执行。

 

 

三、List应用场景

List类型也很常见,注意List是有序的

比如我需要记录朋友圈动态的点赞用户信息(如id, name, avatar)

其实用 MySQL 也可以实现,但是避免DB的查询,还是用 Redis 来提高查询效率吧。

 

如用户id为1,2,3的给动态id为10000的点赞了。先后往Redis里插入3条数据。

lpush POST:10000  "{\"id\":\"1\",\"name\":\"张三\",\"avatar\":\"http://xx/xxx.jpg\"}"
lpush POST:10000  "{\"id\":\"2\",\"name\":\"李四\",\"avatar\":\"http://xx/xxx2.jpg\"}"
lpush POST:10000  "{\"id\":\"3\",\"name\":\"王五\",\"avatar\":\"http://xx/xxx3.jpg\"}"

 

注意:List 元素里是String类型的JSON格式数据

 

然后查询id为10000的动态的前50个点赞用户信息,可以直接从Redis里查询

lrange POST:10000 0 50

 

 

四、Set应用场景

Set 类型我用的比较少,Set是无序的

我觉得一般是用于需要做交集,并集,差集的场景

比如QQ加好友时,可以看到有多少个公共好友,这里就是交集

 

先给用户id为123456的用户添加几个好友

sadd friend:123456 10000
sadd friend:123456 10001
sadd friend:123456 10002
sadd friend:123456 10003

 

然后给用户id为456789的用户添加几个好友

sadd friend:456789 10000
sadd friend:456789 10002
sadd friend:456789 10004
sadd friend:456789 10006

 

通过 sinter 求交集,获取公共好友

sinter friend:123456 friend:456789

 

通过 sdiff 求差集,获取123456有的好友,456789没有的,到时候给他推荐

sdiff friend:123456 friend:456789

 

 

五、SortedSet应用场景

SortedSet也叫zSet,有序的集合,跟普通的Set区别就是多一个分数字段。

可以用于一些排行榜的场景,比如点赞排行榜,评论数排行榜之类的。

这里就不演示了。

 

 

六、Hash应用场景

Hash跟String的简单JSON格式很相似,和Java里的Map相似。

个人觉得将JSON对象里的信息更加颗粒化,方便单独更新和查询。

比如把用户信息以 Hash 格式存储,分别记录id,姓名,上次登录时间,文章数量,点赞数量

 

hset user:1 id 1
hset user:1 name 张三
hset user:1 lastLoginTime 2020-11-26 15:55:00
hset user:1 articleCount 12
hset user:1 likeCount 10

 

需要更新张三的点赞数

直接修改对应的key就行,如果是 String 类型,需要修改整个

hset user:1 articleCount 13

 

  • 微信
  • 交流学习,有偿服务
  • weinxin
  • 博客/Java交流群
  • 资源分享,问题解决,技术交流。群号:590480292
  • weinxin
avatar

发表评论

avatar 登录者:匿名
可以匿名评论或者登录后台评论,评论回复后会有邮件通知

  

已通过评论:0   待审核评论数:0