当前位置:网站首页>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一样,内存连续,就像数组一样。
边栏推荐
- 十分钟彻底掌握缓存击穿、缓存穿透、缓存雪崩
- 错误:排序与角标越界
- 染色法判定二分图
- isEmpty 和 isBlank 的用法区别
- Record: solution of 404 error of servlet accessing database in dynamic web project
- [算法] 剑指offer2 golang 面试题6:排序数组中的两个数字之和
- [rtklib 2.4.3 B34] version update introduction I
- Unity3d, Alibaba cloud server, platform configuration
- 架构师怎样绘制系统架构蓝图?
- Basic DOS commands
猜你喜欢
Chromatic judgement bipartite graph
FairyGUI簡單背包的制作
121道分布式面试题和答案
Fairygui joystick
Answer to "software testing" exercise: Chapter 1
[算法] 剑指offer2 golang 面试题5:单词长度的最大乘积
121 distributed interview questions and answers
FairyGUI按钮动效的混用
[algorithm] sword finger offer2 golang interview question 8: the shortest subarray with a sum greater than or equal to K
Matlab读取GNSS 观测值o文件代码示例
随机推荐
[algorithm] sword finger offer2 golang interview question 7: 3 numbers with 0 in the array
[rtklib 2.4.3 B34] version update introduction I
[算法] 剑指offer2 golang 面试题13:二维子矩阵的数字之和
微信小程序开发心得
Fairygui character status Popup
[algorithm] sword finger offer2 golang interview question 13: sum of numbers of two-dimensional submatrix
[algorithm] sword finger offer2 golang interview question 2: binary addition
一文搞定 UDP 和 TCP 高频面试题!
[算法] 剑指offer2 golang 面试题3:前n个数字二进制形式中1的个数
Implementation of Excel import and export functions
FairyGUI条子家族(滚动条,滑动条,进度条)
【无标题】
How to improve the deletion speed of sequential class containers?
Heap sort [handwritten small root heap]
GNSS定位精度指标计算
GNSS positioning accuracy index calculation
2022 National Games RE1 baby_ tree
Ten minutes to thoroughly master cache breakdown, cache penetration, cache avalanche
[算法] 剑指offer2 golang 面试题7:数组中和为0的3个数字
闇の連鎖(LCA+树上差分)