redis 基础类型
String
String: 可以存储
- INT
- Float
- String
setnx key value
nx意思是not exsits ,如果不存在key才会创建成功
del key
删除key
expire key value
设置key多少时间过期
set key value
incr key
decr key
对于整数值可以增加或者减少
append key value
追加字符串
redis是一个kv的数据库。 dict --哈希表来实现字典
每一个kv都有一个dictEntry来存储他。
底层都是dictEntry来实现的。
image.png
key放在SDS数据解构里
value放在redisObject里。
image.png
这里面的type字段,存储这个数据是什么类型的。比如string还是int。
encoding表示是用什么编码。在redis里有三种编码。 可以使用 object encoding key 来查看。默认是raw
lru是用来做内存回收的
refcount是引用计数
*ptr指针指向真正的数据解构,比如string指向一个sds
String的三种编码
1、int 存储8个字节的长整型
2、embstr embstr格式的sds(simple dynamic string)
3、raw 大于44个字节的字符串
sds是什么东西。是redis自定义的字符串类型。
为什么不用c语言的字符串。因为c语言没得字符串类型。如果用char[]来实现,内存、长度变化会重新分配内存都是问题。会包含\0表示换行,如果存储图片音频之类的二进制保存,二进制就不安全。
sds的优势:查找快,空间预分配,不是用\0表示换行。
embstr redisObject sds 是连续的内存空间
raw分配了两次
embstr是只读的。如果更改了embstr的值,embstr就会变为raw。
string应用场景
1、缓存
2、分布式session
3、set NX ex
4、incr 全局id
5、incr 计数器
6、incr 限流
7、位操作
hash
image.png基本操作 hset hmset hget hmget
hash存储解构
1、ziplist
2、hashtable
ziplist:
经过压缩的双向链表,牺牲了读写性能来节省空间。
如果value超过64个字节就专程hashtable
redis对dictEntry做了多层的封装。
image.png
列表
列表可以存储有序的字符串。可以充当队列或者栈。
image.png
list存储原理 quicklist
是一个双向循环的列表。
quicklistNode
image.png
set 无序集合
image.png无序不重复的集合。
如果全都是i整形,就用intset。如果有其他的就用hashtable
应用场景:
1、点赞、签到、打卡(key是用户id,value是给他点赞的用户)
2、取交集差集并集
3、用户互相关注、推荐模型
zset有序集合
Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。
不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。
有序集合的成员是唯一的,但分数(score)却可以重复。
集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。 集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)。
image.png image.png image.png
网友评论