并发下,使用redis防止数据重复插入(数据库未对表字段设置唯一情况下)

@Controller
@RequestMapping("/myTest")
public class TestController {

    @Autowired(required = false)
    private TestService testService;
    
    @Autowired
    private RedisUtil redisUtil;

    @RequestMapping("add")
    public void add(HttpServletRequest request) throws Exception {
        List<Course> cList = testService.queryByName("aaaaa");//查询
        System.out.println(Thread.currentThread().getName()+"clist.size:"+cList.size());
        if(cList.size() == 0){
            if(redisUtil.setnx("name_"+"aaaaa", "aaaaa") == 1){//如果数据存在则返回0,不存在返回1
                Course course = new Course();
                course.setCname("aaaaa");
                try{
                    testService.add1(course);//插入
                }catch (Exception e) {
                    redisUtil.del("name_"+"aaaaa");//插入出异常则删除
                    throw e;
                }
                System.out.println(Thread.currentThread().getName()+"success");
                redisUtil.expire("name_"+"aaaaa", 3);//设失效时间3秒
            }else{
                System.out.println(Thread.currentThread().getName()+"exists");
            }
        }else{
            System.out.println(Thread.currentThread().getName()+"false");
        }
    }

}

RedisUtil 工具类可以网上搜

以下测试代码:

public class Test {

    /**
     * @param args
     * @throws IOException 
     * @throws HttpException 
     */
    public static void main(String[] args) throws Exception {
        for(int i=0;i<10;i++){
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            new Thread(new Runnable() {
                @Override
                public void run() {
                    // TODO Auto-generated method stub
                    post();
                }
            }).start();
        }
    }
    
    public static void post(){
        HttpClient client = new HttpClient();
        client.getParams().setContentCharset("UTF-8");
        PostMethod method = new PostMethod("http://localhost:8080/practice/myTest/add.do?time="+new Date().getTime());
        method.setRequestHeader("ContentType","application/x-www-form-urlencoded;charset=UTF-8");
        try {
            client.executeMethod(method);
        } catch (HttpException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}
时间: 2024-11-08 15:01:32

并发下,使用redis防止数据重复插入(数据库未对表字段设置唯一情况下)的相关文章

我也来学着写写WINDOWS服务-解析xml抓取数据并插入数据库

项目告一段落,快到一年时间开发了两个系统,一个客户已经在试用,一个进入客户测试阶段,中间突然被项目经理(更喜欢叫他W工)分派一个每隔两小时用windows服务去抓取客户提供的外网xml,解析该xml,然后将截取的节点字段值插入到已经建好相应结构的表中.并记录日志. xml结构概要如下: <?xml version="1.0" encoding="UTF-8"?> <list> <info> <id>93ef7c7ccc

使用SqlBulkCopy将DataTable中的数据批量插入数据库中

#region 使用SqlBulkCopy将DataTable中的数据批量插入数据库中 /// <summary> /// 注意:DataTable中的列需要与数据库表中的列完全一致. /// </summary> /// <param name="conStr">数据库连接串</param> /// <param name="strTableName">数据库中对应的表名</param> //

[VS] - &quot;包含了重复的“Content”项。.NET SDK 默认情况下包括你项目中的“Content”项。&quot; 之解决

背景 VS 2017 升级至  VS 2017 v15.3 后,.Net Core 1.1 应用编译报错: Error: 包含了重复的"Content"项..NET SDK 默认情况下包括你项目中的"Content"项.可以从项目文件中删除这些项,或者如果希望将其显示包含在项目文件中,则可以将"EnableDefaultContentItems"属性设置为"false". Error : Duplicate 'Content'

ftp读取txt数据并插入数据库

去官网下载http://enterprisedt.com/ .netftp组件 目前最新版本为2.2.3,下载后在bin目录中找到edtFTPnet.dll,在项目中添加引用. using EnterpriseDT.Net.Ftp; public partial class test_ftp : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) {         if (!IsPostBack)

asp.net并发请求导致的数据重复插入问题

前段时间工作中,有客户反应了系统中某类待办重复出现两次的情况.我核实了数据之后,分析认为是并发请求下导致的数据不一致性问题,并做了重现.其实这并不是一个需要频繁调用的功能,但是客户连续点击了两次,导致出现了并发问题.除了前端优化,这里重点探讨后台方面代码层面的处理,最终解决问题. 一.情景分析 Asp.net程序部署Web服务,是多主线程并发执行的,当多个用户请求进入同一个后台函数时,后进入的请求有可能会获取到非最新状态的数据. 结合我遇到的实际情况举个例子,假设后台函数Func1,先读取表Ta

Nginx反向代理因proxy_next_upstream导致数据重复插入问题

环境:前面采用Nginx做负载均衡,后接2台Web服务器缘由:系统经常出现给用户多次结算收益原因:因结算系统高峰时存在处理缓慢,在结算的时候处理时间长,导致超过了proxy_connect_timeout 30;proxy_send_timeout 30;proxy_read_timeout 60;三个时间,同时还设置了proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_404;保证服务

大数据批量插入数据库使用(SqlBulkCopy )效率更高

SqlBulkCopy类是System.Data.SqlClient下的类,我们开发中不常用,甚至不知道有这么一个类的存在,但确实比sql插入,事务批量插入,sql批量拼接插入快很多,比调用存储过程插入方便 下面是它的用法: public static bool ExecuteTransactionScopeInsert(DataTable dt, int batchSize) { int count = dt.Rows.Count; string tableName = "TestTable&

大数据批量插入数据库

public void ExecuteBuklCopy(DataTable dt) { SqlConnection conn = new SqlConnection(connectionString ); if (dt == null || dt.Rows.Count <= 0 || String.IsNullOrEmpty ( dt.TableName ) ) { return; } if (conn.State != ConnectionState.Open) { conn.Open();

同一对象多条数据同时插入数据库

执行插入的存储过程 ALTER PROC [dbo].[proc_Products_InfoUpdate] @FminAmount VARCHAR(MAX), @FmaxAmount VARCHAR(MAX), @FrateFloating VARCHAR(MAX) AS INSERT INTO dbo.Rate_Floating(bakProcId,minAmount,maxAmount,rateFloating) SELECT @id,A.istr,B.istr,C.istr  from d