Redis的10大数据类型
这里的数据类型说的是 value的数据类型
1.字符串String
string是redis最基本的类型一个key对应一个value。
string类型是二进制安全的,意思是redis的string可以包含任何数据,比如jpg图片或者序列化的对象
string类型是Redis最基本的数据类,一个redis中字符串value最多可以是512M
2.列表List
Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)
它的底层实际是个双端链表,最多可以包含 2^32-1 个元素(4294967295,每个列表超过40亿个元素)
3.哈希表Hash
Redis hash 是一个 string 类型的 field(字段) 和 value(值) 的映射表,hash 特别适合用于存储对象。
Redis 中每个 hash 可以存储 2^32-1 键值对(40多亿)
4.集合Set
Redis 的 Set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据,集合对象的编码可以是 intset 或者hashtable.
Redis 中Set集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 (1)。
集合中最大的成员数为2^32-1(4294967295,每个集合可存储40多亿个成员)
5.有序集合ZSet
zset(sorted set:有序集合)
Redis zset 和 set 一样也是string类型元素的集合,且不允许重复的成员。
不同的是每个元素都会关联一个double类型的分数,redis正是通过分数来为集合中的成员进行从小到大的排序
zset的成员是唯一的,但分数(score)却可以重复。
zset集合是通过哈希表实现的,所以添加,删除,査找的复杂度都是 o(1)。 集合中最大的成员数为 2^32-1
6.地理空间GEO
Redis GEO 主要用于存储地理位置信息,并对存储的信息进行操作,包括
添加地理位置的坐标。
获取地理位置的坐标。
计算两个位置之间的距离。
根据用户给定的经纬度坐标来获取指定范围内的地理位置集合
7.基数统计HyperLogLog
HyperLogLog 是用来做基数统计的算法,HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定且是很小的。
在 Redis 里面,每个 HyperLogLog 键只需要花费 12 KB 内存,就可以计算接近 2^64 个不同元素的基 数。这和计算基数时,元素越多耗费内存就越多的集合形成鲜明对比。
但是,因为 HyperLogLog 只会根据输入元素来计算基数,而不会储存输入元素本身,所以 HyperLogLog 不能像集合那样,返回输入的各个元素。
8.位图BitMap
9.位域BitField
通过bitfield命令可以一次性操作多个比特位域(指的是连续的多个比特位),它会执行一系列操作并返回一个响应数组,这个数组中的元素对应参数列表中的相应操作的执行结果。
说白了就是通过bitfield命令我们可以一次性对多个比特位域进行操作。
10.流Stream
常见数据类型操作命令获取:
http://www.redis.cn/commands.htm
Redis Key:(Redis key的常见命令)
1.keys *
查看当前库的所有key
2.exists key
判断某个key是否存在(1:true,0:false)
3.type key
查看key是社么数据类型
4.del key
删除指定的key数据
5.unlink key
非阻塞删除,仅仅将keys从keyspace元数据中删除,真正的删除会在后续异步中操作。
6.ttl key
查看还有多少秒过期,-1表示永不过期,-2表示已过期
7.expire key 秒钟
为给定的key设置过期时间
8.move key dbindex【0-15】
将当前数据库的key移动到给定的数据库db当中
9.select dbindex
切换数据库【0-15】,默认为0
10.dbsize
查看当前数据库key的数量
11.flushdb
清空当前库
12.flushall
通杀全部库
数据类型命令及落地运用
命令查询:Commands | Docs (redis.io)
1.String字符串
1.最常用
set key value(set命令)
有5个可选参数(EX,PX,NX,XX,KEEPTTL):
EX:以秒为单位的设置过期时间 eg:SET k1 v1 EX 5 (5秒后过期)
PX:以毫秒为单位的设置过期时间 eg:SET k1 v1 PX 5 (5毫秒后过期)
EXAT:设置以秒为单位的UNIX时间戳所对应的时间为过期时间
PXAT:设置以毫秒为单位的UNIX时间戳所对应的时间为过期时间
NX:键不存在的时候设置键值
XX:键存在的时候设置键值
KEEPTTL:保留设置前指定键的生存时间
GET:先返回key里的值再覆盖
2.同时设置/获取多个键值
MSET/MGET:
MSETNX:
3.获取指定区间范围的值
GETRANGE:(类似于Java的subSting字符串截取)
SETRANGE:
4.数值增减
一定要是数字才能增减
1.递增数字 INCR key
2.增加指定数值 INCRBY key 5
3.递减数字 DECR key
4.递减指定数值 DECRBY key 5
5.获取字符串长度和内容增加
STRLEN key:获取字符串长度
APPEND key value:尾部增加
6.分布式锁
SETEX:
7.getset:
8.应用场景:
分布式锁
2.List列表
单 key 多value
1.常用
1.lpush/rpush/lrange
lpush 是先进后出队列,rpush 是先进先出队列
2.lpop/rpop
lpop 从右边弹走数值,rpop 从左边弹走数值
3.lindex
按照索引下标获取元素
4.llen
获取list中元素的个数
5.lrem key 数字N 给定值v1
删除N个 值等于v1 的 元素
6.Ltrim key 开始索引start 结束索引end
只保留 start 到 end之间的元素,其他元素都去除掉。
7.rpoplpush 源列表 目标列表
8.lset key index value
list列表索引为index的属性赋值。
9.linsert key before/after 已有值 插入的新值
10.应用场景
3.Hash哈希
KV模式不变,但是V是一个键值对
1.常用
1.hset/hget/hmset(官方不建议)/hmget/hgetall/hdel
hset:
hget:
hmget:
hgetall:
hdel:
2.hlen
获取某个key内的全部数量
3.hexists key filed
判断key里存不存在filed
4.hkeys/hvals
5.hincrby/hincrbyfloat
给数值类型的整数加值,给浮点类型的数值加值
6.hsetnx
不存在的话赋值,存在的话不操作
7.应用场景
购物车
JD购物车早期 设计目前不再采用,当前小中厂可用
4.Set集合
单值 多value 且无重复
1.常用
1.SADD key member [member..]
添加元素,自动去重复
2.SMEMBERS key
遍历集合中所有元素
3.SISMEMBER key member
判断元素是否 存在 在集合中
4.SREM key member [member..]
删除元素
5.scard
获取集合里的元素的个数
6.SRANDMEMBER key [数字]
从集合中随机展现设置的数字个数元素,元素不删除
7.SPOP key [数字]
从集合中随机弹出 [数字] 个元素,元素删除
8.SMOVE key1 key2 在key1里已存的值
将key1 里的 已存的值 赋值给 key2
2.集合运算
1.集合的差集运算 A-B (SDIFF key [key...])
属于A但不属于B的元素构成的集合
2.集合的并集运算 A∪B (SUNION key [key..])
3.集合的交集运算 A∩B (SINER key [key..])(SINTERCARD numkeys key [key ...][LIMIT limit])
SINER key [key..]
SINTERCARD numkeys key [key ...][LIMIT limit]
不反回交集集合,只返回交集集合里的元素个数,numkeys就是key的个数
3.应用场景
1.微信抽奖小程序spop
2.微信朋友圈点赞(查看同赞朋友)
3.社交(你可能认识的人,猜你喜欢)
求差集
5.ZSet有序集合
在set基础上,每个val值前加一个score分数值:之前set是k1V1 v2 v3,现在zset是k1 score1 v1 score2 v2
1.常用
1.ZADD key score v1 [score2 v2...]
2.ZRANGE key start end [WITHSCORES]
按照元素分数从小到大的顺序返回索引从start到end之间的所有元素
3.ZREVRANGE key start end [WITHSCORES]
反转把分数从大到小排
4.ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]
获取指定分数范围的元素
5.ZSCORE key member
获取对应元素的分数
6.ZCORD key
获取集合中元素的值
7.ZREM key 某score下对应的value值
删除元素
8.ZINCRBY key [数字] member
给member的 score 加 [数字] 分
9.ZCOUNT key min max
获取指定分数范围内的元素的 个数
10.ZMPOP keynumber key [key..] min/max count number
从keynumber个表(也就是key)中弹出最大或最小的number个元素
11.ZRANK key value值
获取下标
12.ZREVRANK key value值
逆序获取下标值
2.应用场景
根据商品的销售对商品进行排序展示
6.BitMap位图
由0和1状态表现的二进制位的bit数组
1.位图用在那些地方
1.用户是否登陆过Y、N,比如京东每日签到送京豆
2.电影、广告是否被点击播放过
3.钉钉打卡上下班,签到统计
2.位图是什么
3.位图能干嘛
用于状态记录
4.基本命令
1.setbit key offset value
offset:偏移位
2.getbit
3.strlen
统计字节数占用了多少
不是字符串长度而是占据几个字节,超过8位后自己按照8位一组一byte再扩容
4.bitcount
全部key里含1的总数是多少
5.bittop
6.getbit和setbit案例
7.应用场景
占用内存少,还快
7.HyperLogLog基数统计
作用:统计某个网站的 UV ,统计某篇文章的 UV
什么是UV: Unique Visitor,独立访客,一般理解为客户端IP
统计用户搜索网站关键词的数量
1.HyperLogLog是什么:
去重复的基数估计算法-HyperLogLog
优点:在输入元素的数量或者体积非常大的时候,计算基数所需的空间总是固定的,很小的.
在Redis里,每个HyperLogLog键只需要花费12kb的内存,就可以计算接近2^64个不同元素的基数,但是,HyperLogLog只是会记录基数,而不记录元素(比如只会记录今天的访问量是1亿,而不会记录1亿条记录)
基数是什么:
2.基本命令
1.PFADD key element [element...]
这里的hllo1只是存了1 3 5 7 9去重以后的基数 5
2.PFCOUNT key
3.PFMERGE 新建key key key [key...]
统计key的基数放进 新建key里
8.GEO地理空间
底层数据类型:ZSet (key score value)->GEO(key 经纬度 value)
2.命令实操
1.如何获取某个地址的经纬度
2.GEOADD
多个经度(longitude)、纬度(latitude)、位置名称(member)添加到指定的 key 中
处理中文乱码:
3.GEOPOS key
返回经纬度
4.GEOHASH key
二维再变一维 base32编码
5.GEODIST key member1 member2 [m|km..]
计算两个地址的距离
6.GEORADIUS key 指定为圆心的经纬度 半径 withdist withcoord count 10 withhash desc
WITHDIST:在返回位置元素的同时, 将位置元素与中心之间的距离也一并返回。 距离的单位和用户给定的范围单位保持一致。
WITHCOORD:将位置元素的经度和维度也一并返回。
7.GEORADIUSBYMEMBER key member 半径 withdist withcoord count 10 withhash
9.Stream流
就是Redis版本的MQ,消息中间件
1.stream流是什么:
Redis版的MQ消息中间件+阻塞队列
2.能干嘛
实现消息队列,它支持消息的持久化、支持自动生成全局唯一ID、支持ack确认消息的模式、支持消费组模式等,让消息队列更加的稳定和可靠.
3.底层结构和原理说明
一个消息链表,将所有加入的消息都串起来,每个消息都有一个唯一的 ID 和对应的内容
4.基础命令
1.队列相关指令
1.XADD
添加消息到队列末尾,消息的ID必须比上一个ID大,默认用 * 是自动生成
2.XRANGE key - +
3.XREVRANGE key + -
上面指令的反转降序展示
4.XDEL key 主键
删除消息
5.XLEN key
消息的个数
6.XTRIM key MAXLEN|MINID 数字|ID
用于对stream的长度进行截取
MAXLEN: 允许的最大长度,对流进行修剪和限制长度
MINID: 允许的最小ID ,从某个ID值开始比该ID小的将会被抛弃
7.XREAD
用于获取消息(阻塞/非阻塞),只会返回大于指定ID的消息
1.非阻塞
2.阻塞
8.小总结(类似Java的阻塞队列)
Stream的基础方法,使用xadd存入消息和xread循环阻塞读取消息的方式可以实现简易版的消息队列,交互流程如下
2.消费组相关指令
1.XGROUP CREATE
用于创建消费者组
2.XREADGROUP GROUP
消费组的目的:
3.重点问题
4.XPENDING
查询每个消费组内所有消费者「已读取、但尚未确认」的消息
5.XACK
向消息队列确认消息处理已完成
10.BitField位域
了解即可
将一个Redis字符串看作是一个由二进制位组成的数组,并能对变长位宽和任意没有字节对齐的指定整型位域进行寻址和修改
标签:入门,元素,Redis,value,key,集合,HyperLogLog From: https://blog.csdn.net/weixin_62485485/article/details/140776719