Marvel-Site Marvel-Site
首页
  • Java

    • Java基础
    • Java进阶
    • Java容器
    • Java并发编程
    • Java虚拟机
  • 计算机基础

    • 数据结构与算法
    • 计算机网络
    • 操作系统
    • Linux
  • 框架|中间件

    • Spring
    • MySQL
    • Redis
    • MQ
    • Zookeeper
    • Git
  • 架构

    • 分布式
    • 高并发
    • 高可用
    • 架构
  • 框架

    • React
    • 其他
  • 实用工具
  • 安装配置

    • Linux
    • Windows
    • Mac
  • 开发工具

    • IDEA
    • VsCode
  • 关于
  • 收藏
  • 草稿
  • 索引

    • 分类
    • 标签
    • 归档
GitHub (opens new window)

Marvel

吾必当乘此羽葆盖车
首页
  • Java

    • Java基础
    • Java进阶
    • Java容器
    • Java并发编程
    • Java虚拟机
  • 计算机基础

    • 数据结构与算法
    • 计算机网络
    • 操作系统
    • Linux
  • 框架|中间件

    • Spring
    • MySQL
    • Redis
    • MQ
    • Zookeeper
    • Git
  • 架构

    • 分布式
    • 高并发
    • 高可用
    • 架构
  • 框架

    • React
    • 其他
  • 实用工具
  • 安装配置

    • Linux
    • Windows
    • Mac
  • 开发工具

    • IDEA
    • VsCode
  • 关于
  • 收藏
  • 草稿
  • 索引

    • 分类
    • 标签
    • 归档
GitHub (opens new window)
  • Java

  • 计算机基础

  • 框架|中间件

    • Spring

    • MyBatis

    • MySQL

    • Redis

      • Redis简介
      • Redis常用命令
      • Redis底层数据结构
      • Redis数据结构
        • 1 String
        • 2 Hash
        • 3 List
        • 4 Set
        • 5 Sorted Set
        • 6 Bitmap
        • 7 HyperLogLog
        • 8 GEO
      • Redis多线程单线程问题
      • Redis过期删除策略和缓存淘汰机制
      • Redis持久化
      • Redis分布式锁
      • Redis事务
      • Redis缓存穿透、缓存击穿、缓存雪崩
      • Redis集群 - 哨兵模式
      • Redis集群 - Redis集群
    • 消息队列

    • Zookeeper

    • Git

    • Maven

    • Gradle

  • 架构

  • 后端
  • 框架|中间件
  • Redis
Marvel
2022-07-16
目录

Redis数据结构

# Redis数据结构

命令不区分大小写,Key区分大小写

help @数据结构:查看指令

# 1 String

🔶 介绍:简单动态字符串(SDS),通过key获得value

🔶 普通命令

设置:set <key> <value>
获取:get <key>
批量设置:mset <k1> <v1> <k2> <v2> ...
批量获取:mget <k1> <k2> ...
递增数字:INCR <key>
增加指定的整数:INCRBY <key> <increment>
递减数字:DECR <key>
递减指定的整数:DECRBY <key> <increment>
获取字符串长度:STRLEN key
1
2
3
4
5
6
7
8
9

🔶 分布式命令

setnx <key> <value>
1

不存在创建,存在不创建

set <key> <value> [EX seconds] [PX milliseconds] [NX|XX]
1

EX: key在多少秒之后过期

PX: key在多少毫秒之后过期

NX: 当key不存在的时候,才创建key,等效于setnx

XX: 当key存在的时候,覆盖key

SET k1 v1 NX PX 3000   当key不存在的时候才能创建,过期时间为3000ms
1

🔶 应用场景:一般常用在需要计数的场景,比如用户的访问次数、热点文章的点赞转发数量等等。或者封锁一个IP地址。

incr likes:001  统计001的点赞数量
get likes:001   获取001的点赞数量
1
2

# 2 Hash

🔶 介绍:等价于Java的Map<String, Map<...>>

设置一个字段值:HSET <key> <field> <value>
获取一个字段值:HGET <key> <field>
设置多个字段值:HMSET <key> <field> <value> [<field> <value> ...] 
获取多个字段值:HMGET <key> <field> <value> [<field> <value> ...] 
获取所有字段值:hgetall <key>
获取某个key的属性数量:hlen <key>
删除某个key:hdel <key>
1
2
3
4
5
6
7

🔶 应用场景:

  1. 系统中对象数据存储,比如用户信息(id,name,age)

  2. 购物车

    1. 新增商品 hset shopcar:uid1024 334488 1
    2. 新增商品 hset shopcar:uid1024 334477 1
    3. 增加商品数量 hincrby shopcar:uid1024 334477 1
    4. 商品总数 hlen shopcar:uid1024
    5. 全部选择 hgetall shopcar:uid1024

# 3 List

🔶 介绍:实现双向链表

压入:lpush/rpush <key> <value> [<value> ...]
弹出:lpop/rpop <key>
显示全部:lrange <key>
1
2
3

🔶 应用场景:发布与订阅、消息队列、慢查询、实现最新消息的排行。

关注公众号A和B,只要他们发布新文章就会压入到我的list中

lpush followaccount:uid1024 公众号A的文章

lpush followaccount:uid1024 公众号B的文章 ...

我显示最近10条公众号消息:lrange followaccount:uid1024 0 10

# 4 Set

🔶 介绍:类似于Java的HashSet,无序,不重复

添加元素:SADD <key> <member> [<member> ...]
删除元素:SREM <key> <member> [<member> ...]
获取集合中所有的元素:smembers <key>
判断元素是否在集合中:sismember <key> <member>
获取集合中的元素个数:scard <key>
从集合中随机弹出x个元素,元素不删除:srandmember <key> [数字]
从集合中随机弹出x个元素,元素被删除:spop <key> [数字]
集合运算-差集-属于A但不属于B元素构成的集合:SDIFF key [key ...]
集合运算-交集-属于A也属于B元素构成的集合:SINTER key [key ...]
集合运算-并集-属于A或者属于B元素构成的集合:SUNION key [key ...]
1
2
3
4
5
6
7
8
9
10

🔶 应用场景:需要存放的数据不能删除以及需要获取多个数据源交集和并集等场景。

  1. 抽奖:抽一个获奖者 spop members 1,抽三个获奖者 spop members 3

  2. 好友:微博中每个人的好友存在Set中,可以防止重复

  3. 微博好友共同关注:sinter 用户1 用户2

  4. 微信朋友圈点赞

    1. 新增点赞:sadd pub:msgID 点赞用户ID1 点赞用户ID2 ...
    2. 取消点赞:srem pub:msgID 点赞用户ID1
    3. 展现所有点赞用户:smembers pub:msgID
    4. 点赞数:scard pub:msgID
    5. 判断某个朋友是否对楼主点赞:sismember pub:msgID 用户ID
  5. QQ推荐可能认识的人:先用sinter 用户1 用户2看看共同好友,然后通过sdiff 用户1 用户2找出用户2可能认识的人

# 5 Sorted Set

🔶 介绍:与set相比,增加了一个权重参数score,使集合中的元素能够按照score进行有序排列,还可通过score的范围来获取元素列表,像Java中HashMap和TreeSet的结合体。

添加元素:zadd <key> <score1> <member1> [<score2> <member2> ...]
按照元素分数从小到大的顺序,返回从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>
按照排名范围删除元素:zremrangebyranke <key> <start> <stop>
1
2
3
4
5
6
7
8
9

🔶 应用场景:需要对数据根据某个权重进行排序的场景。比如再直播系统中,实时排行信息包含直播间在线用户列表,各种礼物排行榜,弹幕信息等信息。

根据销售额对商品排序:

  1. 商品编号1001销量是9,商品编号1002销量是15:zadd goods:sellsort 9 1001 15 1002
  2. 客户买了2件1001:zincrby goods:sellsort 2 1001
  3. 商品销量前10:zrange goods:sellsort 0 10 withscores

# 6 Bitmap

🔶 介绍:存储二进制数字,只需要一个bit位来表示某个元素对应的值和状态,key是元素本身。

setbit <key> <offset> <value>
getbit <key> <offset>
1
2

🔶 应用场景:适合需要保存状态信息并需要进一步对这些信息进行分析的场景。如用户签到、活跃用户、用户行为统计(一周的签到情况,7位就行,通过bitcount sign 命令统计)

https://blog.csdn.net/DrLai/article/details/123767851

# 7 HyperLogLog

# 8 GEO

编辑 (opens new window)
#Redis
上次更新: 2023/08/20, 21:21:52
Redis底层数据结构
Redis多线程单线程问题

← Redis底层数据结构 Redis多线程单线程问题→

最近更新
01
位运算
05-21
02
二叉树
05-12
03
Spring三级缓存解决循环依赖
03-25
更多文章>
Theme by Vdoing | Copyright © 2022-2024 Marvel
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式