- 命令大全
- 9大类型
- String(字符类型)
- Hash(散列类型)
- List(列表类型)
- Set(集合类型)
- SortedSet(有序集合类型,简称zset)
- Bitmap(位图)
- HyperLogLog(统计)
- GEO(地理)
- Stream(了解)
string
常用命令
- 最常用
- set key value
- get key
- 同时设置/获取多个键值
- MSET key value [key value …]
- MGET key [key …]
- 数值增减
- 递增数字:INCR key
- 增加指定的整数:INCRBY key increment
- 递减数值:DECR key
- 减少指定的整数:DECRBY key decrement
- 获取字符串长度:STRLEN key
- 分布式锁
- setnx key value
- set key value [EX seconds] [PX milliseconds] [NX|XX]
应用场景
- 比如抖音无限点赞某个视频或者商品,点一下加一次
- 是否喜欢的文章
- 阅读数:只要点击了rest地址,直接可以使用incr key 命令增加一个数字1,完成记录数字。
hash
常用命令
- 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
应用场景
JD购物车早期 设计目前不再采用,当前小中厂可用
- 新增商品 → hset shopcar:uid1024 334488 1
- 新增商品 → hset shopcar:uid1024 334477 1
- 增加商品数量 → hincrby shopcar:uid1024 334477 1
- 商品总数 → hlen shopcar:uid1024
- 全部选择 → hgetall shopcar:uid1024
list
常用命令
- 一个双端链表的结构,容量是2的32次方减1个元素,大概40多亿,主要功能有push/pop等,一般用在栈、队列、消息队列等场景。
- 向列表左边添加元素:LPUSH key value [value …]
- 向列表右边添加元素:RPUSH key value [value …]
- 查看列表:LRANGE key start stop
- 获取列表中元素的个数:LLEN key
应用场景
微信公众号订阅的消息
- 大V作者李永乐老师和CSDN发布了文章分别是 11 和 22
- 阳哥关注了他们两个,只要他们发布了新文章,就会安装进我的List
lpush likearticle:阳哥id 11 22 - 查看阳哥自己的号订阅的全部文章,类似分页,下面0~10就是一次显示10条
lrange likearticle:阳哥id 0 9
商品评论列表
- 需求1:用户针对某一商品发布评论,一个商品会被不同的用户进行评论,保存商品评论时,要按时间顺序排序
- 需要2:用户在前端页面查询该商品的评论,需要按照时间顺序降序排序
- 使用list存储商品评论信息,key是该商品的id,value是商品评论信息商品编号为1001的商品评论key【items:comment:1001】
- lpush items:comment:1001 {“id”:1001,“name”:“huawei”,“date”:1600484283054,“content”:“lasjfdljsa;fdlkajsd;lfjsa;ljf;lasjf;lasjfdlsad”}
set
常用命令
- 添加元素:SADD key member [member …]
- 删除元素:SREM key member [member …]
- 遍历集合中的所有元素:SMEMBERS key
- 判断元素是否在集合中:SISMEMBER key member
- 获取集合中的元素总数:SCARD key
- 从集合中随机弹出一个元素,元素不删除:SRANDMEMBER key [数字]
- 从集合中随机弹出一个元素,出一个删一个:SPOP key [数字]
- 集合运算
- 集合的差集运算 A-B
- 属于A但不属于B的元素构成的集合
- SDIFF key [key …]
- 集合的交集运算 A∩B
- 属于A同时也属于B的共同拥有的元素构成的集合
- SINTER key [key …]
- 集合的并集运算 A ∪ B
- 属于A或者属于B的元素合并后的集合
- SUNION key [key …]
- 集合的差集运算 A-B
应用场景
微信抽奖小程序
- 用户ID,立即参与按钮
- sadd key 用户ID
- 显示已经有多少人参与了,上图23208人参加
- SCARD key
- 抽奖(从set中任意选取N个中奖人)
- SRANDMEMBER key 2 随机抽奖2个人,元素不删除
- SPOP key 3 随机抽奖3个人,元素会删除
微信朋友圈点赞
- 新增点赞
- sadd pub:msgID 点赞用户ID1 点赞用户ID2
- 取消点赞
- srem pub:msgID 点赞用户ID
- 展现所有点赞过的用户
- SMEMBERS pub:msgID
- 点赞用户数统计,就是常见的点赞红色数字
- scard pub:msgID
- 判断某个朋友是否对楼主点赞过
- SISMEMBER pub:msgID 用户ID
微博好友关注社交关系
共同关注的人
我关注的人也关注他(大家爱好相同)
可能认识的人
Zset
- 向有序集合中加入一个元素和该元素的分数
- 添加元素:ZADD key score member [score member …]
- 按照元素分数从小到大的顺序,返回索引从start到stop之间的所有元素
- ZRANGE key start stop [WITHSCORES]
- 获取元素的分数
- ZSCORE key member
- 删除元素
- ZREM key member [member …]
- 获取指定分数范围的元素
- ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]
- 增加某个元素的分数
- ZINCRBY key increment member
- 获取集合中元素的数量
- ZCARD key
- 获得指定分数范围内的元素个数
- ZCOUNT key min max
- 按照排名范围删除元素
- ZREMRANGEBYRANK key start stop
- 获取元素的排名
- 从小到大:ZRANK key member
- 从大到小:ZREVRANK key member
应用场景
根据商品销售对商品进行排序显示
- 定义商品销售排行榜(sorted set集合),key为goods:sellsort,分数为商品销售数量。
抖音热搜
案例实战:微信文章阅读量统计
package com.learn.service;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
/**
* @author YSK
* @since 2023/5/30 14:06
*/
@Service
@Slf4j
public class ArticleService {
public static final String ARTICLE = "article:";
@Resource
private StringRedisTemplate stringRedisTemplate;
public void likeArticle(String articleId) {
String key = ARTICLE + articleId;
Long likeNumber = stringRedisTemplate.opsForValue().increment(key);
log.info("文章编号:{},喜欢数:{}", key, likeNumber);
}
}
package com.learn.controller;
import com.learn.service.ArticleService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
/**
* @author YSK
* @since 2023/5/30 14:07
*/
@RestController
@Slf4j
@Api(description = "喜欢的文章接口")
public class ArticleController {
@Resource
private ArticleService articleService;
@ApiOperation("喜欢的文章,点一次加一个喜欢")
@RequestMapping(value = "/view/{articleId}", method = RequestMethod.POST)
public void likeArticle(@PathVariable(name = "articleId") String articleId) {
articleService.likeArticle(articleId);
}
}
- 中小厂可以用,QPS特别高的的大厂不可以用