Redis数据类型及底层数据结构

数据类型

String

set key value      
string类型是二进制安全的。意思是redis的string可以包含任何数据。比如jpg图片或者序列化的对象 。 string类型是Redis最基本的数据类型,一个键最大能存储512MB。

Hash(对象)

hmset name key1 value1 key2 value2 
Redis hash 是一个键值(key=>value)对集合。 Redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象。

// 命令
hset person name bingo
hset person age 20
hset person id 1
hget person name
	
(person = {
  "name": "bingo",
  "age": 20,
  "id": 1
})

List(有序集合)

list是有序列表
Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边) lpush name value 在 key 对应 list 的头部添加字符串元素
rpush name value 在 key 对应 list 的尾部添加字符串元素 
lrem name index key 对应 list 中删除 count 个和 value 相同的元素 
llen name
返回 key 对应 list 的长度
lrange命令可以读取某个闭区间的元素,可以基于list实现分页查询,缓存的数据类似于粉丝列表之类的
// 0开始位置,-1结束位置,结束位置为-1时,表示为列表的最后一个位置	
lrange listName 0 -1

// 命令
lpush mylist 1
lpush mylist 2
lpush mylist 3 4 5

# 1
rpop mylist

Set(无序集合、去重)

sadd name value 
Redis的Set是string类型的无序集合。自动去重。
集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。
#-------操作一个set-------
# 添加元素
sadd mySet 1
# 查看全部元素
smembers mySet
# 判断是否包含某个值
sismember mySet 3
# 删除某个/些元素
srem mySet 1
srem mySet 2 4
# 查看元素个数
scard mySet
# 随机删除一个元素
spop mySet
#-------操作多个set-------
# 将一个set的元素移动到另外一个set
smove yourSet mySet 2
# 求两set的交集
sinter yourSet mySet
# 求两set的并集
sunion yourSet mySet
# 求在yourSet中而不在mySet中的元素
sdiff yourSet mySet

ZSet(sorted set 有序集合)

zadd name score value 
Redis zset 和 set 一样也是string类型元素的集合,且不允许重复的成员。 
不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。 
zset的成员是唯一的,但分数(score)却可以重复。

// 命令
zadd board 85 zhangsan
zadd board 72 lisi
zadd board 96 wangwu
zadd board 63 zhaoliu

# 获取排名前三的用户(默认是升序,所以需要 rev 改为降序)
zrevrange board 0 3

# 获取某用户的排名
zrank board zhaoliu

数据底层接结构

String

存储上限为512M
int编码 : 保存小数或者整数,大小在long_max范围内的
embstr编码 : 保存长度小于44字节的字符串
raw编码 : 保存长度大于44字节的字符串,raw编码的内存是不连续的,raw是基于动态字符串SDS实现的

List

3.2版本之前是采用 LinkedList + ZipList实现list
    当元素数量小于512并且元素大小小于64字节时采用ZipList
    超过则采用LinkedList编码
3.2版本之后采用QuickList实现list
类型本身是redisObject类型是list,编码是QuickList

hash

默认采用ZipList编码。ZipList中相邻的两个entry分别保存field和value;
数据量较大时,Hash结构会转换为HT(Dict)
    ziplist中的任意元素数量超过hash-max-ziplist-entries(默认521)
    ziplist的任意entry大小超过hash-max-ziplist-value(默认64字节)

set

默认采用HT编码(Dict)OBJECT_ENCODING_HT
当存储的所有数据都是整数,并且元素数量不超过set-max-intset-entries(默认512)时,会采用IntSet。 OBJECT_ENCODING_INTSET

zset

zset结构
    SkipList + HT(Dict)
	ZipLis  当节点entry数量小于128并且每个节点大小小于64kb时采用
    	zipList是连续内存,因此,score和element是紧挨着的两个entry,element在前,score在后
    	score越小越接近队首,score越大越接近队尾,按照score值升序排列
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值