4.1 9大类型
- String(字符类型)
- Hash(散列类型)
- List(列表类型)
- Set(集合类型)
- SortedSet(有序集合类型,简称zset)
- Bitmap(位图)
- HyperLogLog(统计)
- GEO(地理)
- 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以上,不会显示具体的数量了。