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
您可以选择一种方式赞助本站
支付宝扫一扫赞助
微信钱包扫描赞助
赏