【Redis7】Redis7 十大数据类型

 【大家好,我是爱干饭的猿,本文重点介绍Redis7 十大数据类型。

后续会继续分享Redis7和其他重要知识点总结,如果喜欢这篇文章,点个赞👍,关注一下吧】

上一篇文章:《【Redis7】Redis7概述、安装和卸载 》


目录

🥗0. Redis 键(key)

🥗1. Redis 字符串(String)

🥗2. Redis列表(List)

🥗3. Redis哈希(Hash)

🥗4. Redis集合(Set)

🥗5. Reids有序集合(Zset)

🥗6. Redis位图(bitmap)

🥗8. Redis地理空间(GEO)

🥗9. Redis流(Stream)

🥗10. Redis位域(bitfield)


🥗0. Redis 键(key)

keys *          //展示当前库的所有key

exists key      //判断某个key是否存在
type key        //查看你的key是什么类型
del key          //删除指定的key数据
unlink key      //非阻塞删除,仅仅将keys从keyspace元数据中删除,没真正的删除会在后续异步中操作
ttl key            //查看还有多少秒过期 -1表示永不过期 -2 表示已过期
expire key 秒      //给key设置过期时间
move key [0-15] // 将当前数据库的key移动到指定的数据库中,redis默认是有16个数据库的
select [0-15]       // 切换数据库[0-15],默认为0
dbsize                // 查看当前数据库key的数量
flushdb               // 清空当前库
flushall               // 清空16个数据库 慎用

命令不区分大小写,而key的值是区分大小写的

help @+数据类型 会出现命令提示 比如 help @string

🥗1. Redis 字符串(String)

  • string是redis最基本的类型,一个key对应一个value。
  • string类型是二进制安全的,意思是redis的string可以包含任何数据,比如jpg图片或者序列化的对象 。
  • string类型是Redis最基本的数据类型,一个redis中字符串value最多可以是512M

常用命令

set key value ex 20   // 设置值 20秒过期
get key   // 获得对应的值

同时设置/获取多个键值
mset [key1] [value1] [key2] [value2] [key3] [value3]  // 同时设置一个或多个键值对
mget [key1] [key2] [key3]  // 同时获取多个key的值
msetnx [key1] [value1] [key2] [value2]  // 同时设置一个或多个 key-value 对  必须保证key都不存在才能成功

获取指定区间
getrange [key] 0 -1  // 获取这个key的值的全部
getrange [key] 0 2   // 获取这个key的值索引0到索引2之间的值
getrange [key] 1 xxx  // 设置指定区间范围内的值

数值增减
incr [key]    // 递增数字 +1
incr [key] [increment]   // 增加指定的整数  +increment 
decr [key]   // 递减数字 -1
decr [key] [increment]   // 减少指定的整数  -increment 

获取字符串长度和内容相加
strlen [key]        // 获取key对应的值的长度
append [key] [vale]   // 添加字符串内容

分布式锁
setex [key] [过期时间] [value]  // 设置带过期时间的key,动态设置
setex [key] [value] // 只有在 key 不存在时设置 key 的值。
set [key] [value] get // 给定 key 的值设为 value ,并返回 key 的旧值
getset [key] [value]  // 给定 key 的值设为 value ,并返回 key 的旧值

应用场景

  1. dy点赞某个视频或商品,点一次加一次 -incr key
  2. 对于文章是否喜欢 -incr key

🥗2. Redis列表(List)

单key多vlue

结构:

  • 一个双端链表的结构,容量是2的32次方减1个元素,大概40多亿,主要功能有push/pop等,一般用在栈、队列、消息队列等场景
  • left、right都可以插入添加;
    • 如果键不存在,创建新的链表
    • 如果键已存在,新增内容
    • 如果键全移除,对应的键也就消失了
  • 底层就是个双向链表,对两端的操作性能很高,通过索引下标的操作中间的节点性能会较差


常用命令

lpush [key] [value] ...  // 往 列表头部(左边)放入元素
Rpush [key] [value] ...  // 往 列表(右边)放入元素
lrange [key] 0 -1      // 从左边开始遍历列表  只能从左边遍历
lpop [key]           // 最左边的出栈 也就是lrange遍历的第一个
rpop [key]           // 最右边的出栈 也就是lrange遍历的最后一个
lindex [key] [index]  // 通过索引值获取值
llen [key]    // 获得元素个数
lrem [key] [num] [value]  // 从左往右删除 num个值为 value的值
lrem [key] 0 [value]  // 从左往右删除所有值为value的值
ltrim [key] [开始] [结束] // 截取指定范围的值后再赋给[key],也就是删除这个区间外的值
rpoplpush [key1] [key2] [value] //移除列表的最后一个元素,并将该元素添加到另一个列表的第一个并返回
lset [key] [index] [value]   //将key的第 index 个索引值改为value
linsert [key] brfore/after [value1] [value2] // 在list某个已有值的前后再添加具体值


应用场景

  1. 公众号的订阅的消息
  2. 关注的人发布文章,就会到我的List lpush likearticle:id 文章id
  3. 查看自己订阅的文章 lrange likearticle:id 0 9

🥗3. Redis哈希(Hash)

k-v 模式不变,但v是一个键值对 => Map<String,Map<Object,Object>

常用命令

hset/hget/hmset/hmget/hgetall/hdel 和set类似,不过多赘述
hlen   // 获取在某个key内的全部数量
hexists [key] [k1]   // 看key中是否有k1这个键
hkeys [key]    // 获取key里面的所有key
hvals [key]    // 获取key里面的所有value
hincrby [key] k1 [num] // key里面k1的值增长num 整数
hincrbyfloat [key] k1 [num] // key里面k1的值增长num 小数
hsetnx [key] k1 [value] // 不存在赋值,存在了无效\

应用场景

  • 早期购物车设计,基本不用了,中小厂可用

🥗4. Redis集合(Set)

单值多value,无重复

常用命令

SADD key member ...   // 添加元素
SMEMBERS key      // 遍历集合中所有元素
SISMEMBER key member    // 判断元素是否在集合中
SREM key member ...     // 删除元素
SCARD  key          // 获取集合长度
SRANDMEMBER key m   // 从set集合里面随机取出m个    如果超过最大数量就全部取出   如果写的值是负数,比如-3 ,表示需要取出3个,但是可能会有重复值    不会删除
SPOP key m   // 从集合中随即弹出一个元素  出一个删一个
SMOVE key1 key2 在key1里已存在的某个值  // 将key1的已存在的某个值赋给key2

集合运算

SDIFF keyA keyB     // A - B  属于A但不属于B的元素构成的集合
SUNION keyA keyB    // A U B  属于A或者属于B的元素合并后的
SINTER keyA keyB    // A ∩ B  属于A同时属于B
SINTERCARD numkeys keyA keyB [LIMIT limit] // 不返回结果集,只返回结果的基数

应用场景

  • 抽象小程序
    • 将所有抽奖用户 sadd key 用户ID
    • 显示多少人参加 SCARD key
    • 从set中任意选取N个中奖人
      • SRANDMEMBER key 2 随机抽奖两个人,元素不删除
      • SPOP key 2 随机抽奖两个人,元素会删除
  • 朋友圈点赞
    • 新增点赞 SADD pub:msgID 点赞用户Id1 点赞用户Id2
    • 取消点赞 SREM pub:msgID 点赞用户Id
    • 展现所有点赞过的用户 SMEMBERS pub:msgID
    • 点赞用户统计 SCARD pub:msgID
    • 判断某个朋友是否对楼主点赞过 SISMEMBER pub:msgID 用户Id
  • 可能认识的人
    • 求两个人的差集 SDIFF user1 user2

🥗5. Reids有序集合(Zset)

注意:Zset和set的区别,就是在set的基础上加了一个score分数值。

  • set k1 v1 v2 v3
  • Zset k1 score1 v1 score2 v2

常用的

ZADD key score member [ score member ] // 添加元素
ZRANGE key start stop [WITHSCORES] // 返回元素分数从小到大的顺序   返回索引从start到stop之间的所有元素
ZREVRANGE key 0 - 1 [WITHSCORES]   // 反序
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count] // 获取指定分数范围的元素  (min,max) 不包含   limit是返回限制,返回多少个 
ZSCORE key member     // 获取元素的分数
ZCARD key             // 获取集合中元素的数量
ZREM key 某score下对应的value值   // 删除元素
ZINCRBY key increment member    // 增加某个元素的分数
ZCOUNT key min max     // 获得指定分数范围内的元素个数
ZMPOP numkeys key [key …] <MIN | MAX> [COUNT count] // 从键名列表中的第一个非空排序集中弹出一个或多个亓素,它们是成员分数对
ZRANK key values值     // 获得下标值
ZREVRANK key values    // 逆序获得下标值

应用场景

  • 根据商品销售对商品进行排序显示
    • 思路:定义商品销售排行榜(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 9 withscores

🥗6. Redis位图(bitmap)

由 0 和 1 表示的二进制位的 bit 数组

介绍

  • 用String类型作为底层数据结构实现的一种统计二值状态的数据类型
  • 位图本质是数组,它是基于String数据类型的按位的操作。该数组由多个二进制位组成,每个二进制位都对应一个偏移量(我们称之为一个索引)
  • Bitmap支持的最大位数是2^32位,它可以极大的节约存储空间,使用512M内存就可以存储多达42.9亿的字节信息(2的32次方 = 4294967296)

基本命令

SETBIT key offset value    // 将第offset的值设为value  value只能是0或1  offset 从0开始
GETBIT key offset        // 获得第offset位的值
STRLEN key              // 得出占多少字节 超过8位后自己按照8位一组一byte再扩容
BITCOUNT key         // 得出该key里面含有几个1
BITOP and destKey key1 key2 // 对一个或多个 key 求逻辑并,并将结果保存到 destkey 
BITOP or destKey key1 key2 // 对一个或多个 key 求逻辑或,并将结果保存到 destkey 
BITOP XOR destKey key1 key2 // 对一个或多个 key 求逻辑异或,并将结果保存到 destkey 
BITOP NOT destKey key1 key2 // 对一个或多个 key 求逻辑非,并将结果保存到 destkey

 应用场景

  • 做签到很适合位图
    • 每天使用1个1亿位的Bitmap约占12MB的内存(10^8/8/1024/1024),10天的Bitmap的内存开销约为120MB,内存压力不算太高。
    • 在实际使用时,最好对Bitmap设置过期时间,让Redis自动删除不再需要的签到记录以节省内存开销。
  • 对于电影和广告是否被点击播放过也可以用位图

🥗7. Redis基数统计(HyperLogLog)

介绍

  • 去重复统计功能的基数估计算法就是 HyperLogLog
  • 基数
    • 是一种数据集,去重复后的真实个数
  • 基数统计
    • 用于统计一个集合中不重复的元素个数,就是对集合去重复后剩余元素的计算
    • 只需要花费12KB内存,就能记录 2的64次方=18446744073709551616 个不同元素的基数
  • 但是,因为HyperLogLog只会根据输入元素来计算基数,而不会储存输入元素本身,所以HyperLogLog 不能像集合那样,返回输入的各个元素。
     

基本命令

pfadd hllo1 1 3 5 7 9
pfadd hllo2 2 4 4 4 6 7 8
pfcount hllo2        //计算hllo2 中去重后元素个数
pfmerge distResult hllo1 hllo2 //合并hllo1 和 hllo2 中元素并去重
pfcount disResult    //计算hllo2 中去重后元素个数

应用场景

  • 统计某个网页的UV、某个文章的UV
    • UV Unique Visitor 独立访客,一般理解为客户端IP,需要去重
  • 用户搜索网站关键词数量
  • 统计用户每天搜索不同词条个数

🥗8. Redis地理空间(GEO)

介绍

地球上的地理位置是使用二维的经纬度表示,经度范围 (-180, 180],纬度范围 (-90, 90],只要我们确定一个点的经纬度就可以名取得他在地球的位置。

  • 例如滴滴打车,最直观的操作就是实时记录更新各个车的位置
  • 然后当我们要找车时,在数据库中查找距离我们(坐标x0,y0)附近r公里范围内部的车辆

经纬度去地图上直接复制:拾取坐标系统 (baidu.com)

基本命令

GEOADD city 116.403963 39.915119 "天安门" 116.403414 39.924091 "故宫" //GEOADD添加经纬度坐标
ZRANGE city 0 -1 // 查看(会出现中文乱码)
redis -cli -a 123456 - raw // 解决中文乱码
GEOPOS city 天安门 故宫 // GEOPOS 返回经纬度

//GEOHASH返回坐标的 geohash 表示 (base32编码)
GEOHASH city 天安门 故宫

//GEODIST 返回两个位置之间的距离(m km )
GEODIST city 天安门 长城 km

//GEORADIUS 以给定的经纬度为中心, 返回键包含的位置元素当中, 与中心的距离不超过给定最大距离的所有位置元素。
GEORADIUS city 116.418017 39.9144444 10 km withdist withcoord count 10 desc

//GEORADIUSBYMEMBER 找出指定范围内的元素,中心点是由给定的位置元素决定
GEORADIUsbymember city 天安门 10 km withdist withcoord count 10 withhash

 应用场景

  • 美团附近的饭店、酒店
  • 高德地图附近的店

🥗9. Redis流(Stream)

介绍

  • 实现消息队列的三个方式
    • List实现消息队列
    • Pub/Sub 发布订阅
    • Stream流 (Redis版的MQ消息中间件+阻塞队列)

Stream流实现消息队列,它支持消息的持久化、支持自动生成全局唯一 ID、支持ack确认消息的模式、支持消费组模式等,让消息队列更加的稳定和可靠 

Stream结构

 

基本命令

队列指令

 

消费组指令

重点

(复杂)

🥗10. Redis位域(bitfield)

介绍

  • 将很多小的整数存储到一个长度较大的位图中,又或者将一个非常庞大的键分割位多个较小的键来进行储存,从而高效利用内存
  • 也就是将 Redis 字符串看作是一个 由二进制位组成的数组 并能对变长位宽和任意没有字节对齐的指定整型位域进行寻址和修改

一句话:将一个Redis字符串看作是一个由二进制位组成的数组,并能对变长位宽和任意没有字节对齐的指定整型位域进行寻址和修改
 

基本命令

功能:

  1. 位域修改
  2. 溢出控制

分享到此,感谢大家观看!!!

如果你喜欢这篇文章,请点赞关注吧,或者如果你对文章有什么困惑,可以私信我。

🏓🏓🏓

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/7261.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

PCB生产工艺流程五:PCB生产工艺流程的第3步,钻孔的分类及目的

PCB生产工艺流程五&#xff1a;PCB生产工艺流程的第3步&#xff0c;钻孔的分类及目的 今天第五期的内容就是详细讲述PCB工艺流程第三步——钻孔&#xff0c;忘记第二步的小伙伴看这里 PCB工艺流程第2步&#xff0c;你了解多少&#xff1f; 钻孔的目的 在板面上钻出层与层之间…

【Java项目】SpringBoot实现一个请求同时上传多个文件和类并附上代码实例

文章目录前言文件多线程兼多文件上传RequestParam和RequestPart的区别前言 项目在做二手市场&#xff0c;然后商品的提交我们希望对商品的描述和商品的照片能一起传递到同一个接口来统一处理&#xff0c;而不是分发到两个接口中去处理&#xff0c;因为如果分到两个接口那么会特…

大语言模型带来的一些启发

仅代表个人看法&#xff0c;不喜勿喷。 The limits of my language means the limits of my world. (Ludwig Wittgenstein) 我的语言的极限意味着我的世界的极限。——维特根斯坦 大语言模型解决的不仅是处理文本相关问题&#xff0c;它带来的是人对世界的理解&#xff0c;或者…

华为网络篇 单臂路由-17

实验难度 2实验复杂度2目录 一、实验原理 二、实验拓扑 三、实验步骤 四、实验过程 总结 一、实验原理 单臂路由&#xff08;router-on-a-stick&#xff09;是指在路由器的一个接口上通过配置子接口&#xff08;或“逻辑接口”&#xff0c;并不存在真正物理接口&…

EasyExcel的简单使用(easyExcel和poi)

EasyExcel的简单使用 前言 Excel读 1.实体类 2.读监听器与测试类 3.输出结果 Excel写 1.实体类 2.写入Excel的测试类 3.输出结果 填充Excel 1.Excel模板 2.测试类 3.输出结果 前言 EasyExcel类是一套基于Java的开源Excel解析工具类&#xff0c;相较于传统的框架如Apache poi、…

Go 语言数组和切片的区别

原文链接&#xff1a; Go 语言数组和切片的区别 在 Go 语言中&#xff0c;数组和切片看起来很像&#xff0c;但其实它们又有很多的不同之处&#xff0c;这篇文章就来说说它们到底有哪些不同。 另外&#xff0c;这个问题在面试中也经常会被问到&#xff0c;属于入门级题目&…

堆及其堆排序

堆是一种特殊的数据结构&#xff0c;底层实现是靠数组存储以及完全二叉树的性质 文章目录一、堆概念二、堆实现三、堆源码四、堆排序一、堆概念 完全二叉树用数组来存储可以达到空间的有效利用且可以直观反映它们之间的逻辑关系&#xff0c;双亲与孩子之间的关系。一般在数组中…

一文说透虚拟内存

为什么我们需要虚拟内存 提供一个虚拟化封装&#xff0c;让上层的程序员不用担心内存分配&#xff0c;物理地址的总大小。同时如果要手动管理内存是一件麻烦的事&#xff0c;比如一个程序读到另一个程序的物理地址&#xff0c;并且也很难保障多个处理器不会同时读取写入同一块…

GitHub Action 使用

GitHub Action 使用 GitHub Actions 是一种持续集成和持续交付 (CI/CD) 平台&#xff0c;可用于自动执行生成、测试和部署管道。 您可以创建工作流程来构建和测试存储库的每个拉取请求&#xff0c;或将合并的拉取请求部署到生产环境。GitHub 提供 Linux、Windows 和 macOS 虚拟…

训练AI数据模型所需要的高性能计算机配置

目录 配置一 配置二 配置三 云服务器和超级计算机 AI模型训练是一种机器学习的过程&#xff0c;通过训练深度学习模型来自动化处理数据和完成任务。AI训练可以帮助企业和研究人员开发出更加智能、高效的应用&#xff0c;从而提高生产力和创新能力。 以下是按训练性能从低到…

对挖矿病毒 kdevtmpfsi 的处理办法

需求背景&#xff1a; 服务器CPU资源使用一直处于100%的状态&#xff0c;通过 top 命令查看&#xff0c;发现可疑进程 kdevtmpfsi。通过 google搜索&#xff0c;发现这是挖矿病毒。 排查方法 首先&#xff1a;查看 kdevtmpfsi 进程&#xff0c;使用 ps -ef | grep kdevtmpfsi …

数据结构之线性表

文章目录1. 线性表的定义2. 线性表的抽象数据类型3. 线性表的顺序存储结构4. 线性表的链式存储结构5. 单链表结构和顺序存储结构优缺点6. 静态链表7. 循环链表8. 双向链表1. 线性表的定义 零个或多个数据元素的有限序列 线性表的定义中强调有限和序列两个方面。 有限&#xff…

华硕ROG|玩家国度 冰刃7双屏 GX650PY Windows11原厂预装系统 工厂模式恢复安装带ASUSRecevory一键还原

华硕ROG|玩家国度 冰刃7双屏 GX650PY Windows11原厂预装系统 工厂模式恢复安装带ASUSRecevory一键还原 文件地址&#xff1a;https://pan.baidu.com/s/1snKOsH3OMl3GZLqeAf-GLA?pwd8888 华硕工厂恢复系统 &#xff0c;安装结束后带隐藏分区以及机器所有驱动软件 需准备一个…

【树】你真的会二叉树了嘛? --二叉树LeetCode专题Ⅲ

Halo&#xff0c;这里是Ppeua。平时主要更新C语言&#xff0c;C&#xff0c;数据结构算法......感兴趣就关注我吧&#xff01;你定不会失望。 &#x1f308;个人主页&#xff1a;主页链接 &#x1f308;算法专栏&#xff1a;专栏链接 我会一直往里填充内容哒&#xff01; &…

MySQL基础-变量/流程控制/游标/触发器

文章目录MySQL基础-变量/流程控制/游标/触发器一、变量1、系统变量2、用户变量二、流程控制1、分支语句2、循环语句3、跳转语句三、游标1、概念2、使用四、触发器1、触发器概念2、触发器使用3、触发器的优缺点MySQL基础-变量/流程控制/游标/触发器 一、变量 在MySQL数据库的存…

RocketMQ水平扩展及负载均衡详解

文章目录 Broker端水平扩展Broker负载均衡commit logProducer负载均衡Consumer负载均衡集群模式广播模式RocketMQ是一个分布式具有高度可扩展性的消息中间件。本文旨在探索在broker端,生产端,以及消费端是如何做到横向扩展以及负载均衡的。 Broker端水平扩展 Broker负载均衡…

前端项目-05-轮播图banner和Floor组件开发-全局轮播图组件抽取

目录 1-轮播图模块数据开发 2-floor组件开发 3-抽取全局轮播图组件 1-轮播图模块数据开发 轮播图需要用到swiper插件&#xff0c;先安装5.4.5版本的swiper&#xff1a;npm install --save swiper^5.4.5 --force 模拟从服务器获取数据&#xff1b; 1-编写mockRequests的js…

【ACWing算法课】二分查找

前言&#x1f349; 二分查找一个简单的算法&#xff0c;但是因为边界问题往往写不好。特此记录模板&#xff0c;以便快捷使用。 [二分查找]从列表q找到第一个>k的数&#xff0c;返回位置&#x1f451; [二分查找]从列表q找到第一个>k的数&#xff0c;返回位置def bsear…

three.js实现3d球体树状结构布局——树状结构的实现

目录系列文章安装依赖基本分析实体类场景相机渲染器辅助线环境光点光源球形几何体球形几何体的材质线几何体线几何体的材质物体文本轨道控制实现效果实现源码参考文档系列文章 three.js实现3d球体树状结构布局——添加入场、出场、点击放大等动画 安装依赖 npm i three three…

Adaptive AUTOSAR——Time Synchronization(VRTE 3.0 R21-11)

15 Time Synchronization 15.1 What is Time Synchronization? 时间同步是自适应平台基础中的一个功能集群。时间同步通过库向应用程序提供C API&#xff0c;该库作为RTA-VRTE入门套件的一部分提供&#xff0c;并与应用程序链接以访问该功能。 本版本包含非常少量的时间同步…
最新文章