Redis数据类型
Redis到目前为止一共十种数据类型
数据类型简介
Redis字符串(String)
-
最基本的类型,一个key对应一个value;
-
String是二进制安全的,Redis的String可以包含任何类型的数据
-
Redis中value字符串最多是512M
Redis列表(List)
- 是一个简单的字符串链表,按照插入顺序排序,可以头插或者尾插
- 底层是一个双端链表,最多可以保护2^32 -1个元素
Redis哈希表(Hash)
- 是一个String类型的field(字段)和value(值),适合存储对象
- 即value是一个k-v键值对集合
- 每个hash可以存储2^32 - 1对键值对
Redis集合(Set)
- 是一个String类型元素的无序集合,集合成员是唯一的,集合对象的编码可以是intset或者hashtable
- Set是通过哈希表实现的,增删改查都是O(1)
Redis有序集合(ZSet)
- 和Set一样,也是String类型元素的集合,不允许重复成员
- 在每一个元素之前关联一个double类型的分数,Redis通过分数来类集合中的元素进行从小到大的排序
- zest成员唯一,但是分数可以重复
- zset也是哈希表实现,增删改查都是O(1)的
Redis地理空间(GEO)
- 主要用于存储地理位置信息,并且对存储的信息进行操作
- 功能包括:添加地理位置坐标,获取地理位置坐标,计算用户之间的距离,根据给定的经纬度获取一定范围的地理位置集合等
Redis基数统计(HyperLogLog)
- 用来做基数统计,在输入元素的数量或者提及非常大时,计算基数所需的空间总是固定且很小的
- HyperLogLog只根据输入元素计算基数,而不会存储输入元素本身
Redis位图(BitMap)
- 由0和1状态表示的二进制位数的bit数组
- 通常用来做二值统计
Redis位域(Bitfiled)
- 可以来一次性操作多个比特位域(多个来纳许的比特位),执行一系列操作并返回一个响应数组,响应数组对应参数列表中相应操作的执行结果
Redis流(stream)
- 主要用于消息队列,Redis本身有一个Redis发布订阅来实现消息队列的功能
- 但该消息队列无法持久化,如果出现意外则丢失全部消息
Redis常见操作命令
注意:
- 命令是不区分大小写的,而key是区分大小写的
- 可以使用帮助命令help @类型,可以返回内部的操作提示
key操作命令
keys * 查询当前存在的全部key
exists key 查询是否存在某个键
type key 查询key的类型
del key 删除key
unlink key 非阻塞删除,仅将key从keyspace元数据删除,真正的删除等后续异步操作
ttl key 查看还有多少秒该key会过期,-1表示永不过期,否则返回还有多久过期,-2表示已经超时过期,过期后get无法取得该值
move key [0-15] 因为每个redis默认带16个数据库,这个命令将当前数据库的key移动到给定的数据库编号中;如果需要指定数据库数量,可以在conf文件中配置databases属性修改
select [0-15] 切换到指定编号的数据库
dbsize 查看当前数据库key的数量
flushdb 清空当前数据库
flushall 清空所有数据库
String类型
主要是单值存储
-
set key value
SET key value [NX | XX] [GET] [EX seconds | PX milliseconds | EXAT unix-time-seconds | PXAT unix-time-milliseconds | KEEPTTL]
- EX是以以秒为单位的过期时间,PX是以毫秒为单位的过期时间
- EXAT是以Unix时间戳作为过期时间,PXAT是以Unxi过期时间戳毫秒设置(UNIX时间戳为从1970-01-01到现在的秒数)
- NX为在键不存在时设置键值,XX是在键存在时设置值
- KEEPTTL是指保留设置前指定的键生存时间(默认情况下,如果修改一次值后,就会覆盖原本设置的生存时间;设置该选项后,原本的生存时间即使修改值也会保留)
- GET返回指定键原本的值,不存在则返回nil
-
get key 获取一个键对应的值,如果键过期或者不存在该键则返回nil
-
mset key1 value1 [key value …] 一次批处理多个set操作
-
mget key1 [key…] 一次操作多个get操作
-
MSETNX k1 v1 [key value …] 在其中所有键都不存在的情况下才能设置值
-
GETRANGE k1 start end 取得值中start到end索引的字串
- GETRANGE k1 0 3 取得值中0-3索引字符的值,相当于获取字串
- GETRANGE k1 0 -1 获取value原本的值
-
SETRANGE start newstring 将start索引开始位置及之后的字符用新的字符串替换
-
数值增减,如果存储的值不能转换为数字则无法进行此操作
- INCR k1 每次操作后k1对应的值自增,且返回自增后的值
- INCRBY k1 step 设定每次自增的大小为step
- DECR k1 每次递减1
- DECRBY k1 step 设定自减大小为step
-
获取字符串长度和内容追加
- STRLEN k1 获取字符串的长度
- APPEND k1 newstring 给值中的字符串追加子串
-
分布式锁
- setnx key value 不存在时建锁
- setex/setnx key expiretime value 相当于set和expire的结合,设置键值且设置过期时间
-
getset k1 v1 先获取旧值,再设置新值
List类型
主要是单键多值,底层是双端链表
- lpush/rpush/lrange
- lpush list v1 [value …] 左边压栈
- rpush list v1 [value …] 右边压栈
- lrange list start end 从左遍历start到end的位置,end为-1表示遍历全部
- lpop/rpop
- lpop list count 左边弹栈指定数量元素
- rpop list count 右边弹栈指定数量元素
- lindex list index 按照索引下标获取元素
- llen list 获取list长度
- lrem list num v1 删除一定数量的值等于v1的元素
- ltrim list start end 截取start到end范围内的元素组成一个新的list,并且设置为k1的值
- rpoplpush list1 list2 从list2中右侧出栈一个元素在list1左边压栈
- lset list index value 根据索引给一个元素赋值
- linsert list [before/after] valuex newvalue 在某个元素之前或之后添加一个新元素
Hash类型
仍然是键值对,但value本身是一个新的键值对
- hset/hget/hmset/hmget/hgetall/hdel
- hset key k1 v1 [key value …] 设置一个嵌套的哈希表
- hget key k1 获取hash类型中的一个键对应的值
- hmset key k1 v1 [key value …] 和hset类似,但返回OK而不是成功设置的字段数量
- hmget key k1 [key …] 一次获取多个值
- hgetall key 获取全部的键和值
- hdel key k1 删除一组键值对
- hlen key 获取键值对的数量
- hexists key k1 查看是否存在一个键
- hkeys/hvals
- hkeys key 列出其中全部的键
- hvals key 列出全部的值
- hincrby/hincrbyfloat
- hincrby key k1 increment 对数值进行增加
- hincrbyfloat key k1 increment 对数值增加一个浮点数
- hsetnx key k1 v1 [key value …] 不存在时设置值
Set类型
- 基本操作
- SADD key member [member…] 添加元素,自动去重
- SMEMBERS key 返回集合中全部元素
- SREM key member [member …] 删除集合中的一些元素
- SCARD key 统计集合中的元素个数
- SRANDMEMBER key number 从集合中随机选择一些数字返回,不改变原集合
- SPOP key number 随机弹出一些元素,从集合中删除
- SMOVE key1 key2 member 把第一个集合中的一个元素转移到第二个集合中
- 集合运算
- 集合的差运算 A-B:SDIFF set1 set2
- 集合的并集 A∪B:SUNION set1 set2
- 集合的交集 A∩B:SINTER set1 set2
- SINTERCARD keynumbers key1 key2 [key …] [LIMIT number]
- 计算给出集合的交集,但不返回集合,仅返回集合中的元素个数,LIMIT可以决定最大返回的个数值
- 集合运算常用于社交媒体列表等功能
ZSet类型
在set的基础上,每个member前加一个score分数值,现在set中的元素变成了score-member的键值对
-
向有序集合加入一个元素和元素对应的分数
ZADD key [NX|XX] [GT|LT] [CH] [INCR] score member [score member …]
-
ZRANGE key start end [WITHSCORES] 遍历一定范围内的元素,按索引排序,可以携带着分数取出
-
ZREVRANGE key start [WITHSCORES] 从大到小反序取出
-
ZRANGEBYSCORE key [(]min max [WITHSCORES] [LIMIT offset count] 按照分数范围取出元素,带括号可以表示不包括此数;LIMIT表示从结果集中的第几个开始,选取接下来的几个元素
-
ZSCORE key member 获取一个对应元素的分数
-
ZCARD key 获取集合元素的个数
-
ZREM key member 删除结合中的一个元素
-
ZINCRBY key increment member 对某一个元素的分数增加一定的值
-
ZCOUNT key min max 获取一定分数区间的元素个数
-
ZMPOP countkeys key [key …] MIN|MAX COUNT elementNum 从键列表中的第一个非空集合,选择elementNum个最大或最小的值弹出
-
ZRANK key member 获取集合中元素的下标
-
ZREVRANK key memebr 获取集合元素的逆序下标值
BitMap类型
位图是0和1组成的二进制数组,在如打卡,登录等需求很实用;
底层仍然是String,但可以使用其中的二进制位来存储数据
- SETBIT key offset value 设置某一位的值,偏移量从0开始
- GETBIT key offset 获取某一位的值
- STRLEN key 统计目前占用了多少字节,每8位占用一个字节,即使只用1位也占用8个字节
- BITCOUNT key [start end] 一定范围内为1的数量
- BITOP
- BITOP AND reskey key [key …] 将key列表中的位图做与运输,放入reskey中
- BITOP OR reskey key [key …] 将key列表中位图做或运算
- BITOP NOT/XOR
HyperLogLog类型
统计网站的UV(独立访客,即不同IP的访客),需要考虑去重。考虑大规模统计数据,可以使用基数统计类型完成。
这是一种去重统计功能的基数估计算法,输入元素的数量极大时,但计算所需的空间是固定的,只根据输入元素进行基数统计,不存储记录本身。大概只需要占用12KB,但可能存在0.81%的误差。
基数指的是去重复后集合的元素数量。
- PFADD key element [element …] 向其中输入多个数据,只记录去重后的数据个数
- PFCOUNT key [key …] 获取key列表中去重后元素个数
- PFMERGE newkey key1 key2 [sourcekey] 将两多个 基数类型合并后放入新的基数统计类型中
GEO类型
核心思想是将三维的地球转换为二维坐标,将二位坐标转换为一维点块,将一维点块转换为二进制并使用base32编码
-
GEOADD key longitude latitude membername [longitude latitude membername …] 添加成员的经纬度坐标,key实际类型是一个zset,其中的分数变成了经纬度
-
ZRANGE key start end 可以获取一定索引范围的成员,如果出现中文乱码可以在登陆时添加raw参数
redis-cli -a 123456 --raw
-
GEOPOS key membername [membername …] 获取一些成员的经纬度
-
GEOHASH key member [member …] 生成经纬度的哈希字符串,将二位映射到一维
-
GEODIST key member [member …] [m|km|ft|mi] 可以计算成员之间坐标间距离,并且指定单位
-
GEORADIUS key thislongitude thislatitude radius [m|km|ft|mi] [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count]
- 根据给定的经纬度,获取一个半径范围内的成员,可以携带距离、位置和哈希字符串,并且可以设定最大的条目并设定距离递增或递减
-
GEORADIUSBYMEMBER key member 和上述的命令基本相同,可以把给出的经纬度换成GEO中的一个成员
Stream类型
相当于一个消息中间件;Redis最早使用list实现消息队列,当作异步队列使用,是点对点的模式。
Redis也有发布订阅(pub/sub),可以实现一对多的模式,但无法持久化,也没有Ack机制保证数据可靠性;
Stream是5.0版本新增的数据结构,其实就是消息中间件+阻塞队列;它可以实现消息队列,支持消息的持久化,支持自动生成全局唯一id,支持ack消息确认模式,支持消费组模式等;
- 队列相关指令
- XADD key [*|id] field value [field value …] 添加消息到队列末尾,返回值是消息的ID
- 消息ID必须比上个ID大,如果相同就会出现错误
- 使用 * 表示自动生成,可以在XADD中自动生成ID;自动生成的消息ID是由 毫秒时间戳-该秒生成的消息序号;自动生成时会保证ID不相同
- XEANGE key start end COUNT number 可以表示在一定ID范围内,显示多少条消息
- -表示最老的消息的ID,+表示最新的消息的ID
- XREVRANGE key end start COUNT number 逆序输出消息
- XDEL key id [id …] 根据消息的ID删除对应的消息
- XLEN key 获取stream的长度
- XTRIM key [MAXLEN|MINID] [=|~] threshold [LIMIT count]
- 使用MAXLEN的时候可以截取最新的几条数据
- 使用MINID可以丢弃小于指定ID的全部数据
- XREAD [COUNT count] [BLOCK milliseconds] STREAMS key [key …] id [id …]
- COUNT表示最多读取多少条信息
- BLOCK表示是否用阻塞方式读取消息,默认不阻塞,设置为0则永远阻塞;如果不阻塞就立刻返回数据(即使为空),如果阻塞则会等待符合条件的消息出现再返回(或者超时返回)
- STREAMS 表示需要从哪些stream中读取
- id表示读取该id之后的消息;$表示当前已存储的最大id,0-0表示最小的id
- XADD key [*|id] field value [field value …] 添加消息到队列末尾,返回值是消息的ID
- 消费组指令
- XGROUP CREATE key groupname $|id 创建消费组
- $表示只消费最新的消息,id表示从那个id的消息之后开始消费,0表示从头开始
- XREADGROUP GROUP groupname consumer [consumer …] STREAMS key [key …] [>|COUNT count]
- > 表示从第一条尚未被消费的消息开始读取
- 这样消费组的消费者会从可以消费的位置起始,消费之后的信息,可以限制每次消费的条目
- 不同消费组的消费者可以消费同一条信息
- 同一消费组读过的消息,不能被组内消费者再次读取
- XGROUP CREATE key groupname $|id 创建消费组
- Stream实现的消息队列,为了保证可靠性需要存储每个消费者消息的保底,即使用内部队列(PENDING List)留存消费者读出的信息,直到消费者使用XACK确认消息已处理完成;为了增加可靠性,XACK需要在业务完成后再发送。
- XPENDING key groupname 获取一个组内消费者读取但未确认的消息数量以及哪些消费者读取了哪些数据,读取了几条;
- XACK key group id [id …] 确认一条消息,再执行对应的XPENDING时该条目就不存在了
- XINFO STREAM key 打印一个stream的信息
Bitfields类型
可以把Redis字符串看成一个二进制位组成的数组,可以修改任意偏移位置的位,主要用于将很多小的整数存储到一个长度较大的位图中,或者将非常大的键分割为多个较小的键来存储;
可以对变长位宽和任意没有字节对齐的指定整形位域进行寻址和修改
- BITFIELD key [GET encoding offset] 对key表示的数据,进行指定编码读取,并设置起始偏移量
- encoding的表示方法为,i为有符号,u为无符号;如i+数字,比如i8表示按字节编码的有符号整数
- BITFIELD key [SET encoding offset] newchar 可以修改指定编码方式下对应位置编码的值
- newchar可以为十进制,如在i8编码,设定newchar 120 会把这个字符串中的对应字符改成 ’x‘
- BITFIELD key [INCRBY encoding offset increment] 对于指定编码方式的某个位置执行增加的操作
- 溢出控制 OVERFLOW [WRAP|SAT|FAIL]
- WRAP:回绕,默认的方式,溢出后回到最小值
- SAT:饱和计算,下溢时返回编码方式最小的整数值,上溢出返回最大的整数值
- FAIL:命令拒绝执行导致溢出的操作,返回nil表示命令未执行