redis中的10种数据类型
redis中存储的是key-value结构的数据,其中key是字符串类型的数据,value有五种类型
-
字符串String 普通的字符串,较为常用
-
哈希 hash 适合用于存储对象
-
列表 list 按照插入的顺序排序,可以存在重复的元素,可以实现任务队列
-
集合 set 无序集合,没有重复的元素
-
有序集合 sorted set 有序的集合,没有重复的元素
-
位图bitmap
-
基数统计HyperLogLog
-
RedisGEO地理空间
-
流 Stream
-
位域bitfield
1.常用命令
-
字符串操作的命令
set key value 设定指定的值
get key 获取指定的key
setex key seconds value 设置指定的key的值,并且将key的值设置为seconds秒
SETNX key value 只有在key不存在时设置key的值 可以用于实现分布式锁
-
哈希hash操作命令
HSET key field value 将哈希表key中的字段field的值设为value
HGET key field 获取存储在哈希表中的指定的字段
HDEL 删除存储在哈希表中的指定字段
HKEYS key 获取哈希表中的所有字段
HVALS key 获取哈希中的所有值 HGETALL key 获取在哈希表中的指定的key的所有字段和值
-
列表list操作的命令
redis列表是一个简单的字符串列表,按照插入得顺序排序
LPUSH key value 【value2】 将一个或者多个值插入到列表的头部
LRANGE key start stop 获取列表指定范围的内的元素
RPOP key 移除并且获取列表的最后一个元素
LLEN 获取列表的长度
BRPOP key1 【key2】 timeout 移出并获取列表的最后一个元素,如果列表中没有元素会阻塞列表直到等待超时或发现可弹出元素为止
-
集合set操作指令
SADDkey memeber 1 [memeber2] 向集合天机一个或者多个成员
SMEMBERS key 返回集合中的所有成员
SCARD key 获取集合的成员数
SINTER key1 【key2】返回给定所有集合的交集
SUNION key1 【key2】 返回指定所以集合的并集
SDIFF 返回给定所有集合的差集
SREM key memeber1 【member2】移除集合中一个或者多个成员
-
有序集合sorted set 操作命令
redis sorted set 有序集合是string类型元素的集合,且不允许重复的成员。每个元素都会关联一个double类型的分数
redis正式通过分数来为集合中的成员进行大小的排序。有序集合的成员是唯一的,但分数可以重复。
ZADD key score1 member1 [score2 member2] 向有序集合中添加一个或者多个成员,或者更新已存在的成员的分数
ZRANGE key start stop 【WITHSCORES】通过索引区间返回有序集合中指定区间内的成员
ZINCRBY key increment member 有序集合中对指定的成员分数加上增量 increment
ZREM key member [member] 移除集合中的一个或者多个成员
-
redis常用命令
KEYS pattern 查找所有符合给定模式的key
EXISTS key 查找是否存在key
TYPE 返回key所存储的类型
TTL key 返回给定key的剩余生存时间,以秒为单位
DEL key 该命令用于在key存在时删除key
-
在JAVA中操作redis
使用jedis或者spring
2.特殊类型
1.Redis位图bitmap
位图是由0和1状态表现得二进制位的bit数组
常用于做状态统计
例如:用户是否登录过,电影广告等是否被点击过,钉钉的上下班打卡,签到统计
位图是一种用String类型作为底层数据结构实现的一种统计二值状态的数据类型
位图的本质是数组,它是基于String数据类型的按位的·操作。该数组由多个二进制位组成,每个二进制位都对应一个偏移量(就是索引)
bitmap支持的最大位数是2的32次方,他可以极大的节省存储空间,使用512m的内存就可以存储多达43亿的字节信息
在用于存储用户登录数据时,365天只需要大约46byte ,1000w的用户一年也只需要44mb就可以进行存储,在实际使用时可以对bitmap设计过期的时间,让Redis定期自动删除不再需要的签到记录以节省内存开销。
基本命令 setbit key offset val 给指定的值的第offset赋值val 时间复杂度为O(1)
setbit 键 偏移位 值(只能是0或1)
getbit key offset 获取指定key的offset位 时间复杂度为O(1)
strlen 获取占用的字节数 不是字符串的长度,而是占据几个字节,超过8位以后自己按照8位一组一byte扩容
bircount key start end 返回指定key中的【start,end】中为1的数量 时间复杂度为O(n)
bitop operation destkey key 对不同的二进制存储数据进行位运算(与,或,非,)时间复杂度为O(n)
2.Redis基数统计HyperLogLog
HyperLogLog 是去重复的基数估计算法,HyperLogLog的优点在于在输入的元素的数量或者体积非常非常大时,计算基数所需的空间总量是固定的,并且是很小的,在Redis中每个HyperLogLog只需要花费12kb的内存就可以计算接近2的64次方个不同元素的基数。
常用于统计某个网站的uv,用户搜索用户搜索网站关键词的数量
HyperLogLog只会根据输入的元素来计算基数
PFADD key element 添加指定的元素到HyperLogLog当中
PFCOUNT key 返回给定HyperLogLog的基数估计值
PFMERGE destkey sourcekey 将多个HyperLogLog合并为一个HyperLogLog
3.RedisGEO地理空间
GEOADD 添加经纬度坐标
GEOPOS 返回经纬度
GEOHASH 返回坐标的geohash表示
geohash算法生成的base32编码值
主要原理是将三维的地球变为二维的坐标,再将二维的坐标转化为一维的点块,最后将一维的点块转换为二进制再通过base32编码
GEODIST 用于返回两个给定位置之间的距离
GEODIST city 天安门 故宫 km
GEORADIUS 以半径为中心,查找附近的XXX 以给定的经纬度为中心,返回键包含的位置元素当中,与中心距离不超过给定最大距离的所有位置元素
GEORADIUSBYMEMBER 找出位于指定范围的元素,中心点是由给定的位置元素决定的
4.Redis 流 Stream
Redis中的Stream流就是Redis版的MQ消息中间件+阻塞队列
RedisStream流可以实现消息的持久化,支持自动生成全局的唯一id,支持ack确认消息的模式,支持消费组模式,让消息队列更加稳定和可靠
1 | Message Content | 消息内容 |
---|---|---|
2 | Consumer group | 消费组 |
3 | Last_delivered_id | 游标,每个消费组会有个游标Last_delivered_id,任意一个消费者读取了消息都会使游标Last_delivered_id往前移动 |
4 | Consumer | 消费者,消费者组中的消费者 |
5 | Pending_ids | 消费者会有一个状态变量,用于记录被当前消费者已读但是为ack的消息id,如果客户端没有ack,这个变量里面的消息id会越来越多,一旦某个消息被ack他就开始减少。这个Pending_ids在Redis官方被称之为PEl(Pending Entries List)记录了当前已经被客户端读取的消息,但是还没有ack,它用来确保客户端至少消费了消息一次,而不会在网络传输中消失了未处理 |
队列相关指令
XADD | 添加消息到队列末尾 | 消息的id必须要比上个ID大,默认用*表示自动生成规矩,生成的ID一定会保证后面的比前面的ID大,生成的ID有两部分组成(毫秒级时间戳+信息条目,信息条目表示的是在同样的时间戳产生的第几条信息,这个信息条目有64位长度理论上可以装下在同一毫秒级时间戳下产生的所有消息),如果出现了新产生的时间戳比以前已经存在的时间戳小的情况,那么系统就会使用以前相同毫秒创建新的ID,自己显示传入Id时也有要求,格式必须是时间戳加上-自增id的形式,且后续的ID不能小于前一个ID |
---|---|---|
XTRIM | 限制Stream的长度,如果已经超长会进行截取 | MAXLEN 允许的最大长度,对流进行修剪限制长度 MINID 允许的最小ID,从某个值开始比该值小的值会被抛弃 |
XDEl | 删除消息 | 按照主键ID删除数据 |
XLEN | 获取Stream中的消息长度 | |
XRANGE | 获取消息列表(可以指定范围),忽略删除的消息 | start 表示开始值 - 代表最小值,end表示结束值 + 代表最大值 count代表最多获取几个值 |
XREVRANGE | 和XRANGE相比区别在于反向获取,ID从大到小 | |
XREAD | 获取消息(阻塞/非阻塞),返回大于指定ID的消息 | 用于获取消息,只会返回大于指定ID的消息 |
消费组相关指令
XGROUP | 用于创建消费者组 | $ 表示从Stream尾部开始消费 0表示从头部开始消费,创建消费者组时必须指定ID为零还是$ |
---|---|---|
XREADGROUP group | 用于消费者读取消息 | > 表示从第一条尚未被读取的消息开始读取消息,同一个组里的消费者不能消费同一条消息,不同消费组的其他消费者可以消费同一条消息,一般会让同一个组内的消费者共同分担读取数据,从而实现读取负载在多个消费者间是均衡分布的 |
XPENDING | 查询每个消费组内所有消费者已读取但尚未确认的消息 |
四个特殊符号
- + | 最小和最大可能出现的id |
---|---|
$ | $表示只消费新的消息,当前流中最大的id,可用于将要到来的消息 |
> | 用于XREADGROUP命令,表示迄今还没有发送给组中使用者的信息,会更新消费者租的最后ID |
* | 用于XADD命令中,让系统自动生成id |
Stream的基础方法,使用xadd存入消息和xread循环阻塞读取消息的方式可以实现简易版的消息队列
Stream会自动使用内部队列PENDING LIST 留存消费组里面每个消费者读取的消息保底措施,知道消费者使用XACK命令同时Streams消息已经处理完成,消费确认增加了消息的可靠性,一般在业务处理完成之后,需要执行XACk命令确认消息已经被消费完成
5.Redis位域bitfield
bitfield的作用是将一个Redis字符串看做是一个由二进制位组成的数组并且能对变长位宽和任意没有字节对齐的指定整型位域进行寻址和修改。
BITFIELD命令的作用是它能够将很多小的整数存储到一个长度较大的位图中,又或者将一个非常庞大的键分割为多个较小的键来进行存储,从而非常高效的使用内存。
GET type offset 返回指定的位域 SET type offset value 设置指定位域的值并且返回他的原值
INCRBY type offset increment 自增或自减指定位域的值并且返回他的新值
还有一个命令通过设置溢出行为来改变调用INCRBY指令的后续操作
OVERFLOW wrap sat fail 默认OVERFLOW为wrap即循环溢出,sat使用饱和计算方法处理溢出,下溢计算的结果为最小的整数值,上溢计算的结果为最大的整数值,fail命令将拒绝执行并且返回一个nil
当需要一个整形时,有符号整型需要在位数前加i,无符号在位数前加u。例如,u8是一个8位的无符号形整数