Redis之Set数据结构底层原理
时间: 2024-02-20 09:43:52 浏览: 83
Redis中的Set数据结构是基于哈希表实现的。在Redis中,每个Set都会有一个哈希表,用于存储Set中的元素。哈希表的实现基于链式哈希表,每个哈希表节点包含一个指向下一个节点的指针,以及一个指向元素值的指针。
当向Set中添加元素时,Redis会先判断该元素是否已经存在于Set中,如果不存在,则将该元素转换为哈希表节点并插入到哈希表中。如果存在,则直接返回。删除元素时,Redis会从哈希表中查找该元素,并将其从哈希表中删除。
Set数据结构还支持集合运算,包括并集、交集、差集等。这些操作基于哈希表的数据结构,通过对多个Set的哈希表进行操作来实现集合运算。
总之,Redis的Set数据结构底层实现基于哈希表,具有高效的查找、插入、删除等操作,适用于存储不重复元素的场景。
相关问题
redis的String底层原理
Redis中的String是基于SDS(Simple Dynamic String)实现的,SDS是Redis自己实现的一个字符串类型。SDS和C语言中的字符串一样,是一块连续的内存空间,但是它还增加了一些其他的信息,比如它的长度、当前已使用的空间和总空间等。SDS的结构如下:
```c
struct sdshdr {
int len; //字符串长度
int free; //未使用空间长度
char buf[]; //字符串内容
};
```
Redis中的String底层主要是通过SDS实现的,String的操作都是通过SDS的相关函数实现的,如:
- set:创建一个SDS,将需要存储的字符串拷贝到SDS中,并返回一个指向SDS的指针。
- get:根据输入的key,查找对应的SDS,并返回它的指针。
- append:根据输入的key和value,查找对应的SDS,将value追加到SDS的尾部,同时更新SDS的长度和未使用空间的长度。
- incr:根据输入的key,查找对应的SDS,将SDS中存储的数字加上输入的值,然后将新的数字转换成字符串再存储回SDS中。
- decr:和incr类似,只是将SDS中存储的数字减去输入的值。
- setrange:根据输入的key和offset,查找对应的SDS,在SDS中从offset开始替换指定长度的字符串。
- getrange:根据输入的key、start和end,查找对应的SDS,返回该SDS的子字符串。
- strlen:根据输入的key,查找对应的SDS,返回该SDS的长度。
综上所述,Redis的String底层主要是通过SDS实现的。在SDS的基础上,Redis提供了一些方便数据操作的接口,使得开发者可以更加方便地进行数据存储和操作。
redis set
Redis的set是一种存储结构,用于存储不重复的元素。当一个集合只包含整数值元素并且元素数量不多时,Redis会使用整数集合作为集合键的底层实现。\[1\] Redis提供了一系列命令来操作set,比如sadd用于向集合中添加一个或多个元素,smembers用于获取集合的所有值,scard用于返回集合的元素个数,srem用于删除集合中的一个或多个元素,spop用于随机从集合中取出一个元素等等。\[2\]需要注意的是,set类型不允许数据重复,如果添加的数据在set中已经存在,将只保留一份。\[3\] set类型在权限校验等场景中有广泛的应用。
#### 引用[.reference_title]
- *1* [redis学习笔记-set原理](https://blog.csdn.net/billgates_wanbin/article/details/123629181)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item]
- *2* [redis 中Set类型 及常用命令(附有示例)](https://blog.csdn.net/peinanwei__/article/details/123905542)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item]
- *3* [Redis 基础 -- Redis数据类型之set](https://blog.csdn.net/I_r_o_n_M_a_n/article/details/121769455)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item]
[ .reference_list ]
阅读全文