C++自制Redis数据库(八)基本数据结构--String

后端开发必须要懂的Redis,Redis的数据结构 认识Redis与Redis的数据结构 本文作为Redis的通识教程,旨在让大家对Redis有一个概念性和整体性的认识,并且可以快速上手,为深入Redis打下基础。 文章概要: Redis的介绍 Redis与其他数据库的对比 Redis与其他缓存实现对比 Redis的数据结构类型 Redis命令操作几种数据类型 Spring Data Redis操作几种数据类型 ZSET(有序集合)保证顺序 SET(集合)随机获取元素 Redis的介绍 Redis是一种非关系型数据库(non-rel 阅读详情

说起数据结构,真是没办法,C/C++这两个C++的数据结构转换起来还是有点麻烦。我重新实现String 的本意是使用自己写的内存管理函数,但是我发现还是有很多不好解决的问题,比如线程安全,比如线程安全,比如线程安全,自己实现的特定的内存管理程序一定比通用的好用这是必须的肯定的一定的,但是new 可以调用构造函数,析构函数,而自己实现的内存是直接的内存分配,这对于我初学C++确实是一大难题,索性这个问题留给后边的库吧,我在这个项目完成后会去封一个自己的伸缩性强的内存管理库。

所以使用new delete 实现自己的String

[c]

#ifndef _STRING_REDIS_H
#define _STRING_REDIS_H
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cassert>

#define STRING_MAX                  (1024 * 1024)
#define FREE_STR(n)                   (LEN_STR(n) - n)
#define LEN_STR(n)                     (n * 2)

#define DEFAULT_SIZE_MAX    (1<<2)
#define DEFAULT_SIZE                (1<<7)

class String{
private:
char * sds;
int size;
int free;
public:
String(const char * s);
String();
String(const char *s,int len);
String(const String & st);
~String();

String & operator=(const String &);
String & operator=(const char *);
char & operator[](int i);

friend bool operator<(const String &st,const String &st2);
friend bool operator>(const String &st,const String &st2);
friend bool operator==(const String &st,const String &st2);
friend std::ostream & operator<<(std::ostream & os,const String &st2);
friend std::istream & operator>>(std::istream & is,String & st);

int getsize()const;
int getfree()const;
String & StringAdd(const String & st2);
String & StringAdd(const char *s);
String & StringClear(String & st);
String & StringSizeClear(String & st,int len);
String & StringUpDate(const char *s);
String & StringUpDate(const String & st);
};

#endif

String::String(const char *s){

size = std::strlen(s);
free = FREE_STR(size);
//sds = (char *)std::malloc(LEN_STR(size));
sds = new char[LEN_STR(size)];
std::strcpy(sds,s);

}

String::String(){
size = DEFAULT_SIZE;
free = FREE_STR(size);
//sds = (char *)std::malloc(LEN_STR(size));
sds = new char[LEN_STR(size)];
sds[0] = '\0';
}

String::String(const String & st){
size = st.size;
free = FREE_STR(st.size);
//sds = (char *)std::malloc(LEN_STR(size));
sds = new char[LEN_STR(size)];
std::strcpy(sds,st.sds);
}

String::~String(){

//std::cout << "~~~~" << std::endl;
//std::free(sds);
delete [] sds;

}

String & String::operator=(const char *s){
std::free(sds);
size = std::strlen(s);
//sds = (char *)malloc(LEN_STR(size));
sds = new char[LEN_STR(size)];
std::strcpy(sds,s);
free = FREE_STR(size);
return *this;
}
String & String::operator=(const String & st){
if(this == &st)
return *this;
std::free(sds);
size = LEN_STR(st.size);
//sds = (char *)std::malloc(LEN_STR(size));
sds = new char[LEN_STR(size)];
free = FREE_STR(size);
std::strcpy(sds,st.sds);
return *this;
}

char & String::operator[](int i){
return sds[i];
}

bool operator<(const String &st,const String &st2){
return(std::strcmp(st.sds,st2.sds) < 0);
}

bool operator>(const String &st,const String &st2){
return(std::strcmp(st.sds,st2.sds) > 0);
}

bool operator==(const String &st,const String &st2){
return(std::strcmp(st.sds,st.sds) == 0);
}

std::ostream & operator<<(std::ostream & os,const String & st){
os << st.sds;
return os;
}

std::istream & operator>>(std::istream & is,String & st){
char temp[DEFAULT_SIZE];
is.get(temp,DEFAULT_SIZE);
if(is)
st = temp;
while(is && is.get() != '\n')
continue;
return is;
}

int String::getsize()const{
return size;
}

int String::getfree()const{
return free;
}

String & String::StringAdd(const String & st2){

int len = st2.getsize();
if(len < free){
size += len;
free -= len;
std::strcat(sds,st2.sds);
}else if(len <= STRING_MAX && len >= free){
char temp[size + 1];
std::strcpy(temp,sds);
std::free(sds);
size = size + len;
free = FREE_STR(size);
//sds = (char *)std::malloc(LEN_STR((size)));
sds = new char[LEN_STR(size)];
assert(sds != NULL);
std::strcpy(sds,temp);
std::strcat(sds,st2.sds);
}else{
//do nothing
}

return *this;
}

String & String::StringAdd(const char *s){
int len = std::strlen(s);
if(len < free){
size += len;
free -= len;
std::strcat(sds,s);
}else if(len <= STRING_MAX && len >= free){
char temp[size + 1];
std::strcpy(temp,sds);
std::free(sds);
size = size + len;
free = FREE_STR(size);
//sds = (char *)std::malloc(LEN_STR(size));
sds = new char[LEN_STR(size)];
assert(sds != NULL);
std::strcpy(sds,temp);
std::strcat(sds,s);
}else{
//do nothing
}
return *this;
}

String & String::StringClear(String & st){

memset(sds,0,size+free);
free += size;
size = 0;

return *this;

}

String & String::StringSizeClear(String & st,int len){

memset(sds,0,len);
(len >= size) ? (free += size):(free += len);
(len >= size) ? (size = 0) : (size -= len);
return *this;
}
String & String::StringUpDate(const char *s){
int len = std::strlen(s);
if(len < free){
size += len;
free -= len;
std::strcat(sds,s);
}else if(len <= STRING_MAX && len >= free){
char temp[size + 1];
std::strcpy(temp,sds);
std::free(sds);
size = size + len;
free = FREE_STR(size);
//sds = (char *)std::malloc(LEN_STR(size));
sds = new char[LEN_STR(size)];
assert(sds != NULL);
std::strcpy(sds,temp);
std::strcat(sds,s);
}else{
//do nothing
}
return *this;
}

String & String::StringUpDate(const String & st){

int len = st.getsize();
if(len < free){
size += len;
free -= len;
std::strcat(sds,st.sds);
}else if(len <= STRING_MAX && len >= free){
char temp[size + 1];
std::strcpy(temp,sds);
std::free(sds);
size = size + len;
free = FREE_STR(size);
//sds = (char *)std::malloc(LEN_STR((size)));
sds = new char[LEN_STR(size)];
assert(sds != NULL);
std::strcpy(sds,temp);
std::strcat(sds,st.sds);
}else{
//do nothing
}

return *this;
}

&nbsp;

[/c]

查看原文:http://zmrlinux.com/2016/02/09/c%e8%87%aa%e5%88%b6redis%e6%95%b0%e6%8d%ae%e5%ba%93%ef%bc%88%e5%85%ab%ef%bc%89%e5%9f%ba%e6%9c%ac%e6%95%b0%e6%8d%ae%e7%bb%93%e6%9e%84-string/

C++ 实现的一个简单数据库 未实现语法分析和语义分析。 在程序编写的时候,虚拟的一个语法树。 其中用到了一些不安全函数,有待完善。 立即下载

相关推荐

Landsat9 地表温度反演方法

landsat9地表温度反演及缺失值处理方法

xiangliu12345的博客 3919

使用c++来实现一个简单的数据库功能

类sqllite的数据库实现

tiaobolian6687的博客 2481

jaka+realsense+aruco+手眼标定(python)

第二次重建了项目的手眼标定部分……有很多第一次记录遗漏的地方,在此补充。

drivenzyw的博客 2122

基于C++实现的简易数据库

项目名称:简易数据库使用数据结构: B+ 树开发环境: Visual Studio 2015 Community功能概述:实现了型数据的查找、插入、删除、修改等功能。

毕业作品网站 3226

HyperMesh实战:用Field工具搞定复杂载荷映射(附TCL脚本示例)

本文深入探讨了HyperMesh中Field工具在复杂载荷映射中的高级应用,包括从CSV到有限元网格的温度场映射全流程、稀疏数据处理技巧及TCL自动化脚本示例。通过Field工具,工程师可以高效实现CFD温度场到结构网格的精准映射,显著提升有限元分析的精度与效率。

white的博客 265

OpenPnP/Arduino - 二手西门子电动飞达的通讯协议解析与实战

本文详细解析了二手西门子电动飞达的通讯协议,并通过Arduino控制板实现与开源贴片平台OpenPnP的集成。文章涵盖了硬件接口定义、协议帧结构分析、Arduino控制实战、OpenPnP集成技巧以及二手飞达翻新指南,为开发者提供了全面的技术指导和实战经验。

weixin_30411819的博客 202

C++实现简易数据库

c++简易数据库,实现repl SQL解析、分页读取及存储、光标、BTREE等

神奇的青蛙 5996

wpf入门第五篇 WPF with ECharts

前言 本文是wpf入门系列第五篇,面向有winform或者web前端基础的、并且也有C#基础的同学。 ECharts是百度团队开发的开源免费的js图表控件库,非常强大,文档齐全。WPF中使用图表,除了可以选择devexpress或者oxyplot之类的专为wpf开发的图表控件之外,还可以考虑使用 WebBrowser+ECharts 来完成复杂的图表展示,其展示效果不亚于前者。 本文介绍了 WP...

wf824284257的博客 1万+

如何用C++实现一个简易数据库(一)

如何用C++实现一个简易数据库(一) 1. 如何安装我们的单元测试环境? 检查我们是否有安装ruby。 输入命令ruby -v,我们将得到 ruby 2.7.0p0 (2019-12-25 revision 647ee6f091) [x86_64-linux-gnu] 如果没有安装使用sudo apt install ruby或对应操作系统的包管理工具安装即可。 检查我们是否有安装rspec 输入命令rspec -v,我们将得到 RSpec 3.10 - rspec-core 3.10

weixin_44214242的博客 2480

Android16 3576 u盘固件升级功能添加

1.在u-boot/drivers/power/pmic/rk8xx.c。这里是读取power键的寄存器判断长短按。

tzj1058756809的博客 575

CANoe制作网关实现CAN(FD)报文故障注入(报文长度/timeout/信号错误/E2E)2

CANoe制作网关实现CAN报文故障注入(报文长度/timeout/信号错误/E2E) 2.新建CANoe工程 3.透传功能 4.故障注入panel面板 5.CAPL代码 5.1故障注入开始、停止、定时 5.2DLC故障注入 5.3 Timeout故障注入 5.4 信号故障注入

天赐好车的博客 3680

C++自制Redis 数据库(十)数据结构类

随着项目的缓慢进行,整个项目的结构逐渐清晰,看来我之前的设计架构是相对合理的,至今在大结构上未见致命及影响扩展性的错误,但是相信以后还是会出现的,毕竟工程实践中错误一定会出现,并且有些错误肯定会重复出现。 我逐渐发现C 和 C++的区别还是很大的,即使原作者使用C写出了面向过程的思想,但是我用C++直接写起来还是有点不适应,可能是之前C用的比较多,JAVA还没好好学吧,但是这并不能成为我的绊脚石...

密码小仙女 533

PCL 利用RANSAC改进的ICP算法

本文介绍了一种基于RANSAC改进的ICP点云配准算法。算法原理部分阐述了在ICP迭代过程中使用RANSAC剔除错误匹配点对的方法。

点云侠的博客 196

Redis 核心数据结构:String 类型深度解析与 C++ 实战

通过本文的深入探讨,我们全面地学习了 Redis String 类型的核心命令,并掌握了如何使用这一优秀的 C++ 库在实际项目中应用它们。我们从最基础的SET和GET出发,理解了借助带来的类型安全;我们学会了使用为键赋予生命周期,使其能够自动过期;我们探索了NX/XX选项在实现分布式锁等场景下的精妙用途;我们领略了MSET/MGET结合迭代器模式在批量操作中带来的巨大性能提升;我们还实践了对字符串的局部精细操作,以及INCR/DECR家族在构建高并发原子计数器时的核心价值。

2301_80863610的博客 9976

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

redis学习笔记(八)—— C++ 操作 Redis

本文介绍基于 hiredis 的 C++ Redis 客户端库 redis-plus-plus,讲解在 Linux 下安装依赖、编译安装的完整流程。并通过示例代码,详细演示 Redis 通用命令、string、hash、list、set、zset 等核心数据结构的常用 API 使用,包括键值操作、过期设置、批量读写、集合运算、有序集合排序等。文章给出可直接运行的测试代码与编译链接命令,帮助 C++ 开发者快速上手 redis-plus-plus,实现项目中对 Redis 的高效访问。

LH__1314的博客 4023

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

[Redis][C++客户端]详细讲解

[Redis][C++客户端]详细讲解

SnowK博客 5825

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

C++ 操作 Redis 客户端

本文介绍 C++ 语言如何操作 Redis,包含 redis-plus-plus库的安装教程

2401_84784737的博客 1606

cpp_redis异步编程指南:如何利用C++11特性实现高性能Redis操作

cpp_redis是一个基于C++11的轻量级Redis客户端,它支持异步操作、线程安全、无依赖、管道化和跨平台特性。本指南将详细介绍如何利用cpp_redis的异步编程能力和C++11新特性来实现高性能的Redis操作,帮助开发者构建高效可靠的分布式应用。 ## 为什么选择cpp_redis进行异步Redis编程? cpp_redis作为一款现代化的C++ Redis客户端,具有以下核心优势

gitblog_00135的博客 459

Redis常用命令及C/C++调用Redis接口详解

文章目录一、Redis常用命令启动Redis服务端启动Redis客户端Redis常用命令详解键(Key)命令Hash 命令String 命令List 命令Set 命令Zset 命令二、C/C++调用接口连接和操作Redis数据库hiredis.h同步API连接redis数据库发送命令到redis处理redis应答清理连接资源发送多个命令参数访问Redis代码实例 一、Redis常用命令 一般Redis都是安装在linux上,分为server和client。 启动Redis服务端 在终端输入以下命令启动 Re

qq_41854911的博客 1万+

Redis SCAN命令原理与C++客户端集成实战指南

在分布式缓存和内存数据库领域,高效、安全地遍历海量键(Key)是核心需求。传统KEYS命令的阻塞式遍历在生产环境中可能导致服务中断,因此Redis引入了基于游标的增量迭代器SCAN命令。其工作原理是将全量遍历分解为多次非阻塞的小批量操作,通过游标记录状态,并支持MATCH模式过滤和COUNT数量提示,在保证服务可用性的同时完成数据遍历。这一机制对于大数据量下的运维监控、数据迁移和批量操作具有重要技术价值。结合RESP(Redis序列化协议)这一二进制安全、高效的通信基础,开发者可以深入理解客户端与服务端的交

weixin_33675507的博客 332

【Redis】数据结构---String

String类型

qq_53893431的博客 2048

c++ string添加字符_Redis实战(2)-数据结构之字符串String实战之存储对象

摘要在Redis众多数据结构当中,字符串String可以说是其中比较常见、应用比较频繁的一种了,本文我们将介绍数据类型~字符串String 在命令行的简单使用及其在实际业务场景中的应用与代码实战,其中应用场景为"存储前端门户网站的商品详情信息",从而减少数据库DB的访问频率,提高接口的响应速率!内容缓存中间件Redis拥有多种丰富的数据结构,字符串String就是其中比较常见而且应用相当广泛的一种...

weixin_39979159的博客 256

Linux下C++访问Redis

Linux下C++访问Redis编译redis例子gcc编译 编译redis 开发包的下载和编译在其他文章中已经介绍,不熟悉的可以转至[Linux下redis环境搭建]学习。(https://blog.youkuaiyun.com/bajianxiaofendui/article/details/87642244) 编译完成后进入redis-2.8.3/deps/hiredis目录,可以看到下面已经编译出了l...

bajianxiaofendui的博客 8220

C++学习之redis

C++学习之redis

qq_27302885的博客 1379

Redis——常用数据类型string

Redis常用数据String相关指令,编码,应用场景

m0_70289867的博客 1629

C++学习记录:C++连接Redis数据库

C++学习记录:C++连接Redis数据库   之前学习了Redis数据库相关的内容,但是并没有在编写C++代码中用到Redis相关内容。   本篇笔记记录了个人在 Linux 环境下使用 C++ 连接 Redis 数据库的过程。实现了一个简单的排行榜功能。   由于现在的主流是使用 java 连接 redis,所以在网上查询 C语言 的API消耗了一部分时间,在本篇笔记中,我将记录相关数据结构和API的使用方法。 目录C++学习记录:C++连接Redis数据库一、基础准备1. 找到`hiredis.h`

这里是河边 1704
上一篇: C++自制Redis数据库(七) 决战架构设计--从数据的角度贯通始终
下一篇: C++自制Redis 数据库(九) 详细数据库存储结构,线程相关已解决
zmrlinux
博客等级 码龄12年 409粉丝 327原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值