当前位置:网站首页>Redis介绍与使用
Redis介绍与使用
2022-07-06 09:19:00 【几何学家】
redis概述
redis是一种非关系型数据库,部署在内从中的键值数据库,其value可以有五种类型,分别为string,set,hash,list,zset
STRING:可以存储字符串,整数或者浮点数,可以对于整个字符串或者字符串中的字串进行操作,当其为整数或者浮点数时,可以进行自增或者自减操作
LIST:主要存储列表。两端压入或弹出,可以对于多个元素进行修剪,只保留一个范围内的元素
SET :可以添加获取移除单个元素,计算交,并,差集,从集合中随机获取元素
HASH:可以添加获取移除单个元素,检查元素是否存在,获取所有键值对
ZSET:添加获取删除元素,根据分值范围或成员来获取元素,计算一个键的排名
数据结构底层实现
string:
struct sdshdr{
int len;//已经占用空间长度
int free;//剩余空间长度
char buf[];//数据空间
}
相比于直接调用c字符串的优势是可以直接保存长度无需遍历。除此之外还可以减少缓冲区溢出的问题,因为使用前会先检查剩余长度是否足够。
list:
双向链表,不过多介绍
typedef struct listNode{
struct listNode *prev;
struct listNode * next;
void * value;
}
hash:
typedef struct dictht {
//哈希表数组
dictEntry **table;
//哈希表大小
unsigned long size;
//哈希表大小掩码,用于计算索引值
unsigned long sizemask;
//该哈希表已有节点的数量
unsigned long used;
}
typeof struct dictEntry{
//键
void *key;
//值
//不同的键值对应的值可能不同类型,
//因此使用union来解决这个问题
union{
void *val;
uint64_tu64;
int64_ts64;
}
struct dictEntry *next;
}
当hash冲突时,采用拉链法解决冲突
zset:
底层采用跳表实现,可以用来代替二叉平衡树
跳跃表(skiplist)是一种有序数据结构,它通过在每个节点中维持多个指向其他节点的指针,从而达到快速查找访问节点的目的。跳跃表是一种随机化的数据,跳跃表以有序的方式在层次化的链表中保存元素,效率和平衡树媲美 ——查找、删除、添加等操作都可以在O(logn)期望时间下完成。
//节点的具体实现
typedef struct zskiplistNode{
//层
struct zskiplistLevel{
//前进指针
struct zskiplistNode *forward;
//跨度
unsigned int span;
} level[];
//后退指针
struct zskiplistNode *backward;
//分值
double score;
//成员对象
robj *obj;
}
typedef struct zskiplist {
//表头节点和表尾节点
structz skiplistNode *header,*tail;
//表中节点数量
unsigned long length;
//表中层数最大的节点的层数
int level;
}zskiplist;
还不了解的小伙伴可以看下面这篇帖子
Skip List–跳表(全网最详细的跳表文章没有之一)
set:
typedef struct intset{
//编码方式int16_t、int32_t、int64_t
uint32_t enconding;
// 集合包含的元素数量
uint32_t length;
//保存元素的数组
int8_t contents[];
}
intset是Redis内存数据结构之一,和之前的 sds、 skiplist、dict、adlist
等通用数据相比,它是Redis特有的,用来实现Redis的Set结构(当元素较小且为数字类型时),它的特点有:元素类型只能为数字。 元素有三种类型:int16_t、int32_t、int64_t。 元素有序,不可重复。
intset和sds一样,内存连续,就像数组一样。
边栏推荐
- MySQL 三万字精华总结 + 面试100 问,吊打面试官绰绰有余(收藏系列
- Fairygui bar subfamily (scroll bar, slider, progress bar)
- 2年经验总结,告诉你如何做好项目管理
- Halcon knowledge: gray_ Tophat transform and bottom cap transform
- Matlab读取GNSS 观测值o文件代码示例
- Mysql database reports an error: row size too large (> 8126) Changing some columns to TEXT or BLOB or using ROW_ FORMAT=DY
- Music playback (toggle & playerprefs)
- Agile development helps me
- Fairygui joystick
- VLSM variable length subnet mask partition tips
猜你喜欢
RTKLIB: demo5 b34f.1 vs b33
《软件测试》习题答案:第一章
Basic DOS commands
[GNSS data processing] Helmert variance component estimation analysis and code implementation
2年经验总结,告诉你如何做好项目管理
[algorithm] sword finger offer2 golang interview question 13: sum of numbers of two-dimensional submatrix
[Chongqing Guangdong education] Shandong University College Physics reference materials
面渣逆袭:Redis连环五十二问,三万字+八十图详解。
闇の連鎖(LCA+树上差分)
Halcon knowledge: gray_ Tophat transform and bottom cap transform
随机推荐
Record: Navicat premium can't connect to MySQL for the first time
《软件测试》习题答案:第一章
音乐播放(Toggle && PlayerPrefs)
Itext 7 生成PDF总结
[algorithm] sword finger offer2 golang interview question 5: maximum product of word length
Pride-pppar source code analysis
FairyGUI增益BUFF數值改變的顯示
Edit distance (multi-source BFS)
FairyGUI条子家族(滚动条,滑动条,进度条)
Employment of cashier [differential constraint]
Excel导入,导出功能实现
架构师怎样绘制系统架构蓝图?
It has been solved by personal practice: MySQL row size too large (> 8126) Changing some columns to TEXT or BLOB or using ROW_ FORMAT
[算法] 剑指offer2 golang 面试题6:排序数组中的两个数字之和
国企秋招经验总结
VLSM variable length subnet mask partition tips
How to improve the deletion speed of sequential class containers?
十分鐘徹底掌握緩存擊穿、緩存穿透、緩存雪崩
Detailed explanation of balanced binary tree is easy to understand
Mysql database index