当前位置: 首页 > article >正文

【Redis学习】Redis10大数据类型

总体概述

在这里插入图片描述

在这里插入图片描述

这里说的数据类型是value的数据类型,key的类型都是字符串。

redis字符串(String)

string是redis最基本的类型,一个key对应一个Tvalue。

string类型是二进制安全的,意思是redis的string可以包含任何数据,比如jpg图片或者序列化的对象。

string类型是Redis最基本的数据类型,一个redis中字符串value最多可以是512M

redis列表(List)

Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)

它的底层实际是个双端链表,最多可以包含2^32- 1个元素(4294967295,每个列表超过40亿个元素)

redis哈希表(Hash)

Redis hash是一个string类型的field(字段)和 value(值)的映射表,hash 特别适合用于存储对象。

Redis中每个hash可以存储2个32-1键值对(40多亿)

redis集合(Set)

Redis的Set是String类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据,集合对象的编码可以是intset或者hashtable。

Redis中Set集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。

集合中最大的成员数为2^32-1(4294967295,每个集合可存储40多亿个成员)

redis有序集合(ZSet、Sorted Set)

Redis zset和 set一样也是string类型元素的集合,且不允许重复的成员。

不同的是每个元素都会关联一个double类型的分数,redis正是通过分数来为集合中的成员进行从小到大的排序。

zset的成员是唯一的,但分数(score)却可以重复。

zset集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。集合中最大的成员数为2^32-1(40亿)

redis地理空间(GEO)

  • Redis GEO主要用于存储地理位置信息,并对存储的信息进行操作,包括:

    添加地理位置的坐标。

    获取地理位置的坐标。

    计算两个位置之间的距离。

    根据用户给定的经纬度坐标来获取指定范围内的地理位置集合。

redis基数统计(HyperLogLog)

HyperLogLog 是用来做基数统计的算法,HyperlLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定且是很小的。

在 Redis里面,每个HyperLogLog键只需要花费12 KB内存,就可以计算接近2^64个不同元素的基数。这和计算基数时,元素越多耗费内存就越多的集合形成鲜明对比。

但是,因为 HyperLogLog只会根据输入元素来计算基数,而不会储存输入元素本身,所以 HyperLogLog 不能像集合那样,返回输入的各个元素。

redis位图(Bitmap)

Bit arrays (or simply bitmaps,我们可以称之为位图)

在这里插入图片描述

由0和1状态表现的二进制位的bit数组

redis位域(Bitfield)

通过bitfield命令可以一次性操作多个比特位域(指的是连续的多个比特位),它会执行一系列操作并返回一个响应数组,这个数组中的元素对应参数列表中的相应操作的执行结果。

说白了就是通过bitfield命令我们可以一次性对多个比特位域进行操作。

redis流(Stream)

Redis Stream是 Redis 5.0版本新增加的数据结构。

Redis Stream主要用于消息队列(MQ,Message Queue),Redis本身是有一个Redis 发布订阅(pub/sub)来实现消息队列的功能,但它有个缺点就是消息无法持久化,如果出现网络断开、Redis宕机等,消息就会被丢弃。

简单来说发布订阅(pub/sub)可以分发消息,但无法记录历史消息。

而 Redis Stream提供了消息的持久化和主备复制功能,可以让任何客户端访问任何时刻的数据,并且能记住每一个客户端的访问位置,还能保证消息不丢失。

命令查阅

官网英文

中文

key操作命令

keys * #查看当前库所有的key
exists key #判断某个key是否存在
type key # 查看key的类型
del key # 删除指定的key数据
unlink key #非阻塞删除,仅仅将keys从keyspace元数据中删除,真正的删除会在后续异步中操作。
ttl key # time to live,查看还有多少秒过期,-1表示永不过期,-2表示已过期
expire key <秒钟> # 为给定的key设置过期时间
move key dbindex【0-15】 # 将当前数据库的key移动到给定的数据库db当中
select dbindex【0-15】# 切换数据库【0-15】,默认为0
dbsize # 查看当前数据库key的数量
flushdb # 清空当前库
flushall # 通杀全部库(慎用!!!)

大小写和帮助命令

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

帮助命令,help @类型

help @string

help @list

help @hash

help @hyperloglog

string

最常用

set key value

在这里插入图片描述

get key # 获取值
mset k1 v1 k2 v2 [...] && mget k1 k2 [...]  # 同时设置/获取多个键值
msetnx k1 v1 k2 v2 [...] # 如果有一个键已存在,则整条命令执行失败(事务的原子性)
getrange k1 start end # 获取指定区间范围内的值,相当于java中的substring方法,获取范围是闭区间[start,end]
# 数值增减(要求value必须能转换成整数)
incr k1 #每执行一次,k1 的值增加1
incrby k1 increment # 每执行一次,k1 的值增加increment
decr k1 # 每执行一次,k1 的值减少1
decrby k1 decrement # 每执行一次,k1 的值减少decrement
# 获取字符串长度和内容追加
strlen k1 # 获取k1的值的长度
append k1 value # 向k1的末尾追加字符串value
# getset(先get再set)
getset k1 value # 返回k1的值,然后将k1 的值设置为value

应用场景:短视频、公众号文章点赞

list

简单说明

list是一个双端链表的结构,容量是2的32次方减1个元素,大概40多亿,主要功能有push/pop等,一般用在栈、队列、消息队列等场景left、right都可以插入添加;

如果键不存在,创建新的链表;如果键已存在,新增内容;

如果值全移除,对应的键也就消失了。

  • 它的底层实际是个双向链表,对两端的操作性能很高,通过索引下标的操作中间的节点性能会较差。

在这里插入图片描述

lpush/rpush/lrange # 从左压入、从右压入、从左遍历
lpop/rpop # 从左弹出、从右弹出
lindex # 按照索引下标获得元素(从上到下)
llen # 获取列表中元素的个数
lrem key 数字N 给定值v1 # 删除N个值等于v1的元素
ltrim key开始index 结束index # 截取指定范围的值后再赋值给key,类似string的substring截取字串方法
rpoplpush 源列表 目的列表 # 将源列表最后一个元素取出,插入目标列表的头部
lset key index value # 将列表的索引为index的元素设置为value
linsert key before/after 已有值 插入的新值 # 在已有值的前/后插入新的值

应用场景:微信公众号的订阅消息

hash

说明

hash的kv模式不变,但v是一个键值对(此时k相当于哈希表的名称)

类似Java中的Map<String,Map<String,String>>类型。

hset/hget/hmset/hmget/hgetall/hdel # 设置、获取、多项设置、多项获取、获取全部、删除
hlen # 获取某个key内的全部数量
hexists key # 判断某个key是否存在
hkeys/hvals # 获取全部的key/value
hincrby/hincrbyfloat # 增加(整形/浮点型)
hsetnx # 不存在时设置

应用场景:中小型系统购物车设计

set

SADD key member [member ...] # 添加元素
SMEMBERS key # 遍历集合中的所有元素
SISMEMBER key member # 判断元素是否在集合中
SREM key member [member ...] # 删除元素
SCARD # 获取集合里面的元素个数,cardinary基数
SRANDMEMBER key [数字] # 从集合中随机展现设置的数字个数元素,元素不删除
SPOP key [数字] # 从集合中随机弹出一个元素,出一个删一个
SMOVE key1 key2 member # 将key1里已存在的某个值member赋给key2
# 集合运算
SDIFF key member [member ...] # 求差集
SUNION key member [member ...] # 求并集
SINTER key member [member ...] # 求交集
SINTERCARD numkeys key [key ...][LIMIT limit] # redis7新命令,它不返回结果集,而只返回结果的基数。返回由所有给定集合的交集产生的集合的基数

应用场景:微信抽奖小程序、微信朋友圈点赞查看同赞朋友、QQ内推可能认识的人。

zset

说明

在set基础上,每个val值前加一个score分数值。之前set是k1 v1 v2 v3,现在zset是k1 (score1 v1) (score2 v2)

为了命令设计得简便,Sorted Set别名为ZSet,这样可以使用Z为首字母的一系列命令。

# 向有序集合中加入一个元素和该元素的分数
ZADD key score member [score member ...] # 添加元素,每一组score和member为一个对象
ZRANGE key start stop [WITHSCORES] # 按照元素分数从小到大的顺序,返回索引从start到stop之间的所有元素
ZREVRANGE # 逆序,即reversal range
ZRANGEBYSCORE key min max [WITHSCORES][LIMIT offset count] # 获取指定分数范围的元素,withscores,"("表示不包含,添加在min或max的左侧,limit作用是返回限制
ZSCORE key member # 获取元素的分数
ZCARD key # 获取集合中元素的数量
ZREM key member # 删除元素
ZINCRBY key increment member # 增加某个元素的分数
ZCOUNT key min max # 获得指定分数范围内的元素个数
ZMPOP numkeys key [key ...] MIN|MAX [COUNT count] # 从键名列表中的第一个非空排序集中弹出一个或多个元素,它们是成员-分数对
ZRANK key values值 # 获得下标值
ZREVRANK key values值 # 逆序获得下标值

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

bitmap

定义

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

说明

在这里插入图片描述

用String类型作为底层数据结构实现的一种统计二值状态的数据类型。

位图本质是数组,它是基于String数据类型的按位的操作。该数组由多个二进制位组成,每个二进制位都对应一个偏移量(我们称之为一个索引)。

Bitmap支持的最大位数是2个32位,它可以极大的节约存储空间,使用512M内存就可以存储多达42.9亿的字节信息(2^32 = 4294967296)

用途

用于状态统计,Y/N,类似AtomicBoolean。

SETBIT key offset val # 给指定key的第offset位赋值val 
GETBIT key offset # 获取指定key的第offset位
BITCOUNT key [start end] # 返回指定key中[start,end]中为1的数量,默认为全部范围
STRLEN key # 返回key的长度(Byte为单位)
BITOP operation destkey key # 对不同的二进制存储数据进行位运算(AND、OR、NOT、XOR)

val的值只能是0或1;
Bitmap的偏移量是从0开始计算的,这和数组索引一致。

应用场景

一年365天,全年天天登陆占用多少字节?

  • 按年去存储一个用户的签到情况,365天只需要365/8 ≈ 46 Byte,1000W用户量一年也只需要 440 MB就足够了。

  • 假如是亿级的系统,每天使用1个1亿位的Bitmap约占12MB的内存(10个8/8/1024/1024),10天的Bitmap的内存开销约为120MB,内存压力不算太高。

  • 此外,在实际使用时,最好对Bitmap设置过期时间,让Redis自动删除不再需要的签到记录,以节省内存开销。

Hyperloglog

说明

Redis 在2.8.9版本添加了HyperLogLog结构。

Redis HyperLogLog是用来做基数统计的算法,HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定的、并且是很小的。

在Redis 里面,每个HyperLogLog键只需要花费12KB内存,就可以计算接近2*64个不同元素的基数,这和计算基数时,元素越多耗费内存就越多的集合形成鲜明对比。

但是,因为HyperLogLog只会根据输入元素来计算基数,而不会储存输入元素本身,所以HyperLogLog不能像集合那样,返回输入的各个元素。

HyperLogLog相当于是给Set提供了一个辅助的统计功能。

基数统计

去重复统计功能的基数估计算法-就是HyperLogLog。

基数是一种数据集,表示一个集合去重复后的元素真实个数,基数统计用于统计一个集合中不重复的元素个数,就是对集合去重复后剩余元素的计算。

即去重"脱水"后的真实数据。

PFADD key element [element ..] # 添加指定元素到HyperLogLog中
PFCOUNT key_[key ...] # 返回给定HyperLogLog的基数估算值
PFMERGE destkey sourcekey_[sourcekey ...] # 将多个HyperLogLog合并为一个 HyperLogLog

应用场景

UV统计

什么是UV:Unique Visitor,独立访客,一般理解为客户端IP,需要去重考虑

用户搜索网站关键词的数量,统计用户每天搜索不同词条个数

天猫网站首页亿级uv的Redis统计方案。

GEO

geo本质上是一个zset(有序集合)。

GEOADD key 经度(longitude)、纬度(Iatitude)、位置名称(member) [...] # 将位置(经度和纬度)和名称添加到指定的key中
GEOPOS key member # 从键里面返回所有给定位置元素的位置(经度和纬度)
GEODIST key member1 member2 [M|KM] # 返回两个给定位置之间的距离,可指定距离单位。
GEORADIUS key longitude latitude radius M|KM # 以给定的经纬度为中心,返回与中心的距离不超过给定最大距离的所有位置元素。
GEORADIUSBYMEMBER key memeber radius M|KM # 跟GEORADIUS类似
GEOHASH key member [...] # 返回一个或多个位置元素的Geohash表示(二维转一维)

如何处理中文乱码问题

redis-cli -a 123456 --raw

raw参数表示get key 时显示原始数据,不会转换成十六进制的转义字符。

Stream

介绍

redis5.0之前的痛点:

  • redis消息队列的两种方案

    1. List 实现消息队列 —— List实现方式其实就是点对点的模式

    2. (Pub/Sub)

Redis5.0版本新增了一个更强大的数据结构——Stream

Stream可以理解为Redis版的MQ消息中间件+阻塞队列。

功能

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

底层结构和原理说明

在这里插入图片描述

在这里插入图片描述

队列相关指令

XADD key *|id field value [...]  # 添加消息到队列末尾,消息的值为JSON格式,*表示系统默认分配id
XTRIM key MAXLEN | MINID # 限制Stream的长度,如果已经超长会进行截取,maxlen表示从头开始截取限定长度,MINID表示从指定id开始截取到Stream末尾
XDEL # 删除消息
XLEN # 获取Stream中的消息长度
XRANGE # 获取消息列表(可以指定范围),忽略删除的消息
XREVRANGE # 和XRANGE相比区别在于反向获取,ID从大到小
XREAD [COUNT count] [BLOCK 毫秒数] STREAMS key... id... # 获取消息(阻塞/非阻塞),返回大于指定ID的消息

Stream和list的对比

在这里插入图片描述

消费组相关指令

XGROUP CREATE # 用于创建消费者组
XREADGROUP GROUP # ">" 表示从第一条尚未被消费的消息开始读取,消费组groupA内的消费者consumer1从mystream消息队列中读取;不同消费组的消费者可以消费同一条消息(消费组间的指针相互独立);消费组的目的是为了隔离不同的消费者
XPENDING # 查询每个消费组内所有消费者「已读取、但尚未确认」的消息;查看某个消费者具体读取了哪些数据
XACK # 向消息队列确认消息处理已完成
XINFO # 用于打印stream\Consumer\Group的详细信息

在这里插入图片描述

使用建议

Stream还是不能100%等价于Kafka、RagbitMQ来使用的,生产案例少,慎用。

bitfield

了解即可

介绍

BITFIELD命令可以将一个Redis字符串看作是一个由二进制位组成的数组,并对这个数组中任意偏移进行访问。可以使用该命令对一个有符号的5位整型数的第1,2,3,4位设置指定值,也可以对一个31位无符号整型数的第4,5,6,7位进行取值。类似地,本命令可以对指定的整数进行自增和自减操作,可配置的上溢和下溢处理操作。

用途

BITFIELD命令的作用在于它能够将很多小的整数储存到一个长度较大的位图中,又或者将一个非常庞大的键分割为多个较小的键来进行储存,从而非常高效地使用内存,使得 Redis 能够得到更多不同的应用——特别是在实时分析领域:BITFIELD能够以指定的方式对计算溢出进行控制的能力,使得它可以被应用于这一领域。

hello 等价于 0110100001100101011011000110110001101111

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

在这里插入图片描述

命令

BITFIELD key [GET type offset] # type中 i8表示有符号8位,u4表示无符号4位
BITFIELD key [SET type offset value]
BITFIELD key [INCRBY type offset increment] # 默认情况下,INCRBY使用WRAP参数
# 益出控制OVERFLOW [WRAP|SAT|FAIL] :
# WRAP:使用回绕(wrap around)方法处理有符号整数和无符号整数的溢出情况(取模)
# SAT:使用饱和计算(saturation arithmetic)方法处理溢出,下溢计算的结果为最小的整数值,而上溢计算的结果为最大的整数值(i8最小为-128,最大为127)
# FAIL:命令将拒绝执行那些会导致上溢或者下溢情况出现的计算,并向用户返回空值表示计算未被执行(nil)

http://www.kler.cn/a/7456.html

相关文章:

  • Chrome和Chromium的区别?浏览器引擎都用的哪些?浏览器引擎的作用?
  • 丑数动态规划
  • 【网络云计算】2024第46周周考-磁盘管理的基础知识-RAID篇
  • 解决背景图因为图片路径中携带括号导致图片无法显示的问题
  • 报错 No available slot found for the embedding model
  • c#————委托Action使用例子
  • Java并发编程(4) —— Java 内存模型(JMM)详解
  • 勒索软件正在从 Windows 转向 Linux
  • C++ setsockopt() 函数
  • thymeleaf radio 获取及回显
  • 【Python】九十条简单py技巧打包(仅此一次哦)
  • 统一结果封装异常处理
  • 基于Pytorch的可视化工具
  • 手写一个llvm的mem2reg pass
  • chatGPT的未来应用有哪些-ChatGPT对未来工作的影响
  • 网络安全书籍推荐+网络安全面试题合集
  • 2023年五一数学建模竞赛来袭
  • MongoDB 查询文档(1)
  • 浅谈JVM(五):虚拟机栈帧结构
  • go语言for的三种形式
  • CF1748E Yet Another Array Counting Problem
  • 关于CH32F203程序下载方式说明
  • Linux VIM编辑器常用指令
  • ffmpeg关于视频前几秒黑屏的问题解决
  • 多线程的锁策略
  • Python 自动化指南(繁琐工作自动化)第二版:八、输入验证