当前位置: 首页 > news >正文

与电子商务网站建设有关实训报告系统优化助手

与电子商务网站建设有关实训报告,系统优化助手,三亚网站建设价格,国家优化防控措施文章目录Redis连接池编译项目整体架构使用分布式锁总结Redis连接池 封装hiredis的一些基本操作#xff0c;redishelper类提供包含连接#xff0c;放回#xff0c;存取键#xff0c;push#xff0c;pop#xff0c;执行redis语句和执行lua脚本的函数#xff0c;连接池是类… 文章目录Redis连接池编译项目整体架构使用分布式锁总结Redis连接池 封装hiredis的一些基本操作redishelper类提供包含连接放回存取键pushpop执行redis语句和执行lua脚本的函数连接池是类模板传入相应helper类即可实现多种连接池后续实现mysql连接池。 编译项目 安装hiredis解压文件中hiredis.tar后续对源码进行了改动文件中是改后的 tar -xvf hiredis.tar cd hiredis/ make make install # 权限不足加上sudo删除之前的CMakeCache.txt cd ConnPool/ rm CMakeCache.txt重新cmake和make cmake . make -j4后续引入头文件SimConnPool.h即可使用简单应用见tests文件 整体架构 RedisHelperredis相关操作创建一个连接时构造函数不做任何事在connection函数时才真正建立一条连接每条连接都包含一个指向连接池的指针为了实现放回操作基础实现依赖hiredis库中的redisCommand函数ConnPool 连接池模板初始化时构造函数不做任何操作在连接池connection时才执行init函数完成每一个连接的初始化并且依次调用每条连接的connection函数Singleton单例模板包装ConnPool类变成单例对象 使用 static SimpleConnPool::redisPool* pool SimpleConnPool::redisConnPoolMgr::GetInstance(); // 获取一个连接池单例对象默认5个连接 pool-connection(127.0.0.1, 6000); // 连接池内连接上redis入参ip、端口号、密码默认为空 SimpleConnPool::redisPool::connPtr conn pool-get(); // 取出一条连接 // TODO conn-connBack(); // 放回连接 分布式锁 当多线程并发访问数据库中某个资源时可能同一时间返回都取到了旧值并且对旧值进行变更这样会造成逻辑上的混淆。比如在电商场景库存这个变量当多个用户进行抢购的时候首先判断库存然后库存减一若不加锁库存为1的时候可能多个用户获取库存判断时都拿到了1最后都进行库存减一可能就出现负数了。 在分布式系统环境下一个方法在同一时间只能被一个机器的一个线程执行 高可用的获取锁与释放锁 具备可重入特性可理解为重新进入由多于一个任务并发使用而不必担心数据错误 具备锁失效机制即自动解锁防止死锁 加锁 实际是对一个键进行赋值借助set key val NX PX timeout 语句实现NX表示若键存在返回nil不存在则赋值当多线程运行到lock时只有第一个执行语句的线程可以跳出继续执行其余线程都需要阻塞在lock内部。 设置超时时间为了保证不会因为加锁线程挂掉而导致死锁的情况。 /* 加锁逻辑在不存在键时设置键 并同时设置超时时间 保证原子性set key value NX PX timeout默认10秒返回该线程拿到锁生成的值后续解锁比较不能因为挂机或网络原因解锁别的线程锁分布式锁的键为redis.lock 值为当前时间戳 nsec*/ std::string lock(uint64_t timeout 30000) {while(1) {struct timespec time {0, 0};clock_gettime(CLOCK_REALTIME, time);std::string uuid std::to_string(time.tv_nsec);std::string cmd set redis.lock uuid NX PX std::to_string(timeout);std::string flag;RedisState sta;{MutexType::Lock lock(m_mutex);sta execute(cmd, flag);}if(sta RedisState::M_REDIS_OK) {std::cout get redis.lock! std::endl;return uuid;}} }解锁 需要取值、判断、删除三个操作因此使用lua脚本来保证原子性判断是为了保证不会删除其余线程所创建的锁。 /*解锁逻辑获取锁判断锁删除锁为了保证原子性使用lua脚本来完成三个操作redis使用eval xxxx keys数量 key1 key2 num1 num2 */ void unlock(const std::string uuid) {std::string cmd eval \if redis.call(get,KEYS[1]) ARGV[1] then return redis.call(del,KEYS[1]) else return 0 end\ 1 redis.lock uuid;int flag;RedisState sta executeLua(cmd.c_str(), flag);if(sta RedisState::M_REDIS_OK flag 0) {std::cout 获取到锁并解锁 std::endl;}else {std::cout 未获取到锁 errstr: m_error_msg std::endl;}return ; }总结 基于hiredis只需要引入头文件即可使用简单方便复杂语句使用execute函数直接执行但是需要根据redis客户端返回值传入该函数第二个参数setget返回ok就传stringdel返回1或0就传int 为了可以执行lua脚本对hiredis中源码进行了改动原先是以空格来分割命令的但是lua脚本需要return时肯定包含空格需要更改分割规则增加以双引号分割详见hiredis中lua脚本调用_hiredis lua_suhiymof的博客-CSDN博客 std::string cmd EVAL \redis.call(SET, KEYS[1], ARGV[1]) local result redis.call(get,KEYS[1]) return result\ 1 foo1 bar1; std::string flag; // set get为string类型del为int类型看redis客户端返回的类型设置 conn-executeLua(cmd.c_str(), flag); std::cout lua执行结果 flag std::endl;帮助大家熟悉C和redis的基本操作使用lua脚本实现了简单的分布式锁可以多线程的访问数据库中某个变量 还缺少健康检测自动扩缩容等实现大家有需要可以继续开发 整体项目地址 供大家学习使用如果有帮助请多点点star
http://www.tj-hxxt.cn/news/141265.html

相关文章:

  • 国外有没有网站是做潘多拉的市场调研报告万能模板
  • 国外网站搭建平台京网站建设
  • 巴中市建设局网站博客网站登录入口
  • 优秀网站网页设计v9做的网站被攻击链接吧跳转
  • 山东专业的网站建设wordpress手机自动跳转二级
  • 网站备案名称填写规则工业企业网络推广
  • 潍坊作风建设网站asp网站源码
  • 旅游网站设计完整代码好的企业管理网站
  • 网站建设的公司前景大型网站开发 书籍
  • 购物网站建设网页推广php网站开发前景
  • 建设集团网站报告书阿里巴巴网站分类板块做全屏
  • 网站开发职业工资如何开发app软件平台
  • 建设网站投标标书范本手机如何制作app
  • 怎么样做手机网站做零售网站
  • 建站网址导航hao123连山网站建设
  • 呼和浩特网站建设费用html编辑器怎么用
  • 销售网站的技巧镇江网友之家手机版
  • 纪检监察工作 网站建设抖音代运营合同范标准版
  • 做服装外单的网站有哪些网站logo代码
  • 珠海门户网站建设山东莱芜金点子信息港
  • 做暧暧视频免费视频中国网站上海网站建设seo1888
  • 自学摄影教程的网站有哪些中国建设银行个人登录
  • 郑州网站建设公司如何公众号开发专业
  • 建立一个网站的流程wordpress图片变小了
  • 怎么做页眉网络优化工程师是干什么的
  • 北京做网站推广多少钱网页制作背景颜色
  • 怎么自己做微网站吗网页设计html代码大全空格
  • 建站专业定制炫酷wordpress主题
  • 网站收录怎么删外贸网站建设价格怎么样
  • 万宁网站建设公司wordpress ping服务列表