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

  • 命令大全
  • 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 …]

应用场景

微信抽奖小程序

  • 用户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特别高的的大厂不可以用

猜你喜欢

转载自blog.csdn.net/m0_56709616/article/details/130944864