Redis-数据结构与对象-简单动态字符串

1. Redis中的String

在Redis中没有使用c语言的字符串,而是使用了一种叫做简单动态字符串的数据结构,简称SDS,而c中的字符串在Redis只有字面量,且无需对字符串内容修改的时候才使用,其他时候都是使用SDS

例如  set msg “redis”  其中msg和”redis“  底层均为SDS

例如  redisLog("asdasdasd")  这个时候就是使用c语言字符串

2. 数据结构

struct sdshdr{

    //记录buf数组中已经使用的字节数量

    //等于SDS所保存字符串的长度

    int len;

    //记录buf数组中未使用的字节数量

    int free;

    //字节数组,用于保存字符串

    char buf[]

}

3. 使用SDS的优点

3.1. 获取字符串长度更快

SDS因为有len,所以SDS返回字符串长度的时候直接返回len的值,时间复杂度O(1),而如果使用c字符串,那么规则是从开头遍历到\0为止时间复杂度是O(n)

3.2. 杜绝缓冲区溢出

c字符串会因为字符串拼接的时候导致内存溢出,如果忘记之前扩大目标字符串内存大小的话

而SDS是没有这个风险,SDS每次拼接字符串都会预估free是否能装下待拼接的字符串,如果可以则不扩容,如果不行自动扩容,无内存溢出风险

3.3. 减少修改内容时所需要分配内存的次数

因为分配内存这个操作是比较耗费时间的,c字符串每次拼接字符串都是要扩容的,那么如果拼接n次,扩容就需要n次

SDS每次拼接是会自动扩容的,而且不是拼接多少就扩容多少,SDS有个扩容策略

  • 字符串长度小于1m,也就是len的值小于1m,SDS扩容是分配内存free和len将会相同,例如字符串拼接后长度是10,那么SDS的len和free均为10,buf的大小为10+10+1
  • 字符串长度大于1m,每次分配free分配1m  例如SDS长度是50m,那么free是1m  buf大小为50m+1m+1

解释下这个1,SDS和c字符串一样,默认\0结束,为的是兼容c原生的字符串函数,可以直接使用

如果SDS拼接字符串时候free可以放下拼接的字符串,是不需要扩容的,直接存放就行

如果SDS使用sdstirm那么回收的内存是不是会释放的,会增加free的数量,这叫做惰性回收

当然,Redis也是有api可以真正回收的内存的函数

3.4. 二进制安全

C字符串是无法存放二进制的,因为遇见空字符是无法解析的,因为遇见空字符会以为是字符串的结尾,导致后面字符无法解析,这就意味着只能存放文本

SDS是可以存放二进制的,这意味着可以存放图片,音频等等信息,因为SDS读取是根据len,而不是去遍历字符串,所以在len的长度之内,是不会有任何对buf数组中字符进行操作的地方

3.5. 兼容部分C函数

因为SDS是以\0结尾,那么这种模式,可以兼容一部分的C函数,因为C函数符合\0结尾字符串就能执行

 

4. SDS API

函数

作用

时间复杂度

函数

作用

时间复杂度

sdsnew创建一个包含给定c字符串的SDSO(n) n为给c字符串的长度
sdsempty创建一个不包含任何内容的空SDSO(1)
sdsfree释放给定的SDSO(n) n为被释放SDS的长度
sdslen返回SDS的已使用空间字节数O(1)
sdsvail返回SDS未使用的空间字节数O(1)
sdsup创建一个给定SDS的副本 copyO(n) n为给定的SDS长度
sdsclear清空SDS保存字符串内容O(1) 惰性释放,改free和len即可
sdscat将给定C字符串拼接到SDS字符串末尾O(n) n为被拼接的c字符串
sdscatsds将SDS拼接到另一个SDS末尾O(n) n为被拼接的SDS字符串
sdscopy将给定的C字符串复制到SDS中,覆盖原有O(n) n为被复制的c字符串
sdsgrowzero用空字符将SDS扩展至给定长度

O(n) n为扩展新增的字节数

sdsrange保留SDS给定区间内的数据,不在区间内的数据覆盖或清除O(n) n保留的字节数
sdstrim接受一个SDS和一个C字符串,从SDS左右两端移除C字符串出现过的字符O(MN) M是SDS长度,N是c字符串长度
sdscmp对比两个SDS是否相同O(n) n为两个SDS中长度小的那个

 

在探索智慧旅游的新纪元中,一个集科技、创新与服务于一体的整体解决方案正悄然改变着我们的旅行方式。智慧旅游,作为智慧城市的重要分支,旨在通过新一代信息技术,如云计算、大数据、物联网等,为游客、旅游企业及政府部门提供无缝对接、高效互动的旅游体验与管理模式。这一方案不仅重新定义了旅游行业的服务标准,更开启了旅游业数字化转型的新篇章。 智慧旅游的核心在于“以人为本”,它不仅仅关注技术的革新,更注重游客体验的提升。从游前的行程规划、信息查询,到游中的智能导航、个性化导览,再到游后的心情分享、服务评价,智慧旅游通过构建“一云多屏”的服务平台,让游客在旅游的全过程中都能享受到便捷、个性化的服务。例如,游客可以通过手机APP轻松定制专属行程,利用智能语音导览深入了解景点背后的故事,甚至通过三维GIS地图实现虚拟漫游,提前感受目的地的魅力。这些创新服务不仅增强了游客的参与感和满意度,也让旅游变得更加智能化、趣味化。 此外,智慧旅游还为旅游企业和政府部门带来了前所未有的管理变革。通过大数据分析,旅游企业能够精准把握市场动态,实现旅游产品的精准营销和个性化推荐,从而提升市场竞争力。而政府部门则能利用智慧旅游平台实现对旅游资源的科学规划和精细管理,提高监管效率和质量。例如,通过实时监控和数据分析,政府可以迅速应对旅游高峰期的客流压力,有效预防景区超载,保障游客安全。同时,智慧旅游还促进了跨行业、跨部门的数据共享与协同合作,为旅游业的可持续发展奠定了坚实基础。总之,智慧旅游以其独特的魅力和无限潜力,正引领着旅游业迈向一个更加智慧、便捷、高效的新时代。
内容概要:本文详细介绍了大模型的发展现状与未来趋势,尤其聚焦于DeepSeek这一创新应用。文章首先回顾了人工智能的定义、分类及其发展历程,指出从摩尔定律到知识密度提升的转变,强调了大模型知识密度的重要性。随后,文章深入探讨了DeepSeek的发展路径及其核心价值,包括其推理模型、思维链技术的应用及局限性。此外,文章展示了DeepSeek在多个行业的应用场景,如智能客服、医疗、金融等,并分析了DeepSeek如何赋能个人发展,具体体现在公文写作、文档处理、知识搜索、论文写作等方面。最后,文章展望了大模型的发展趋势,如通用大模型与垂域大模型的协同发展,以及本地部署小模型成为主流应用渠道的趋势。 适合人群:对人工智能和大模型技术感兴趣的从业者、研究人员及希望利用DeepSeek提升工作效率的个人用户。 使用场景及目标:①了解大模型技术的最新进展和发展趋势;②掌握DeepSeek在不同领域的具体应用场景和操作方法;③学习如何通过DeepSeek提升个人在公文写作、文档处理、知识搜索、论文写作等方面的工作效率;④探索大模型在特定行业的应用潜力,如医疗、金融等领域。 其他说明:本文不仅提供了理论知识,还结合实际案例,详细介绍了DeepSeek在各个场景下的应用方式,帮助读者更好地理解和应用大模型技术。同时,文章也指出了当前大模型技术面临的挑战,如模型的局限性和数据安全问题,鼓励读者关注技术的持续改进和发展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值