在不影响性能的情况下,怎么快速批量删除redis数据

Redis在分布式应用中占据着越来越重要的地位,短短的几万行代码,实现了一个高性能的数据存储服务。最近dump中心的cm8集群出现过几次redis超时的情况,但是查看redis机器的相关内存都没有发现内存不够,或者内存发生交换的情况,查看redis源码之后,发现在某些情况下redis会出现超时的状况,相关细节如下。

1.网络。Redis的处理与网络息息相关,如果网络出现闪断则容易发生redis超时的状况。如果出现这种状况首先应查看redis机器网络带宽信息,判断是否有闪断情况发生。

2.内存。redis所有的数据都放在内存里,当物理内存不够时,linuxos会使用swap内存,导致内存交换发生,这时如果有redis调用命令就会产生redis超时。这里可以通过调整/proc/sys/vm/swappiness参数,来设置物理内存使用超过多少就会进行swap。

intrdbSaveBackground(char*filename){pid_tchildpid;longlongstart;if(server.rdb_child_pid!=-1)returnREDIS_ERR;serverserver.dirty_before_bgsave=server.dirty;server.lastbgsave_try=time(NULL);start=ustime();if((childpid=fork())==0){intretval;/*Child*/if(server.ipfd>0)close(server.ipfd);if(server.sofd>0)close(server.sofd);retval=rdbSave(filename);if(retval==REDIS_OK){size_tprivate_dirty=zmalloc_get_private_dirty();if(private_dirty){redisLog(REDIS_NOTICE,"RDB:%zuMBofmemoryusedbycopy-on-write",private_dirty/(1024*1024));}}exitFromChild((retval==REDIS_OK)?0:1);}else{/*Parent*/server.stat_fork_time=ustime()-start;if(childpid==-1){server.lastbgsave_status=REDIS_ERR;redisLog(REDIS_WARNING,"Can'tsaveinbackground:fork:%s",strerror(errno));returnREDIS_ERR;}redisLog(REDIS_NOTICE,"Backgroundsavingstartedbypid%d",childpid);server.rdb_save_time_start=time(NULL);server.rdb_child_pid=childpid;updateDictResizePolicy();returnREDIS_OK;}returnREDIS_OK;/*unreached*/}

另外还有一些特殊情况也会导致swap发生。当我们使用rdb做为redis集群持久化时可能会发生物理内存不够的情况(aof持久化只是保持支持不断的追加redis集群变化操作,不太容易引起swap)。当使用rdb持久化时,如程序1所示主进程会fork一个子进程去dumpredis中所有的数据,主进程依然为客户端服务。此时主进程和子进程共享同一块内存区域,linux内核采用写时复制来保证数据的安全性。在这种模式下如果客户端发来写请求,内核将该页赋值到一个新的页面上并标记为写,在将写请求写入该页面。因此,在rdb持久化时,如果有其他请求,那么redis会使用更多的内存,更容易发生swap,因此在可以快速恢复的场景下尽量少使用rdb持久化可以将rdbdump的条件设的苛刻一点,当然也可以选择aof,但是aof也有他自身的缺点。另外也可以使用2.6以后的主从结构,将读写分离,这样不会出现server进程上又读又写的情景发生3.Redis单进程处理命令。Redis支持udp和tcp两种连接,redis客户端向redis服务器发送包含redis命令的信息,redis服务器收到信息后解析命令后执行相应的操作,redis处理命令是串行的具体流程如下。首先服务端建立连接如程序2所示,在创建socket,bind,listen后返回文件描述符:

server.ipfd=anetTcpServer(server.neterr,server.port,server.bindaddr);

对于redis这种服务来说,它需要处理成千上万个连接(最高达到655350),需要使用多路复用来处理多个连接。这里redis提供了epoll,select,kqueue来实现,这里在默认使用epoll(ae.c)。拿到listen函数返回的文件描述符fd后,redis将fd和其处理acceptTcpHandler函数加入到事件驱动的链表中.实际上在加入事件队列中,程序4事件驱动程序将套接字相关的fd文件描述符加入到epoll的监听事件中。

if(server.ipfd>0&&aeCreateFileEvent(server.el,server.ipfd,AE_READABLE,acceptTcpHandler,NULL)==AE_ERR)redisPanic("Unrecoverableerrorcreatingserver.ipfdfileevent.");intaeCreateFileEvent(aeEventLoop*eventLoop,intfd,intmask,aeFileProc*proc,void*clientData){if(fd>=eventLoop->setsize){errno=ERANGE;returnAE_ERR;}aeFileEvent*fe=&eventLoop->events[fd];if(aeApiAddEvent(eventLoop,fd,mask)==-1)returnAE_ERR;fe->mask|=mask;if(mask&AE_READABLE)fe->rfileProc=proc;if(mask&AE_WRITABLE)fe->wfileProc=proc;fe->clientDataclientData=clientData;if(fd>eventLoop->maxfd)eventLoop->maxfd=fd;returnAE_OK;}

staticintaeApiAddEvent(aeEventLoop*eventLoop,intfd,intmask){aeApiState*state=eventLoop->apidata;structepoll_eventee;/*Ifthefdwasalreadymonitoredforsomeevent,weneedaMOD*operation.OtherwiseweneedanADDoperation.*/intop=eventLoop->events[fd].mask==AE_NONE?EPOLL_CTL_ADD:EPOLL_CTL_MOD;ee.events=0;mask|=eventLoop->events[fd].mask;/*Mergeoldevents*/if(mask&AE_READABLE)ee.events|=EPOLLIN;if(mask&AE_WRITABLE)ee.events|=EPOLLOUT;ee.data.u64=0;/*avoidvalgrindwarning*/ee.data.fd=fd;if(epoll_ctl(state->epfd,op,fd,&ee)==-1)return-1;return0;}

在初始话完所有事件驱动后,如程序5所示主进程根据numevents=aeApiPoll(eventLoop,tvp)获得io就绪的文件描述符和其对应的处理程序,并对fd进行处理。大致流程是accept()->createclient()->readQueryFromClient()。其中readQueryFromClient()读取信息中的redis命令->processInputBuffer()->call()最后完成命令。

voidaeMain(aeEventLoop*eventLoop){eventLoop->stop=0;while(!eventLoop->stop){if(eventLoop->beforesleep!=NULL)eventLoop->beforesleep(eventLoop);aeProcessEvents(eventLoop,AE_ALL_EVENTS);}}intaeProcessEvents(aeEventLoop*eventLoop,intflags){-------------------------------numevents=aeApiPoll(eventLoop,tvp);for(j=0;jevents[eventLoop->fired[j].fd];intmask=eventLoop->fired[j].mask;intfd=eventLoop->fired[j].fd;intrfired=0;/*notethefe->mask&mask&...code:maybeanalreadyprocessed*eventremovedanelementthatfiredandwestilldidn't*processed,sowecheckiftheeventisstillvalid.*/if(fe->mask&mask&AE_READABLE){rfired=1;fe->rfileProc(eventLoop,fd,fe->clientData,mask);}if(fe->mask&mask&AE_WRITABLE){if(!rfired||fe->wfileProc!=fe->rfileProc)fe->wfileProc(eventLoop,fd,fe->clientData,mask);}processed++;}}

从上述代码可以看出redis利用ae事件驱动结合epoll多路复用实现了串行式的命令处理。所以一些慢命令例如sort,hgetall,union,mget都会使得单命令处理时间较长,容易引起后续命令timeout.所以我们第一需要从业务上尽量避免使用慢命令,如将hash格式改为kv自行解析,第二增加redis实例个数,每个redis服务器调用尽量少的慢命令。

请教如何清空Redis中的数据

操作方法如下: /usr/Redis/redis-cli keys "*" | while read LINE ; do TTL=`/usr/redis/redis-cli ttl $LINE`; if [ $TTL -eq -1 ]; thenecho "Del $LINE"; RES=`/usr/redis/redis-cli del $LINE`; fi; done;

redis集群有没有命令可以直接看所有节点的所有数据

在分布式系统中,各个进程(本文使用进程来描述分布式系统中的运行主体,它们可以在同一个物理节点上也可以在不同的物理节点上)相互之间通常是需要协调进行运作的,有时是不同进程所处理的数据有依赖关系,必须按照一定的次序进行处理

水星无线路由器恢复出厂设置后会怎么样清空所有数据是清空哪些数据?

清空的是你设置的用户名和密码光带帐户的用户名和密码无线的设置

如何将redis里边的数据清除

进入redis目录下

redis-cli

flushall搜一下:如何将grid里的数据清除

redis怎么进行清除一些不太常用的数据

Redis常用的删除策略有以下三种:

被动删除(惰性删除):当读/写一个已经过期的Key时,会触发惰性删除策略,直接删除掉这个Key;

主动删除(定期删除):Redis会定期巡检,来清理过期Key;

当内存达到maxmemory配置时候,会触发Key的删除操作;

另外,还有一种基于触发器的删除策略,因为对Redis压力太大,一般没人使用。

-//del

# 情况1: 删除单个key

$redis->set('myname','ikodota');

echo $redis->get('myname').'

'; # 返回:ikodota

$redis->del('myname');# 返回 true(1)

var_dump($redis->get('myname')); # 返回 bool(false)

# 情况2: 删除一个不存在的key

if(!$redis->exists('fake_key')) # 不存在

var_dump($redis->del('fake_key')); # 返回 int(0)

# 情况3: 同时删除多个key

$array_mset=array('first_key'=>'first_val',

'second_key'=>'second_val',

'third_key'=>'third_val');

$redis->mset($array_mset); #用mset一次储存多个值

$array_mget=array('first_key','second_key','third_key');

var_dump($redis->mget($array_mget)); #一次返回多个值 //array(3) { [0]=> string(9) "first_val" [1]=> string(10) "second_val" [2]=> string(9) "third_val" }

$redis->del($array_mget); #同时删除多个key

var_dump($redis->mget($array_mget)); #返回 array(3) { [0]=> bool(false) [1]=> bool(false) [2]=> bool(false) }

redis清空所有数据 php相关推荐

  1. Redis 清空所有数据

    Redis 清空所有数据步骤总结 1.打开cmd 命令窗口,切换至Redis 安装目录下的bin文件夹 2.在cmd 命令窗口,输入连接Redis 指令: redis-cli.exe -h 127.0 ...

  2. Redis清空所有数据命令

    在cmd 命令窗口,输入清空所有Redis 数据指令: flushall

  3. 教你Redis 如何清空所有数据

    这篇文章主要介绍了Redis 如何清空所有数据,具有很好的参考价值,希望对大家有所帮助.如有错误或未考虑完全的地方,望不吝赐教 Redis 清空所有数据步骤总结 1.打开cmd 命令窗口,切换至Red ...

  4. redis 清空db下_如何清空redis中的数据

    Redis Flushall 命令用于清空整个 Redis 服务器的数据(删除所有数据库的所有 key ). 语法 redis Flushall 命令基本语法如下:redis 127.0.0.1:63 ...

  5. [转载] python怎么获取redis中的数据_python操作redis数据库

    参考链接: 使用Python在Selenium中进行非阻塞等待 3.redis基本命令 String set(name, value, ex=None, px=None, nx=False, xx=F ...

  6. redis+mysql游戏数据服务器

    1.数据服务器详细设计 数据服务器在设计上采用三个层次的数据同步,实现玩家数据的高速获取和修改. 数据层次上分为:内存数据,redis数据,mysql数据 设计目的:首先保证数据的可靠,防止数据丢失, ...

  7. 【Redis】03-Redis 数据持久化实践

    简介 背景 Redis之所以这么流行,很大一部分原因便是持久化,断电重启数据不消失,使得redis在数据库领域中站稳了脚. Redis是一种内存数据库,在断电时数据可能会丢失.比如你Redis整个挂了 ...

  8. redis 清空缓存

    redis 命令: flushall --> 清空整个 Redis 服务器的数据(删除所有数据库的所有 key ) flushdb --> 清空当前数据库中的所有 key

  9. 这么设计,Redis 10亿数据量只需要100MB内存

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 来源:www.toutiao.com/i676764283 ...

最新文章

  1. Node.js 系列:构建原生 Node.js 应用
  2. Asp.net 性能监控之压测接口“卡住” 分析
  3. PYTHON调用JENKINS的API来进行CI
  4. python3程序设计基础刘德山答案_Python 3 程序设计学习指导与习题解答
  5. 使用spring initialization创建SpringBoot项目
  6. 自定义简单控件之标题控件
  7. [洛谷P2463][SDOI2008]Sandy的卡片
  8. nodejs 做后台的一个完整业务整理
  9. 代码对比工具,我就用这5个
  10. c++使用librdkafka kerberos认证
  11. mysql5.7绿色版安装与卸载教程
  12. 用pe修改计算机ip地址,解决win7电脑禁止更改ip地址的具体步骤
  13. Chapter 12 IP Weighting and Marginal Structural Model
  14. 这些“黑话”只有PCB设计制造内行人才懂!附PCB术语及英文对照
  15. linux更改oracle所属组,Linux更改oracle用户组实验
  16. k8s集群搭建-1mater2node
  17. 【2549】壮志难酬
  18. -kdb debugging with verdi
  19. ITPUB老帖子:将查询结果连接成列表的几个方法
  20. NOI2019退役记

热门文章

  1. 史上最全的iOS面试题及答案
  2. 计算机数学英语考本的分数线,专接本考试数学英语的成绩没有过公共线还有没有被..._公共英语考试_帮考网...
  3. 二维码解码器Zbar+VS2012开发环境配置
  4. CMake是什么?有什么用?
  5. 最新postfix的main.cf配置参考
  6. ESD静电二极管的应用(红外温枪防护)
  7. 纸张折叠多少次能够和珠穆朗玛峰峰一样高
  8. 数据库~如何快速、准确选取候选码(候选键)?
  9. CubeMX STM32串口1DMA使用IDLE中断接收、串口2DMA接收DMX512信号(标准)
  10. Markdown 学习入门