第4章 Redis经典五种数据类型介绍及落地运用

4.1 9大类型

  1. String(字符类型)
  2. Hash(散列类型)
  3. List(列表类型)
  4. Set(集合类型)
  5. SortedSet(有序集合类型,简称zset)
  6. Bitmap(位图)
  7. HyperLogLog(统计)
  8. GEO(地理)
  9. Stream:简单了解即可
    • Redis Stream是Redis 5.0版本新增加的数据结构,主要用于消息队列(MQ)
    • Redis本身是有一个Redis发布订阅(pub/sub)来实现消息队列的功能,但它有个缺点就是消息无法持久化,如果出现网络断开、Redis宕机等,消息就会被丢弃。简单来说发布订阅(pub/sub)可以分发消息,但无法记录历史消息。
    • 而Redis Stream提供了消息的持久化和主备复制功能,可以让任何客户端访问任何时刻的数据,并且能记住每一个客户端的访问位置,还能保证消息不丢失。它算是Redis自己消息功能的补充。
    • 但是,一般主流MQ都固定了(Kafka、RabbitMQ、RocketMQ)
注意:命令不区分大小写,而key是区分大小写的

redis-cli --raw:有时候我们需要向redis中写入含有中文的数据,然后在查看数据,但是会看到一些utf-8编码的字符,而不是我们写入的中文,这个时候,就可以增加--raw参数,实现对中文数据的查看。

4.2 String

4.2.1 最常用

  • set key value
  • get key

4.2.2 同时设置/获取多个键值

  • mset key value [key value ...]
  • mget key [key ...]

4.2.3 数值增减

  • 递增数值:incr key
  • 增加指定的整数:incrby key 步长
  • 递减数值:decr key
  • 减少指定的整数:decrby key 步长

4.2.4 获取字符串长度

  • strlen key

4.2.5 分布式锁

  • setnx key value
  • set key value [EX seconds] [PX milliseconds] [NX|XX]
    • EX:key在多少秒之后过期
    • PX:key在多少毫秒之后过期
    • NX:当key不存在的时候,才创建key,效果等同于setnx
    • XX:当key存在的时候,覆盖key

4.2.6 应用场景

  • 比如抖音无限点赞某个视频或者商品,点一下加一次

  • 是否喜欢的文章

    阅读数:只要点击了rest地址,直接可以使用incr key命令增加一个数字1,完成记录数字

4.3 hash

4.3.1 基础命令

Map<String,Map<Object,Object>>

一次设置一个字段值:hset key field value

一次获取一个字段值:hget key field

一次设置多个字段值:hmset key field value [field value ...]

一次获取多个字段值:hmget key field [field ...]

获取所有字段值:hgetall key

获取某个key内的全部数量:hlen

删除一个key:hdel

4.3.2 应用场景

JD购物车早期,设计目前不再采用,当前中小厂可用

新增商品:hset shopcar:uid1024 334488 1

新增商品:hset shopcar:uid1024 334477 1

增加商品数量:hincrby shopcar:uid1024 334477 1

商品总数:hlen shopcar:uid1024

全部选择:hgetall shopcar:uid1024

4.4 list

4.4.1 简单说明

一个双端链表的结构,容量是2的32次方减1个元素,大概40多亿,主要功能由push/pop等,一般用在栈、队列、消息队列等场景。

4.4.2 常用命令

向列表左边添加元素:lpush key value [value ...]

向列表右边添加元素:rpush key value [value ...]

查看列表:lrange key start stop

获取列表中元素的个数:llen key

4.4.3 应用场景

1)微信公总号订阅的消息

大V作者李永乐老师和SCDN发不了文章发别是 11 和 22

我关注了他们两个,只要他们发布了新文章,就会安装进我的List lpush likearticle:meId 11 22

查看我自己的号订阅的全部文章,类似于分页,下面0~10就是一次显示10条lrange likearticle:meId 0 9

2)商品评价列表

需求1:用户针对某一商品发布评论,一个商品会被不同的用户进行评论,保存商品评论时,要按时间顺序

需求2:用户在前端页面查询该商品的评论,需要按照时间顺序降序排序

使用list存储商品评论信息,key是该商品的id,value是商品评论信息商品编号为1001的商品评论key【items:comment:1001】

lpush items:comment:1001 {"id":1001,"name":"huawei","date":12345678900,"content":"good"...}

4.5 set

4.5.1 常见命令

添加元素:sadd key member [member ...]

删除元素:srem key member [member ...]

遍历集合中的所有元素:smembers key

判断元素是否在集合中:sismember key member

获取集合中的元素总数:scard key

从集合中随机弹出一个元素,元素不删除:srandommember key [数字]

从集合中随机弹出一个元素,出一个删一个:spop key [数字]

4.5.2 集合运算

差集运算(属于A但不属于B的元素构成的集合):sdiff key [key ...]

交集运算(属于A同时也属于B的共同拥有的元素构成的集合):sinter key [key ...]

并集运算(属于A或者属于B的元素合并后的集合):sunion key [key ...]

> sadd key1 1 2 3 4
(integer) 4
> sadd key2 3 4 5 6
(integer) 4
> sdiff key1 key2
1) "1"
2) "2"
> sinter key1 key2
1) "3"
2) "4"
> sunion key1 key2
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "6"

4.5.3 应用场景

1)微信抽奖小程序
用户ID,立即参与按钮:sadd key 用户ID
显示已经有多少人参与了:scard key
抽奖:srandommember key 2 随机抽奖2个人,元素不会删除
spop key 3 随机抽奖3个人,元素会删除
2)微信朋友圈点赞
新增点赞:sadd pub:msgID 点赞用户ID1 点赞用户ID2
取消点赞:srem pub:msgID 点赞用户ID
展现所有点赞过的用户:smembers pub:msgID
点赞用户数统计:scard pub:msgID
判断某个朋友是否对楼主点赞过:sismember pub:msgID 用户IID
3)微博好友关注社交关系
  • 共同关注的人

    sadd s1 1 2 3 4 5
    sadd s2 3 4 5 6 7
    
    sinter s1 s2
    1) "3"
    2) "4"
    3) "5"
    
  • 大家的共同爱好

4)QQ内推可能认识的人
sadd s1 1 2 3 4 5
sadd s2 3 4 5 6 7

sinter s1 s2
1) "3"
2) "4"
3) "5"

#"1","2"这两个人就有可能推荐给s2
sdiff s1 s2 
1) "1"
2) "2"

#"6","7"这两个人就有可能推荐给s1
sdiff s2 s1
1) "6"
2) "7"

4.6 Zset

4.6.1 常见命令

向有序集合中加入一个元素和该元素的分数

添加元素:zadd key score member [score member ...]

按照元素分数从小到大的顺序返回索引从start到stop之间的所有元素:zrange key start stop [WITHSCORES]

按照元素分数从大到小的顺序返回索引从start到stop之间的所有元素:zrevrange key start stop [WITHSCORES]

获取元素的分数:zscore key member

删除元素:zrem key member [member ...]

获取指定分数范围的元素:zrangebyscore key min max [WITHSCORE] [LIMIT offset count]

增加某个元素的分数:zincrby key increment member

获取集合中元素的数量:zcard key

获得指定分数范围内的元素个数:zcount key min max

按照排名范围删除元素:zremrangebyrank key start stop

获取元素的排名:

  • 从小到大:zrank key member
  • 从大到小:zrevrank key member
127.0.0.1:6379> zrange key1 0 -1 withscores
v5
10
v3
47
v2
58
v1
60
v4
99
v6
100

127.0.0.1:6379> zrank key1 v5
(integer) 0

127.0.0.1:6379> zrank key1 v6
(integer) 5

4.6.2 应用场景

1)根据商品销售对商品进行排序显示

思路:定义商品销售排行榜(sorted set集合),key为goods:sellsort,分数为商品销售数量。

商品编号1001的销量是9,商品编号1002的销售是15:zadd goods:sellsort 9 1001 15 1002
有一个客户又买了2件商品1001,商品编号1001销量加2:zincrby goods:sellsort 2 1001
求商品销量前10名:zrange goods:sellsort 0 10 withscores
2)抖音热搜

点击视频:

  • zincrby hotvcr:20221012 1 八佰
  • zincrby hotvcr:20221012 12 八佰 2 花木兰

展示当日排行前10天:zrange htvcr:20221012 0 9 withscores

4.7 案例实战:微信文章阅读量统计

4.7.1 需求

在这里插入图片描述

4.7.2 编码

@Service
@Slf4j
public class ArticleServiceImpl implements ArticleService {

    private static final String ARTICLE = "article:";

    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    @Override
    public void likeArticle(String articleId) {
        String key = ARTICLE + articleId;
        Long likeCount = stringRedisTemplate.opsForValue().increment(key);
        log.info("文章编号:{},喜欢数:{}",key,likeCount);
    }
}

说明:中小厂可以用,QPS特别高的大厂不可以用。why?
到了1w以上,不会显示具体的数量了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值