Redis-1 数据类型与数据结构

1. Redis 简介

Redis 是一个key-value的存储系统,使用ANSI C语言编写,key的类型是字符串,value的类型有:

  • string 字符串类型
  • list 列表类型
  • set 集合类型
  • sortset 有序集合类型
  • hash类型
  • bitmap类型
  • geo地理位置类型
  • stream流类型

Reids的命令不区分大小写,key value 区分大小写。

2. Redis底层结构

在这里插入图片描述

2.1 RedisDB结构

typedef struct redisDb {
    
     
	int id; //id是数据库序号,为0-15(默认Redis有16个数据库) 
	long avg_ttl; //存储的数据库对象的平均ttl(time to live),用于统计 
	dict *dict; //存储数据库所有的key-value 
	dict *expires; //存储key的过期时间 
	dict *blocking_keys;//blpop 存储阻塞key和客户端对象 
	dict *ready_keys;//阻塞后push 响应阻塞客户端 存储阻塞后push的key和客户端对象 
	dict *watched_keys;//存储watch监控的的key和客户端对象 
} redisDb;

2.2 RedisObject结构

typedef struct redisObject {
    
     
	unsigned type:4;//类型 五种对象类型  REDIS_STRING(字符串)、REDIS_LIST (列表)、REDIS_HASH(哈希)、REDIS_SET(集合)、REDIS_ZSET(有序集合)。
	unsigned encoding:4;//编码 4表示位数
	void *ptr;//指向底层实现数据结构的指针,指向具体数据
	//... 
	int refcount;//引用计数 
	//... 
	unsigned lru:LRU_BITS; //LRU_BITS为24bit 记录最后一次被命令程序访问的时间 
        //高16位存储一个分钟数级别的时间戳,低8位存储访问计数(lfu : 最近访问次数)
	//... 
} robj;

## 获取对象类型与编码
type key 返回对象类型(String...)
object encoding key 获取编码

3. Redis 数据类型以及使用场景

3.1 String类型(放置字符串,整数,浮点数)

常用命令:

set key value  赋值k-v
get key  获取key对应value
getset key value 取值并赋值
setnx key value 当value不存在时采用赋值 【分布式锁】
set key value NX PX 3000 原子操作,px 设置毫秒数
append key value 尾部追加值
strlen key 获取字符串长度
incr key 递增数字 【乐观锁】
incrby key increment 增加指定整数
decr key 递减数字
decrby key decrement 减少指定整数

对应encoding:int(int数据类型) embstr(长度小于44个字节)raw(长度大于44个字节)

3.2 list列表类型(存储有序,可重复元素)

lpush key v1 v2 v3 ...  从左侧插入列表
lpop key 从列表左侧取出
rpush key v1 v2 v3 ... 从右侧插入列表
rpop key 从列表右侧取出
lpushx key value 将值插入到列表头部
rpushx key value 将值插入到列表尾部
blpop key timeout 从列表左侧取出,当列表为空时阻塞,可以设置最大阻塞时间,单位为秒
llen key 获取列表元素个数
lindex key index 获取下标index的元素
lrange key start end 返回列表中指定区间的元素,区间通过start和end指定
lrem key count value 删除列表中与value相等的元素
lset key index value 将列表index位置的元素设置成value的值
ltrim key start end 对列表进行修剪,保留start和end区间
rpoplpush key1 key2 从key1列表右侧弹出并插入到key2列表左侧
brpoplpush key1 key2 从key1列表右侧弹出并插入到key2列表左侧,会阻塞
linsert key BEFORE/AFTER pivot value 将value插入到列表,且位于值pivot之前或之后

对应encoding:quicklist(快速列表)

3.3 set集合类型(无序,唯一元素)

sadd key mem1 mem2 ... 集合添加成员
srem key mem1 mem2 .... 删除集合中指定成员
smembers key 获得集合中所有元素
spop key 返回集合中一个随机元素,并将该元素删除
srandmember key 返回集合中一个随机元素,不会删除该元素
scard key 获得集合中元素的数量
sismember key member 判断元素是否在集合内
sinter key1 key2 key3 求多集合的交集
sdiff key1 key2 key3 求多集合的差集
sunion key1 key2 key3 求多集合的并集

对应encoding:intset(元素都是整数并且都处在64位有符号整数范围内) dict(元素都是整数并且都处在64位有符号整数范围外)

3.4 sortedset 有序集合(分数排序,分数可重复)

zadd key score1 member1 score2 member2 ... 为有序集合添加新成员
zrem key mem1 mem2 ... 删除有序集合中指定成员
zcrad key 获得有序集合中的元素数量
zcount key min max 返回集合中score值在[min,max]区间的元素数量
zincrby key increment member 在集合的member分值上加increment
zscore key member 获得集合中member的分值
zrank key member 获得集合中member的排名(按分值从小到大) 
zrevrank key member 获得集合中member的排名(按分值从大到小)
zrange key start end 获得集合中指定区间成员,按分数递增排序
zrevrange key start end 获得集合中指定区间成员,按分数递减排序

对应enconding:ziplist(元素的个数比较少,且元素都是小整数或短字符串时) skiplist+dict(元素的个数比较多或元素不是小整数或短字符串时)

3.5 hash类型(散列表)

hset key field value 赋值,不区别新增或修改
hmset field1 value1 field2 value2 批量赋值
hsetnx key field value 赋值,如果filed存在则不操作
hexists key filed 查看某个field是否存在
hget key filed 获取一个字段值
hmget key field1 field2 ... 获取多个字段值
hgetall key 获取所有
hdel key field1 field2... 删除指定字段
hincrby key field increment 指定字段自增increment
hlen key 获得字段数量

对应encoding:dict(元素的个数比较多或元素不是小整数或短字符串) ziplist(散列表元素的个数比较少,且元素都是小整数或短字符串时)

3.6 bitmap位图类型(签到,统计活跃、用户在线状态)

setbit key offset value 设置key在offset处的bit值(只能是0或者1)。
getbit key offset 获得key在offset处的bit值
bitcount key 获得key的bit位为1的个数
bitpos key value 返回第一个被设置为bit值的索引值
bitop and[or/xor/not] destkey key [key …] 对多个key 进行逻辑运算后存入destkey中

3.7 geo地理位置类型(记录地理位置,计算距离,查找附近的人,本质key value)

geoadd key 经度 纬度 成员名称1 经度1 纬度1 成员名称2 经度2 纬度 2 ...  添加地理坐标
geohash key 成员名称1 成员名称2... 返回标准的geohash串
geopos key 成员名称1 成员名称2... 返回成员经纬度
geodist key 成员1 成员2 单位 计算成员间距离
georadiusbymember key 成员 值单位 count 数 asc[desc] 根据成员查找附近的成员

3.8 stream数据流类型

1xadd key id <*> field1 value1.... 将指定消息数据追加到指定队列(key)中,*表示最新生成的id(当前时间+序列号)
xread [COUNT count] [BLOCK milliseconds] STREAMS key [key ...] ID [ID ...] 从消息队列中读取,COUNT:读取条数,BLOCK:阻塞读(默认不阻塞)key:队列名称 id:消息id
xrange key start end [COUNT] 读取队列中给定ID范围的消息 COUNT:返回消息条数(消息id从小到大)
xrevrange key start end [COUNT] 读取队列中给定ID范围的消息 COUNT:返回消息条数(消息id从大到小)
xdel key id 删除队列的消息
xgroup create key groupname id 创建一个新的消费组
xgroup destory key groupname 删除指定消费组
xgroup delconsumer key groupname cname 删除指定消费组中的某个消费者
xgroup setid key id 修改指定消息的最大id
xreadgroup group groupname consumer COUNT streams key 从队列中的消费组中创建消费者并消费数据consumer不存在则创建)

对应encoding:主要使用了listpack(紧凑列表)和Rax树(基数树)

  • listpack表示一个字符串列表的序列化,listpack可用于存储字符串或整数。用于存储stream的消息内容。
  • Rax是一个有序字典树(基数树Radix Tree),按照key的字典序排列,支持快速地定位、插入和删除操作。用于存储消息队列,在Stream里面消息ID的前缀是时间戳+序号,这样的消息可以理解为时间蓄力消息,然后继续遍历指定消息之后的所有消息。

3.9 HyperLog

PFADD KEY VALUE1 VALUE2 VALUE3
PFCOUNT KEY
PFMERGE destkey sourcekey [sourcekey ...]

Redis的基数统计,这个结构可以非常省内存的去统计各种计数,比如注册IP数、每日访问IP数、页面实时UV)、在线用户数等。但是它也有局限性,就是只能统计数量,而没办法去知道具体的内容是什么。

猜你喜欢

转载自blog.csdn.net/weixin_43743650/article/details/114230943