Redis Util实现

package test.jedis;

import java.util.List;
import java.util.Set; import redis.clients.jedis.Jedis;
import redis.clients.jedis.Transaction; public class JedisUtil {
public static Jedis redis = new Jedis("localhost", 6379);// 连接redis static{
//初始化购物数据
redis.set("buy:number:1", "10000");
} /**
* 执行事务的过程其他客户端改变了其中的key值,解决数据一致性问题
* 通过watch 对key的监控来实现其他客户端修改数据后,事务取消
* 用法 首先用watch 开始对key的监控 在开启事务,顺序一定要先监控在执行事务
* */
public synchronized static String buy_trans(String userId) throws InterruptedException{
//1、通过对keys 的设计保证 每个用户只能购买一个
if(!redis.exists(userId)){ //2、当数量不购时提示 秒杀完
if(Integer.parseInt(redis.get("buy:number:1"))>0){ //3、redis 事务 监控数量的变化key=buy:number:1 监控1号商品的数量变化
redis.watch("buy:number:1"); //4、开启事务
Transaction tx = redis.multi(); //5、购买用户购买 成功 成功购买
tx.incr(userId); //6、设置数量减1
tx.decr("buy:number:1"); //7、执行事务
List<Object> results = tx.exec(); }else{
return "数量不足";
}
redis.disconnect();
return "抢购购买成功";
}else{
return "该用户已经购买了";
}
} public static Set<String> getKeys(String keys){
return redis.keys(keys);
} }

  Controller 端实现

package com.sf.fs.view;

import java.util.Set;

import javax.servlet.http.HttpServletRequest;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping; import com.sf.fs.service.SeckillService; /**
* seckill test
* */
@Controller
public class SeckillController { private SeckillService seckillService; public void setSeckillService(SeckillService seckillService) {
this.seckillService = seckillService;
} /**
* 抢购方法
* */
@RequestMapping("/buying")
public String buying(HttpServletRequest req){ //测试用于方便测试用sessionid 作为用户id
String sessionId=req.getSession().getId(); //存储的key 是 user:sessionId
String msg=seckillService.buying("user:"+sessionId);
System.out.println("返回的操作结果:"+msg);
return "succeed";
} /**
* 测试成功抢购的用户数,是否会出现超卖
* */
@RequestMapping("/result")
public void getResult(HttpServletRequest req){
Set<String> sets=seckillService.getUsers("user:*");
System.out.println("成功秒杀到的用户数:"+sets.size());
}
}

  Service 实现

package com.sf.fs.service.impl;

import java.util.List;
import java.util.Set; import com.sf.fs.service.SeckillService; import test.jedis.JedisUtil; public class SeckillServiceImpl implements SeckillService { public static int number=100; private JedisUtil jedisUtil; public void setJedisUtil(JedisUtil jedisUtil) {
this.jedisUtil = jedisUtil;
} @Override
public String buying(String key) { try {
return jedisUtil.buy_trans(key);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return "操作失败";
} public Set<String> getUsers(String prefixKey){ return jedisUtil.getKeys(prefixKey);
} }

  

Redis-秒杀场景应用的更多相关文章

  1. 【转载】秒杀场景下MySQL的低效原因和改进以及Redis的处理

    分享的PPT在如下网址: http://www.doc88.com/p-4199037770087.html 秒杀场景下mysql的低效原因和改进 另外有一个篇文章是针对以上内容的总结: http:/ ...

  2. 重学 Java 设计模式:实战享元模式「基于Redis秒杀,提供活动与库存信息查询场景」

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 程序员‍‍的上下文是什么? 很多时候一大部分编程开发的人员都只是关注于功能的实现,只 ...

  3. 秒杀场景下MySQL的低效(转)

    秒杀场景下MySQL的低效 2016-01-14 17:12 178人阅读 评论(0) 收藏 举报 最近业务试水电商,接了一个秒杀的活.之前经常看到淘宝的同行们讨论秒杀,讨论电商,这次终于轮到我们自己 ...

  4. Redis应用场景-转载

    1.  MySql+Memcached架构的问题 实际MySQL是适合进行海量数据存储的,通过Memcached将热点数据加载到cache,加速访问,很多公司都曾经使用过这样的架构,但随着业务数据量的 ...

  5. Redis应用场景(转)

    (来源:http://www.cnblogs.com/shanyou/archive/2012/09/04/2670972.html) Redis常用数据类型 Redis最为常用的数据类型主要有以下五 ...

  6. redis(二)Redis适用场景,如何正确的使用

    网络IO模型 Memcached是多线程,非阻塞IO复用的网络模型,分为监听主线程和worker子线程,监听线程监听网络连接,接受请求后,将连接描述字pipe 传递给worker线程,进行读写IO, ...

  7. redis使用场景

    Redis应用场景   Redis开创了一种新的数据存储思路,使用Redis,我们不用在面对功能单调的数据库时,把精力放在如何把大象放进冰箱这样的问题上,而是利用Redis灵活多变的数据结构和数据操作 ...

  8. <转>Redis 应用场景

    http://blog.csdn.net/hguisu/article/details/8836819 1.  MySql+Memcached 架构的问题 Memcached采用客户端-服务器的架构, ...

  9. Redis作者谈Redis应用场景

    Redis作者谈Redis应用场景 毫无疑问,Redis开创了一种新的数据存储思路,使用Redis,我们不用在面对功能单调的数据库时,把精力放在如何把大象放进冰箱这样的问题上,而是利用Redis灵活多 ...

  10. Redis应用场景 及其数据对象 string hash list set sortedset

    原文地址:http://www.cnblogs.com/shanyou/archive/2012/09/04/2670972.html Redis开创了一种新的数据存储思路,使用Redis,我们不用在 ...

随机推荐

  1. HTML-Canvas02

    文字对齐方式 : 水平对齐 //是用 textAlign 属性设置水平对齐方式(默认坐标点) ctx.textAlign = "start"; ctx.font = "3 ...

  2. js:语言精髓笔记1--标识符与基本类型

    标识符: 命名: 语法以及类型----语法关键字                                           //逻辑 值(的存储位置)----变量和常量           ...

  3. POJ2553 The Bottom of a Graph(强连通分量+缩点)

    题目是问,一个有向图有多少个点v满足∀w∈V:(v→w)⇒(w→v). 把图的强连通分量缩点,那么答案显然就是所有出度为0的点. 用Tarjan找强连通分量: #include<cstdio&g ...

  4. LightOJ1044 Palindrome Partitioning(区间DP+线性DP)

    问题问的是最少可以把一个字符串分成几段,使每段都是回文串. 一开始想直接区间DP,dp[i][j]表示子串[i,j]的答案,不过字符串长度1000,100W个状态,一个状态从多个状态转移来的,转移的时 ...

  5. BZOJ2739 : 最远点

    把环倍长,设$w(i,j)$表示对于$i$,决策$j$的价值,如果$j$在$[i,i+n]$,那么$w(i,j)=dis(i,j)$,否则$w(i,j)=-dis(i,j)$. 则$w$满足四边形不等 ...

  6. BZOJ2883 : gss2加强版

    首先离散化颜色 设pre[x]表示与x颜色相同的点上一次出现的位置,对于每种颜色开一个set维护 修改时需要修改x.x修改前的后继.x修改后的后继 询问[l,r]等价于询问[l,r]内pre[x]&l ...

  7. DataTable.Compute方法使用实例

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.D ...

  8. redis_查找命令

    1:文件名查找 find -name "filename" filename可以用通配符 2:文件内行数查找 在vi模式下 ,刚进入vi 输入:128(linenum)   即能跳 ...

  9. JBPM表达业务流程(流程定义语言)

    业务流程包括三部分: 活动 Activity / 节点 Node (有很多种,不同的类型有不同的功能,必须要有一个Start Activity) 连线 Transition / 转移 (从一个Acti ...

  10. ArcEngine开发异常:无当前记录

    使用 IFeatureWorkspace.CreateFeatureClass() 方法,出现异常:无当前记录 百度/谷歌没有找到合适的解决之道. 而是用IFeatureWorkspace.Creat ...