【Redis7】Redis7 十大数据类型

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 本文重点介绍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

    image.gif编辑

    常用命令

    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 的旧值

    image.gif

    应用场景

      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某个已有值的前后再添加具体值

            image.gif

            应用场景

              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] // 不存在赋值,存在了无效\

              image.gif

              应用场景

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

                🥗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

                image.gif

                集合运算

                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] // 不返回结果集,只返回结果的基数

                image.gif

                应用场景

                  • 抽象小程序
                    • 将所有抽奖用户 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    // 逆序获得下标值

                                    image.gif

                                    应用场景

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

                                                        image.gif

                                                        应用场景

                                                          • 做签到很适合位图
                                                            • 每天使用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 中去重后元素个数

                                                                        image.gif

                                                                        应用场景

                                                                          • 统计某个网页的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

                                                                                image.gif

                                                                                应用场景

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

                                                                                  🥗9. Redis流(Stream)

                                                                                  介绍

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

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

                                                                                        Stream结构

                                                                                        image.gif编辑

                                                                                        基本命令

                                                                                        队列指令

                                                                                        image.gif编辑

                                                                                        消费组指令

                                                                                        image.gif编辑

                                                                                        image.gif编辑

                                                                                        重点

                                                                                        image.gif编辑

                                                                                        (复杂)

                                                                                        🥗10. Redis位域(bitfield)

                                                                                        介绍

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

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

                                                                                           

                                                                                          基本命令

                                                                                          image.gif编辑

                                                                                          功能:

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

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

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

                                                                                            🏓🏓🏓

                                                                                            相关实践学习
                                                                                            基于Redis实现在线游戏积分排行榜
                                                                                            本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
                                                                                            云数据库 Redis 版使用教程
                                                                                            云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
                                                                                            相关文章
                                                                                            |
                                                                                            8天前
                                                                                            |
                                                                                            存储 消息中间件 NoSQL
                                                                                            使用Java操作Redis数据类型的详解指南
                                                                                            通过使用Jedis库,可以在Java中方便地操作Redis的各种数据类型。本文详细介绍了字符串、哈希、列表、集合和有序集合的基本操作及其对应的Java实现。这些示例展示了如何使用Java与Redis进行交互,为开发高效的Redis客户端应用程序提供了基础。希望本文的指南能帮助您更好地理解和使用Redis,提升应用程序的性能和可靠性。
                                                                                            22 1
                                                                                            |
                                                                                            27天前
                                                                                            |
                                                                                            存储 消息中间件 NoSQL
                                                                                            Redis 数据类型
                                                                                            10月更文挑战第15天
                                                                                            36 1
                                                                                            |
                                                                                            2月前
                                                                                            |
                                                                                            存储 消息中间件 缓存
                                                                                            深入探析Redis常见数据类型及应用场景
                                                                                            深入探析Redis常见数据类型及应用场景
                                                                                            53 2
                                                                                            |
                                                                                            3月前
                                                                                            |
                                                                                            NoSQL 安全 Java
                                                                                            Redis6入门到实战------ 三、常用五大数据类型(字符串 String)
                                                                                            这篇文章深入探讨了Redis中的String数据类型,包括键操作的命令、String类型的命令使用,以及String在Redis中的内部数据结构实现。
                                                                                            Redis6入门到实战------ 三、常用五大数据类型(字符串 String)
                                                                                            |
                                                                                            3月前
                                                                                            |
                                                                                            NoSQL Java Redis
                                                                                            Redis5种数据类型
                                                                                            这篇文章介绍了Redis的五种数据类型:字符串、列表、集合、有序集合和哈希,并通过代码示例展示了如何在Spring框架中使用RedisTemplate操作这些数据类型。
                                                                                            Redis5种数据类型
                                                                                            |
                                                                                            3月前
                                                                                            |
                                                                                            存储 NoSQL Java
                                                                                            深入理解Redis数据类型Hashes原理
                                                                                            本文深入分析了Redis中的hashes数据类型,这是一种用于存储行记录的数据结构,允许一个key下存储多条记录。
                                                                                            深入理解Redis数据类型Hashes原理
                                                                                            |
                                                                                            3月前
                                                                                            |
                                                                                            存储 NoSQL 算法
                                                                                            深入理解Redis数据类型Zset原理
                                                                                            本文深入探讨了Redis中的Zset(有序集合)数据类型,它是一种可以存储排序功能的集合,其中每个元素都具有一个浮点型的score属性,用于根据score进行排序。
                                                                                            深入理解Redis数据类型Zset原理
                                                                                            |
                                                                                            3月前
                                                                                            |
                                                                                            存储 NoSQL 算法
                                                                                            Redis6入门到实战------ 三、常用五大数据类型(列表(List)、集合(Set)、哈希(Hash)、Zset(sorted set))
                                                                                            这是关于Redis 6入门到实战的文章,具体内容涉及Redis的五大数据类型:列表(List)、集合(Set)、哈希(Hash)、有序集合(Zset(sorted set))。文章详细介绍了这些数据类型的特点、常用命令以及它们背后的数据结构。如果您有任何关于Redis的具体问题或需要进一步的帮助,请随时告诉我。
                                                                                            |
                                                                                            3月前
                                                                                            |
                                                                                            消息中间件 存储 NoSQL
                                                                                            redis实战——go-redis的使用与redis基础数据类型的使用场景(一)
                                                                                            本文档介绍了如何使用 Go 语言中的 `go-redis` 库操作 Redis 数据库
                                                                                            172 0
                                                                                            redis实战——go-redis的使用与redis基础数据类型的使用场景(一)
                                                                                            |
                                                                                            3月前
                                                                                            |
                                                                                            存储 缓存 NoSQL
                                                                                            深入理解Redis数据类型String原理
                                                                                            本文深入探讨了Redis中String数据类型的实现原理和使用场景,基于Redis 5.0版本进行分析。
                                                                                            深入理解Redis数据类型String原理