redis的核心基础数据结构


Redis核心数据类型包括:String(字符串)、Hash(哈希)、List(列表)、Set(集合)、Zset(有序集合)、Bitmaps(位图)、HyperLogLog(基数统计)、Geospatial(地理空间)以及Stream(流)。

redis客户端指令(永远的神):help (比如help @string)

help命令可返回 Redis 命令列表

image.png

Redis 常用的数据类型包括:
1.String(字符串):    key——value(String)

a.最基本的数据类型,可以存储文本、数字等。

b.用于缓存、计数器等场景。

String常见应用场景

  • 单值缓存:set key value(用户点赞数)     Append key value

  • 对象缓存:1、set user:1   {“name”:“roy”,“balance”:888} (比如:用户管理,登录信息)

    image.png

  • 分布式锁(防止并发冲突):

       SETNX product:10001 true  //返回1代表获取锁成功//返回0代表获取锁失败(SETNX当key不存在时value才会设置成功。也就是第一次设置返回1,如果key已经存在了,不会设置成功,返回0


      释放锁:DEL product:10001(比如说处理完了这个订单,释放锁。但是如果服务挂了,锁入如果释放不了,就会造成阻塞。使用TTL product:10001——如果是-1说明没有设置过期时间)
    设置过期时间:EXPIRE product:10001 10(10秒过期,自动释放锁)

       SET product:10001 true ex 10 nx //防止程序意外终止导致死锁



2.Hash(哈希):(help @hash)


13398536-1fb9-4ed9-927d-d5f93588a761.png

a.类似于一个键值对集合,适合存储对象。

b.用于存储用户信息等结构化数据。

应用场景:
1对象缓存
HSET user:1 name roy balance 1888
hget user:name ——roy
HMGET user:1 name balance —— roy 1888
3.List(列表):
a.有序的字符串列表,可以从两端推入或弹出元素。

b.用于消息队列、任务列表等。

      • 常用数据结构

        • Stack(栈)=LPUSH +LPOP          (栈:先进后出,后进先出)

        • Queue(队列)= LPUSH + RPOP    (队列:先进先出,后进后出)

        • Blocking MQ(阻塞队列)=LPUSH+ BRPOP

      • 常见应用场景

        • 视频列表、签到列表

        • 排队机(比如:吃饭排队)

        • 简化版的MQ

4.Set(集合):

f6221bc6-9c96-4cd3-9eb9-89a81ad7c858.png

a.无序的字符串集合,支持集合运算(如交集、并集、差集)。

b.用于标签、唯一性检查等。

      • Set常用操作

        • SADD key member [member ...     //往集合key中存入元素,元素存在则忽略若key不存在则新建

        • SREM key member [member ...   ///1从集合key中删除元素

        • SMEMBERS key    //获取集合key中所有元素

        • SCARD key     ////获取集合key的元素个数

        • SISMEMBER key member    //判断member元素是否存在于集合key中

        • SRANDMEMBER key [count   //从集合key中选出count个元素,元素不从key中删除

        • SPOP key [count]    //从集合key中选出count个元素,元素从key中删除

      • Set运算操作

        • SINTER key 「key ...        //交集运算

        • SINTERSTORE destination key [key ..]      //将交集结果存入新集合destination中

        • SUNION key 「key ..          //并集运算

        • SUNIONSTORE destination key [key ...    //将并集结果存入新集合destination中

        • SDlFF key 「key ...        //差集运算

        • SDIFFSTORE destination key [key ...    //将差集结果存入新集合destination中

      • Set应用场景

        • 微信抽奖小程序

          • 1)点击参与抽奖加入集合    SADD key fuserlD}

          • 2)查看参与抽奖所有用户   SMEMBERS key

          • 3)抽取count名中奖者    SRANDMEMBER key [count] (可以重复中奖)/ SPOP key [count](不能重复中奖)

• 微信微博点赞,收藏,标签
1) 点赞   (key为 消息:id,value 点赞数 )
SADD like:{消息ID} {用户ID}
2) 取消点赞
SREM like:{消息ID} {用户ID}
3) 检查用户是否点过赞
SISMEMBER like:{消息ID} {用户ID}
4) 获取点赞的用户列表
SMEMBERS like:{消息ID}
5) 获取点赞用户数
SCARD like:{消息ID}
• 集合操作
SINTER set1 set2 set3  { c } 共同关注的人
SUNION set1 set2 set3  { a,b,c,d,e } 朋友圈的人
SDIFF set1 set2 set3  { a } 推荐好友

5.Zset(有序集合):

Zset 的底层数据结构
Zset(有序集合)的底层实现是通过 跳表(Skip List) 和 哈希表(Hash Table) 的结合:

●跳表(Skip List):
○用于按分数排序元素,支持快速的范围查询和排序操作
○跳表是一种平衡数据结构,能够在 O(log N) 时间复杂度内完成插入、删除和查找操作。
●哈希表:
○用于快速查找元素的分数。
○哈希表提供了 O(1) 的查找时间复杂度。
通过结合跳表和哈希表,Redis 的 Zset 能够高效地支持按分数排序的操作,同时也能快速查找和更新元素的分数。



1250f73e-3cf7-41c0-808c-d7ede3e03461.png

a.类似于 Set,但每个元素关联一个分数,元素按分数排序。

b.用于排行榜、优先队列等。

ZSet有序列表类型
•  ZSet常用操作
ZADD key score member [[score member]…] //往有序集合key中加入带分值元素
ZREM key member [member …] //从有序集合key中删除元素
ZSCORE key member //返回有序集合key中元素member的分值
ZINCRBY key increment member //为有序集合key中元素member的分值加上increment
ZCARD key //返回有序集合key中元素个数
ZRANGE key start stop [WITHSCORES] //正序获取有序集合key从start下标到stop下标的元素
ZREVRANGE key start stop [WITHSCORES] //倒序获取有序集合key从start下标到stop下标的元素
• Zset集合操作
ZUNIONSTORE destkey numkeys key [key ...] //并集计算
ZINTERSTORE destkey numkeys key [key …] //交集计算
ZSet应用场景
• Zset集合操作实现排行榜
1)点击新闻
ZINCRBY hotNews:20190819 1 守护香港
2)展示当日排行前十
ZREVRANGE hotNews:20190819 0 9 WITHSCORES
3)七日搜索榜单计算
ZUNIONSTORE hotNews:20190813-20190819 7
hotNews:20190813 hotNews:20190814... hotNews:20190819
4)展示七日排行前十

ZREVRANGE hotNews:20190813-20190819 0 9 WITHSCORES

    

6.Bitmap(位图):二进制

37375860-2f82-4e91-b3be-633970c21597.png

a.用于操作位数组,适合存储大量布尔值。

b.用于用户签到、状态标记等。

Bitmap常用操作
SETBIT key offset value //将一个二进制数组的offset位置设置成value。value只能是0或者1。
GETBIT key offset //返回一个二进制数组的offset位置的值。
BITCOUNT key [start end [BYTE|BIT]] //返回二进制数组中1的个数
BITPOS key bit [start [end [BYTE|BIT]]] //返回bitmap中第一个值为bit的offset位置。

BITOP AND|OR|XOR|NOT destkey key [key ...] //对两个bitmap做二进制的与或非计算。

• 每日签到
SETBIT dailycheck:1 100 1 1号用户第100天完成了签到
BITCOUNT dailycheck:1 统计1号用户的签到次数
BITPOS dailycheck:1 统计1号用户第一天签到的时间
• 优点
快速、高效、节省空间


7.HyperLogLog:
a.用于基数统计,适合估算独立元素的数量(用于统计一个集合中不重复的元素个数。)。

b.用于统计 UV(独立访客数,比如ip)等。

• Hyperloglog常用操作
PFADD visitlog 192.168.65.111 192.168.65.112 192.168.65.111 //添加用户访问记录
PFCOUNT visitlog //统计不同的独立访客
• Hyperloglog其他操作
PFMERGE destkey [sourcekey [sourcekey ...]] //将多个hyperloglong数据整合成一条
8.Geo(地理位置):
a.用于存储地理位置信息,支持地理位置计算。

b.用于位置服务、附近搜索等。

常用操作
GEOADD key [NX|XX] [CH] longitude latitude member [longitude latitude member ...] //添加一个或多个地点
GEOPOS key [member [member ...]] //返回地址的经纬度
GEODIST key member1 member2 [M|KM|FT|MI] //计算两个地点之间的距离
GEORADIUS key longitude latitude radius M|KM|FT|MI [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count
[ANY]] [ASC|DESC] [STORE key|STOREDIST key] //查询某个经纬度地址附近的地点
GEOSEARCH key FROMMEMBER member|FROMLONLAT longitude latitude BYRADIUS radius
M|KM|FT|MI|BYBOX width height M|KM|FT|MI [ASC|DESC] [COUNT count [ANY]] [WITHCOORD]
[WITHDIST] [WITHHASH] //查询某个地点附近的地点
Geo应用场景
获取经纬度
GEOADD changsha 113.017489 28.200454 火车站
112.96903 28.201195 橘子洲 113.017031 28.199706 赛格广
场 113.017004 28.197677 国储
• 查询距离
GEODIST changsha 火车站 橘子洲 M
• 查找火车站附近的景点
GEORADIUSBYMEMBER changsha 火车站 2 KM withdist

withcoord count 4 withhash

9stream类型

• 作用介绍:
Redis版的MQ -- 阻塞队列 + pub/sub
了解即可,企业应用比较少。
• 常用操作
XADD key [NOMKSTREAM] [MAXLEN|MINID [=|~] threshold [LIMIT count]] *|id field value [field value ...]
//往对列的末尾发布一条消息
XDEL key id [id ...] // 删除队列中的一条消息
XLEN key //获取队列的长度
XRANGE key start end [COUNT count] //查询队列中的消息
stream应用示例
• 创建队列,并添加消息 *表示让系统自动生成ID
XADD mystream * name loulan name roy name admin
• 查看对列消息 - 对列开始 + 对列结尾
XRANGE mystream - +
• 创建消费者组 0 从队列头部开始消费。 $ 从队列尾部开始消费
XGROUP CREATE mystream groupA 0
• 消费消息 > 表示从第一条未被消费过的消息消费。也可以指定ID
XREADGROUP GROUP groupA consumer1 count 2 STREAMS mystream >
• 查看消费者组的消费进度
XPENDING mystream groupA




本文原创,转载必追究版权。

分享给朋友:

相关文章

plsql 中number类型字段 取消科学计数法显示

 PL/SQL DEVELOPER中禁用科学计数法:Tools - Prefrence - SQL Window - 选择:"Number fields to_char&quo...

freeMarker 截取字符串(操作字符串函数 )

<#if c.proSummary!?length gt 25>  <!-- 如果长度 >25 截取25个字-->    ...

freemarker 判断日期变量为空处理 及InvalidReferenceException异常处理

at freemarker.core.InvalidReferenceException.getInstance(InvalidReferenceException.java:98);InvalidR...

MyEclipse10.7注册码生成

注意经验里的工具可能不可用,请点击 生成注册码工具  下载。提取码:p1w4MyEclipse10.7注册码激活步骤:点击下面的链接http://jingyan.baidu.com/arti...

Java 实现用户资料完整度的前端显示(或根据填写资料自动评分)

前端使用 Bootstrap 的进度条组件显示百分比,后台读取权重并计算信息完整度,并将计算的结果返回给前端,供页面显示。CSS1<link href="static/sc/...

jquery 获取焦点

当文本框或下拉等必填时,如果没有输入就给予提示并使该文本框获得焦点!如果是js,对象.focus()即可。可是如果是jQuery, 这样$("#aa") 返回的就不是DOM对象而是...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。