代码中调用 linux 命令批量删除指定redis缓存数据
来源:互联网 发布:java wait 参数 编辑:程序博客网 时间:2024/06/03 21:43
在业务中为了分类匹配key,如:
需要当月内要缓存的key:
登陆时的key:
等,需要处理分类批量删除key-value的集合。
适用定时任务定时调用linux服务器上的命令脚本,进行定时批量删除。
调用执行服务器上脚本的代码:
public class delRedisCacheCentUsers { private Logger logger = LoggerFactory.getLogger(delRedisCacheCentUsers.class); private static String addr; private static String username; private static String pwd; private static String shellPathByDay; private static String shellPathByMonth; /** * 删除 */ static{ Properties prop = new Properties(); try { String file = delRedisCacheCentUsers.class.getResource("/jedisPool_Tran.properties").getFile(); InputStream in = new BufferedInputStream(new FileInputStream(file)); prop.load(in); addr = prop.getProperty("REDIS.HOST"); username = prop.getProperty("REDIS.NAME"); pwd = prop.getProperty("REDIS.PWD"); shellPathByDay = prop.getProperty("shellPathByDay"); shellPathByMonth = prop.getProperty("shellPathByMonth");// System.out.println("===load "+addr+" "+username+" "+pwd); }catch (Exception e){ try { throw new Exception("== load redis prop fail!"); } catch (Exception e1) { e1.printStackTrace(); } } } /** * 日定时任务,删除当日缓存 */ public void delCurrentDayCacheUsersByDay(){ JedisPooler jedisPooler = null; Jedis jedis = null; try{ jedisPooler = RedisPoolerFactory.getJedisPooler(); jedis = jedisPooler.getJedis(); /** * 删除缓存的用户对应的积分行为和次数 */ RemoteShellTool tool = new RemoteShellTool(addr, username, pwd, "utf-8"); String result = tool.exec(shellPathByDay);// System.out.println("==result: "+result); //删除日上线 /usr/bin/redis-cli keys "day_userCentOpers|*" | xargs -i /usr/bin/redis-cli del {} if (result.toLowerCase().contains("success")){ logger.info("===[DEL USERS SUCCESS]!"); }else{ logger.error("===[DEL USERS FAIL]!"); } }catch(Exception e){ e.printStackTrace(); }finally { if (jedis != null){ jedisPooler.returnResource(jedis); } } } /** * 月定时任务,删除当月缓存 */ public void delCurrentDayCacheUsersByMonth(){ JedisPooler jedisPooler = null; Jedis jedis = null; try{ jedisPooler = RedisPoolerFactory.getJedisPooler(); jedis = jedisPooler.getJedis(); /** * 删除缓存的用户对应的积分行为和次数 */ RemoteShellTool tool = new RemoteShellTool(addr, username, pwd, "utf-8"); String result = tool.exec(shellPathByMonth);// System.out.println("==result: "+result); //删除日上线 /usr/bin/redis-cli keys "day_userCentOpers|*" | xargs -i /usr/bin/redis-cli del {} if (result.toLowerCase().contains("success")){ logger.info("===[DEL USERS SUCCESS BY MONTH]!"); }else{ logger.error("===[DEL MONTH USERS FAIL]!"); } }catch(Exception e){ e.printStackTrace(); }finally { if (jedis != null){ jedisPooler.returnResource(jedis); } } }}
在redis的配置文件redis.properties中顺便定义了脚本路径:
shellPathByDay=/usr/local/sbin/delRedisCacheUsersByDay.shshellPathByMonth=/usr/local/sbin/delRedisCacheUsersByMonth.sh
对应脚本命令:
delRedisCacheUsersByDay.sh://删除以 'day_userCentOpers| '为前缀的key-value/usr/bin/redis-cli keys "day_userCentOpers|*" | xargs -i /usr/bin/redis-cli del {}//删除以 'month_userCentOpers| '为前缀的key-valuedelRedisCacheUsersByMonth.sh:/usr/bin/redis-cli keys "month_userCentOpers|*" | xargs -i /usr/bin/redis-cli del {}
这里是定时任务的xml文件,实现调用操作方法:
<!--定时任务1--> <!-- 每天12点将当天用户积分行为缓存清掉 --> <bean id="deleteRedisCacheDayUsersJob" class="cn.qtone.xxt.cent.quartz.delRedisCacheCentUsers" /> <bean id="deleteRedisCacheDayUsersTask" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <property name="targetObject" ref="deleteRedisCacheDayUsersJob" /> <property name="targetMethod" value="delCurrentDayCacheUsersByDay" /><!-- 定时执行 doItem 方法 --> <property name="concurrent" value="false" /> </bean> <bean id="deleteRedisCacheDayUsersTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean"> <property name="jobDetail" ref="deleteRedisCacheDayUsersTask" /> <property name="cronExpression" value="59 59 23 * * ?" /><!-- 每天凌晨23:59:59 点执行 --> <!--<property name="cronExpression" value="0 */1 * * * ?" /><!– 每隔1min执行一次 –>--> </bean> <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="triggers"> <list> <ref bean="deleteRedisCacheDayUsersTrigger" /> <ref bean="deleteRedisCacheMonthUsersTrigger" /> <!--暂时不用--> <!--<ref bean="centUpdateByMonthTrigger" />--> </list> </property> </bean>
远程调用shell脚本类:
import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.nio.charset.Charset;import ch.ethz.ssh2.Connection;import ch.ethz.ssh2.Session;/** * 远程调用服务器上shell脚本 * Created with CentSystem */public class RemoteShellTool { private Connection conn; private String ipAddr; private String charset = Charset.defaultCharset().toString(); private String userName; private String password; public RemoteShellTool(String ipAddr, String userName, String password, String charset) { this.ipAddr = ipAddr; this.userName = userName; this.password = password; if (charset != null) { this.charset = charset; } } public boolean login() throws IOException { conn = new Connection(ipAddr); conn.connect(); // 连接 return conn.authenticateWithPassword(userName, password); // 认证 } public String exec(String cmds) { InputStream in = null; String result = ""; try { if (this.login()) { Session session = conn.openSession(); // 打开一个会话 session.execCommand(cmds); in = session.getStdout(); result = this.processStdout(in, this.charset); session.close(); conn.close(); } } catch (IOException e1) { e1.printStackTrace(); } return result; } public String processStdout(InputStream in, String charset) { byte[] buf = new byte[1024]; StringBuffer sb = new StringBuffer(); try { while (in.read(buf) != -1) { sb.append(new String(buf, charset)); } } catch (IOException e) { e.printStackTrace(); } return sb.toString(); } /** * @param args */ public static void main(String[] args) { RemoteShellTool tool = new RemoteShellTool("192.168.120.XXX", "ubuntu", "xxxxx", "utf-8"); String result = tool.exec("/usr/local/sbin/xxx.sh"); System.out.print("===result:"+result); }
0 0
- 代码中调用 linux 命令批量删除指定redis缓存数据
- redis批量删除数据
- Linux中批量删除redis中的key
- Redis -- 通过代码批量删除
- redis批量删除指定的key
- 批量删除Redis中hash map的指定pattern的key
- Linux批量删除文件命令
- linux VI批量删除指定字符串
- Linux 批量删除指定后缀的文件
- linux 批量删除指定类型文件
- Linux指定文件删除命令
- Oracle中批量删除数据
- Oracle中批量删除数据
- Oracle中批量删除数据
- Oracle中批量删除数据
- django中批量删除数据
- Oracle中批量删除数据
- redis cluster 模式如何批量删除指定前缀的key
- JAVA int 强制类型转换错误提示(Cannot cast from Object to int)
- javascript内建对象String,Array,Math,Date()
- QT多语言
- HTML笔记(CSS格式排版)
- Go语言圣经(中文版)读书笔记(一)
- 代码中调用 linux 命令批量删除指定redis缓存数据
- Set,List,Map(一)(Java面试)
- ios9模拟器上下出现黑边
- JAVA传入实体返回实体工具
- Android接入支付宝支付服务
- android小项目 连接PHP开发的服务端
- Android ScrollView监听值判断在底部还是顶部
- 使用Markdown设置文档样式,生成html文件
- C语言的指针