Redis十大数据类型(上篇)

Posted Al6n Lee

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Redis十大数据类型(上篇)相关的知识,希望对你有一定的参考价值。

文章目录

概述


  • 命令官网

  • Key命令

    命令不区分大小写,但是key区分

    命令说明
    keys *查看当前库所有的key
    exists key判断某个key是否存在,返回1表示存在,返回0表示不存在
    type key查看你的key是什么类型
    del key删除指定的key数据
    unlink key非阻塞删除,仅仅将keys从keyspace元数据中删除,真正的删除会在后续异步中操作
    ttl key查看还有多少秒过期,-1表示永不过期,-2表示已过期
    expire key 秒数给定的key设置过期时间
    move key dbindex【0-15】将当前数据库的 key移动到给定的数据库 db 当中
    select dbindex切换数据库[0-15] ,默认为0,配置文件中databases 16
    dbsize查看当前数据库key的数量
    flushdb清空当前库
    flushall通杀全部库
  • Redis 的过期时间设置有四种形式:

    • EXPIRE 秒——设置指定的过期时间(秒),表示的是时间间隔。
    • PEXPIRE 毫秒——设置指定的过期时间,以毫秒为单位,表示的是时间间隔。
    • EXPIREAT 时间戳-秒——设置指定的 Key 过期的 Unix 时间,单位为秒,表示的是时间/时刻。
    • PEXPIREAT 时间戳-毫秒——设置指定的 Key 到期的 Unix 时间,以毫秒为单位,表示的是时间/时刻。

redis字符串(String)

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

  • 最最常用 set key value

    set key value [NX|XX] [GET] [EX seconds|PX milliseconds|EXAT unix-time-seconds|PXAT unix-time-milliseconds|KEEPTTL]


  • 常用命令图示


  • 多值设置 msetmget

    • mset
      • 同时设置一个或多个 key-value 对
    • mget
      • 获取所有(一个或多个)给定 key 的值
  • 获取指定区间范围内的值 getrangesetrange

    • getrange

      类似between…and的关系

      • 从零到负一表示全部
    • setrange

      设置指定区间范围内的值,格式是setrange key值 具体值
      起到覆盖

  • 数值增减 INCR keyDECR key

    一定要数值类型数据

    • INCR key

      递增

      • INCR key increment
    • DECR key

      递减

      • DECR key increment
  • 获取内容长度及内容追加 STRLEN keyAPPEND key xxx

    • STRLEN key

      长度

    • APPEND key xxx

      内容追加

  • 动态设置过期时间,分布式锁

    • SETEX key 秒数 value
    • key不存在时才设置 SETNX key value
  • 先弹出老值,再建新值 getset

redis列表 (List)

Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)
它的底层实际是个双端链表,最多可以包含 232 - 1 个元素 (4294967295, 每个列表超过40亿个元素)

  • 常用命令图示


  • lpush/rpush/lrange

    没有rrange

  • lpop/rpop

    出栈,弹出元素

  • 按照索引下标获得元素(从上到下) lindex

  • 获取列表中的元素个数 llen

  • 根据值删除 lrem key 数字N 给定值v1

    解释(删除N个值等于v1的元素),LREM list3 0 值,表示删除全部给定的值。零个就是全部值

  • 截取索引范围内的,相当于删除索引外的 ltrim key 开始index 结束index

    截取指定索引区间的元素,格式是ltrim list的key 起始索引 结束索引

  • 移除列表的最后一个元素,并将该元素添加到另一个列表并返回keyrpoplpush 源列表 目的列表

  • 按照索引修改列表的元素 lset key index value

  • 在已有的值前面/后面插入新的值 linsert key before/after 已有值 插入的新值

redis哈希表(Hash)

Redis hash 是一个 string 类型的 field(字段) 和 value(值) 的映射表,hash 特别适合用于存储对象。
Redis 中每个 hash 可以存储 2^32 - 1 键值对(40多亿)
本质就是KV,K不变的情况下,V拆分新的kv

  • 常用命令图示

  • hset/hget/hmset/hmget/hgetall/hdel

    增、查、批量增、批量查、查全部(python的dick.items())、删除

  • hlen KEY,获取hash内的kv键值对个数

  • hexists KEY 在KEY里面的某个值的key 判断某个值在不在里面

    存在返回1,不存在返回0

  • hkeys/hvals KEY 单独罗列key、单独罗列key对应的值

  • hincrby/hincrbyfloat 增加

  • hsetnx KEY key value 不存在赋值,存在了无效

    不存在赋值,存在了无效

  • 应用:购物车

    新增商品 → hset shopcar:uid1024 334488 1
    
    新增商品 → hset shopcar:uid1024 334477 1
    
    增加商品数量 → hincrby shopcar:uid1024 334477 1
    
    商品总数 → hlen shopcar:uid1024
    
    全部选择 → hgetall shopcar:uid1024
    

redis集合 (Set)

Redis 的 Set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据,集合对象的编码可以是 intset 或者 hashtable。
Redis 中Set集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。
集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)

  • 常用命令说明

  • 添加元素SADD key member [member...]

  • SMEMBERS key 遍历集合中的所有元素

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

  • SREM key member [member ...] 删除元素

  • scard key 统计集合里面的元素个数

  • 从集合中随机展现设置的数字个数元素,元素不删除 SRANDMEMBER key [数字]

  • SPOP key [数字] 从集合中随机弹出一个元素,出一个删一个

  • smove key1 key2 在key1里已存在的某个值 将key1里已存在的某个值赋给key2

  • 重要,集合运算

    • 集合的差集运算 A - B =》 SDIFF set1 set2
    • 集合的并集运算 A U B = 》 SUNION set1 set2
    • 集合的交集运算 A n B =》 SINTER set1 set2
    • SINTERCARD numkeys key [key ...] [LIMIT limit]
  • 应用:共同好友、推荐

redis有序集合 (ZSet)

Redis zset 和 set 一样也是string类型元素的集合,且不允许重复的成员。
不同的是每个元素都会关联一个double类型的分数,redis正是通过分数来为集合中的成员进行从小到大的排序。
zset的成员是唯一的,但分数(score)却可以重复。
zset集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。 集合中最大的成员数为 232 - 1

  • 常用命令图示


  • 添加元素 ZADD key score member [score member ...]

  • 按照元素分数从小到大的顺序遍历出来 ZRANGE key start stop [WITHSCORES]

    WITHSCORES 参数不带,会返回值,带了的话会连同分数一起返回
    返回索引从start到stop之间的所有元素0

  • 倒序 zrevrange

  • ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count] 获取指定分数范围的元素

    limit是返回的数量,与mysql分页相似 ZRANGEBYSCORE zset1 60 90 withscores limit 0 1

  • ZSCORE key member 获取元素的分数

  • ZCARD key 获取集合中元素的数量

  • zrem key 某score下对应的value值 作用是删除元素

  • 增加某个元素的分数ZINCRBY key increment member

  • 获得指定分数范围内的元素个数ZCOUNT key min max

  • ZMPOP从键名列表中的第一个非空排序集中弹出一个或多个元素,它们是成员分数对

  • zrank key values值,作用是获得下标值

  • zrevrank key values值,作用是逆序获得下标值

  • 应用:根据商品销售对商品进行排序显示

Redis 十大数据类型命令及案例大全

十大数据类型

官网:Commands | Redis

一图概览

Redis7 十大数据类型基本命令和案例脑图概览
✨✨🔶文章末尾有彩蛋哦

一、字符串(String)

  1. 设置指定 key 的值
set key value
  1. 获取指定 key 的值
get key
  1. 返回 key 中字符串的子字符
getRange key start end
  1. 设置指定 key 的值,并返回旧值
getSet key value

set key value get
  1. 获取所有 key 值
keys *

mGet key1 key2 ...
  1. 设置指定 key 的值,并指定过期时间
  • 以秒为单位
set key value ex seconds
setEx key seconds value
# 通过 ttl key 获取过期时间,-1 永不过期;-2 已过期
  • 以毫秒为单位
pSetEx key millisecond value

更新数据并且保持原来的过期时间

set key value keepttl
  1. 当 key 不存在的时候设置 key 的值
setNx key value
  1. 从偏移量 offset 开始,覆盖原来的 value 值
setRange key offset value
  1. 返回 key 所存储的字符串的长度
strLen key
  1. 同时设置一个或多个 key-value 对

    mSet key1 value2 key2 value2 ...
    

    同时设置多个 key-value 对,当给定的 key 都不存在时

    mSetNx key1 value2 key2 value2 ...
    
  2. 将 key 中存储的数值加一

    incr key
    

    指定增长量

    incrBy key increment
    

    指定增长的浮点增量值

    incrByFloat key increment
    
  3. 将 key 中增长量的数值减一

    decr key
    

    指定 减量值

    decrBy key increment
    
  4. 如果 key 存在且为字符串,将 value 值追加到末尾

    append key value
    

二、列表(List)

  1. 添加元素
# 将一个或多个值插入到列表的头部
lpush key value1 value2 value3 ......
# 将一个或多个值插入到已存在的列表的头部
lpushx key value

# 将值插入到列表的尾部
rpush key value1 value2 value3 ......
# 将一个或多个值插入到已存在的列表的尾部
rpushx key value
  1. 遍历元素
# 遍历所有元素
lrange key  0 -1
# 遍历 索引范围为 start — top 的元素
lrange key start stop
  1. 移除并返回元素
# 移除并获取列表的第一个元素
lpop key

# 移除并获取列表的最后一个元素
rpop key
  1. 通过索引获取列表中的元素
lindex key index
  1. 获取列表的长度
llen key
  1. 在列表的元素前或后插入元素
# 在列表元素 pivot 前面插入 element
linsert key before pivot element

# 在列表元素 pivot 后面插入 element
linsert key after pivot element
  1. 通过索引设置元素的值
lset key index value
  1. 删除列表元素中重复的n个值
# 删除 N 个 值等于 value 的元素
lrem key N value
  1. 截取指定范围的值后赋值给key
ltrim key start stop
  1. 移除列表的最后一个元素并将该元素添加到另外一个列表并返回

    # 将 key1 列表的最后一个元素移除,并添加到 key2 列表
    rpoplpush key1 key2
    

三、哈希(Hash)

  1. 设置hash

    # 将哈希表 key 中的字段 field 的值设为 value
    hset key field value
    # 同时将多个 field-value 对设置到 hash表 key 中
    hmset key field1 value field2 value2 ......
    # 当字段 field 不存在时,设置哈希表字段的值
    hsetnx key field value
    
  2. 获取

    # 获取存储在哈希表中指定字段的值
    hget key field
    # 获取所有给定的字段值
    hmget key field1 field2 ......
    # 获取在哈希表中指定 key 的所有字段和值
    hgetall key
    # 获取所有字段
    hkeys key
    # 获取所有值
    hvals key
    
  3. 删除

    # 删除一个或多个哈希表字段
    hdel key field1 field2 ......
    
  4. 获取哈希表中字段的数量

    hlen key
    
  5. 查看哈希表 key 中是否存在指定字段

    hexists key field
    
  6. 哈希表 key 中指定字段 增加

    # 为哈希表 key 中指定字段的整数数值加上增量 increment
    hincrby key field increment
    # 为哈希表 key 中指定字段的浮点数值加上增量 increment
    hincrbyfloat key field increment
    

四、集合(Set)

  1. 向集合中添加成员

    sadd key member1 [member2 ......]
    
  2. 遍历集合中的所有元素

    smembers key
    
  3. 获取集合中的元素个数

    scard key
    
  4. 判断元素是否在集合中

    sismember key member
    
  5. 删除元素

    # 删除集合中的一个或多个成员
    srem key member1 [memeber2 ...]
    # 随机删除 count 个元素并返回
    spop key count
    
    # 将 member 元素从 集合1 移动到 集合2
    smove key1 key2 member
    
  6. 返回集合中一个或多个随机数

    srandmember key count
    # eg: 随机返回set1中的 n个随机数
    srandmember set1 n
    
  7. 集合的运算

    1. 差集(A-B)

      sdiff key1 [key2 ...]
      # 返回给定所有集合的差集并存储在 destination 中
      sdiffstore destination key1 [key2 ...]
      
    2. 并集(A∪B)

      sunion key1 [key2 ...]
      # 返回给定所有集合的并集并存储在 destination 中
      sunionstore destination key1 [key2 ...]
      
    3. 交集(A∩B)

      sinter key1 [key2 ...]
      返回给定的所有集合的交集并存储在 destination 中
      sinterstore destination key1 [key2 ...]
          
      # redis7 新命令,不会返回结果集,返回结果的交集的基数(个数)
      sintercard keyCount key1 [key2 ...]
      

五、有序集合(ZSet)

  1. 添加一个或多个成员

    zadd key score1 member1 [score1 member1 ...]
    
  2. 通过索引区间返回有序集合指定区间内的成员

    # 按照元素分数从底到高的顺序 withcores带分数
    zrange key start stop [withcores]
    # 按照元素分数从高到底的顺序 withcores带分数
    zrevrange key start stop [withcores]
        
    # 通过分数从低到高返回有序集合指定区间的成员
    # 默认包含边界,( 表示不包含边界
    zrangebyscore key min max [withscores] [limit offset count]
    # 通过分数从高到低返回有序集合指定区间的成员
    zrevrangebyscore key max min [withscores] [limit offset count]
    
  3. 获取元素的分数

    zscore key member
    
  4. 获取集合中元素的数量

    scard key
    
  5. 获取指定分数范围内的元素个数

    zcount key min max
    
  6. 获取指定成员的索引

    zrank key member
    
    # 获取指定成员的索引,逆序
    zrevrank key member
    
  7. 删除

    zrem key member1 [member2 ...]
    # 删除指定成员区间的所有成员
    zremrangebylex key [memberStart [memberStop
    # 删除指定索引区间(排名区间)的所有成员
    zremrangebyrank key indexStart indexStop
    # 删除指定的分数区间的所有成员
    zremrangebyscore key minScore maxScore
    
  8. 增加某个元素的分数

    zincrby key increment member
    

六、位图(bitmap)

  1. 给指定 key 的值的第 offset 赋值value

    setbit key offset value
    # value的值只能位 0 或者 1
    
  2. 获取指定 key 的第offset位

    getbit key offset
    
  3. 统计字节数占用多少

    strlen key
    
  4. 统计 1 的个数

    bitcount key start end
    
  5. 对不同的二进制存储数据进行位运算(and、or、not、xor)

    bitop operation destinationKey key
    # eg:统计两天都连续签到的用户
    # 	将用户id和位置做映射,如下
    # 	用户 023uh 映射为 0
    hset uid:map 0 023uh
    # 	用户 02rhh 映射为 1
    hset uid:map 1 02rhh
    
    # 模拟用户在 20240201 20240202 两天的登录
    setbit 20240201 0 1
    setbit 20240201 1 1
    setbit 20240201 2 1
    setbit 20240201 3 1
    
    setbit 20240202 0 1
    setbit 20240202 1 1
    
    bitop and destinationKey 20240201 20240202
    bitcount destinationKey
    

七、基数统计(HyperLoglog)

  1. 添加元素到HyperLoglog

    pfadd key element1 [element2 ...]
    
  2. 获取基数估计值

    pfcount key1 [key2 ...]
    
  3. 合并 HyperLoglog

    pfmerge destinationKey sourceKey1 [sourceKey2 ...]
    

八、地理空间(GEO)

  1. 添加经纬度坐标

    geoadd key longitude1 latitude1 member1 [longitude2 latitude2 member2 ...]
    
  2. 遍历

    zrange key start end
    zrange city 0 -1
    
  3. 返回元素的经纬度

    geopos key member1 [member2 ...]
    # geohash表示
    geohash key member1 [member2 ...]
    
  4. 返回两个位置之间的距离

    geodist key member1 member2
    
  5. 返回与给定的经纬度的中心位置不超过给定的最大距离的所有位置元素

    # 以半径为中心,查找
    georadius key longitude latitude radius m[km ...]
    
    georadiusbymember key member radius m[km ...]
    

九、流(Stream)

  1. 添加消息到队列末尾
# 消息的 id必须要比上一个 id大,默认用 星号表示自动生成规则
xadd key id/*  field1 value1 [field2 value2 ...]

xadd mystream * id 11 cname z3
  1. 获取消息列表,忽略删除的消息
xrange key start end [count count]
# eg
xrange mystream - + count 4
# 反向获取,ID 从大到小
xrevrange key end start [count count]
  1. 删除消息
xdel key id1 [id2 ...]
  1. 获取消息长度
xlen key
  1. 对Stream长度进行截取,超长会进行截取
# 允许的最大长度
xtrim key maxlen mumber
# 允许的最小id,比该id小的值会被舍弃
xtrim key minid mumber
  1. 获取消息
# 非阻塞
xread [count count] streams key id1 [id2 ...]
# eg:
xread count 2 streams mystream $
xread count 2 streams mystream 0-0
    
# 阻塞
xread [count count] block milliseconds streams key id1 [id2 ...]
# eg:
xread count 1 block 0 streams mystream $
  1. 创建消费组
xgroup create key groupName id|$
    
# eg:
xgroup create mystream groupA $
xgroup create mystream groupB 0
  1. 读取消费者组中的消息
xreadgroup group groupName consumerName [count count] streams key

# eg
xreadgroup group groupA consumer1 count 2 streams mystream >
xreadgroup group groupA consumer2 count 2 streams mystream >
xreadgroup group groupA consumer3 count 2 streams mystream >
  1. 获取消费组内所有消费者待处理的详细消息
# 查询每个消费组内所有消费者 [已读但未确认] 的消息
xpending key groupName
# 查看某个消费者具体读取了那些数据
xpending key groupName start stop count consumerName
# eg: 
xpending mystream groupA - + 10 consumer2

  1. 向消息队列确认消息处理完成

    xack key groupName id
    
    # eg:
    xack mystream groupA 1679119688868-0
    
  2. 打印Stream、Consumer、Group的详细信息

    xinfo stream key
    

十、位域(bitfield)

如何获取原文高清脑图

彩蛋: ✨✨✨✨通过下方微信公众号获取Redis学习资源

以上是关于Redis十大数据类型(上篇)的主要内容,如果未能解决你的问题,请参考以下文章

[Redis] 十大数据类型 -- Strings

Redis的十大常见应用场景

Java十大常用框架介绍(spring系+dubbo+RabbitMQ+Ehcache+redis)

Redis数据库操作持久化详解及内存管理基础概览

Redis主从集群搭建及主从复制原理解析

python操作redis list