第三章:redis经典五种数据类型介绍及落地运用

120 阅读5分钟

基本介绍

官网命令大全网址:doc.redisfans.com/

redis一共有9大类型如下:

  • String(字符类型)
  • Hash(散列类型)
  • List(列表类型)
  • Set(集合类型)
  • SortedSet(有序集合类型,简称zset)
  • Bitmap(位图)
  • HyperLogLog(统计)
  • GEO(地理)
  • Stream:简单了解即可

注意:Redis命令不区分大小写,而key是区分大小写的.

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]

在这里插入图片描述 应用场景 1.比如抖音无限点赞某个视频或者商品,点一下加一次 在这里插入图片描述 2.是否喜欢的文章 阅读数:只要点击了rest地址,直接可以使用incr key 命令增加一个数字1,完成记录数字。 在这里插入图片描述

hash

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

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

常用命令如下:

  • 向列表左边添加元素:LPUSH key value [value ...]
  • 向列表右边添加元素:RPUSH key value [value ....]
  • 查看列表:LRANGE key start stop
  • 获取列表中元素的个数:LLEN key

应用场景

微信公众号订阅的消息 1 大V作者李永乐老师和CSDN发布了文章分别是 11 和 22

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

3 查看阳哥自己的号订阅的全部文章,类似分页,下面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 ...]

应用场景 1.微信抽奖小程序 在这里插入图片描述 在这里插入图片描述 2.微信朋友圈点赞 在这里插入图片描述 在这里插入图片描述 3.微博好友关注社交关系 在这里插入图片描述 共同关注的人,我去到局座张召忠的微博,马上获得我和局座共同关注的人 在这里插入图片描述

我关注的人也关注他(大家爱好相同),我关注了华为余承东,余承东也关注了局座召忠,我和余总有共同的爱好。 在这里插入图片描述 3.QQ内推可能认识的人 在这里插入图片描述

Zset

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

应用场景 1.根据商品销售对商品进行排序显示 思路:定义商品销售排行榜(sorted set集合),key为goods:sellsort,分数为商品销售数量。 在这里插入图片描述 在这里插入图片描述 2.抖音热搜 在这里插入图片描述 在这里插入图片描述

案例实战

微信文章阅读量统计: 在这里插入图片描述 ArticleController代码演示如下:

 
package com.atguigu.redis.controller;

import com.atguigu.redis.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;

/**
 * @auther zzyy
 * @create 2021-05-01 19:55
 */
@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);
    }
}

ArticleService代码演示如下:

 
package com.atguigu.redis.service;

import lombok.extern.slf4j.Slf4j;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;

/**
 * @auther zzyy
 * @create 2021-05-01 19:50
 */
@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);
    }
}

注意:以上案例中小厂可以用,QPS特别高的的大厂不可以用