-
import redis.clients.jedis.Jedis; /** * 2018/11/6 11:57 */ public class CountThread extends Thread { public static void main(String args[]) { MyThread thread1 = new MyThread(); thread1.setName("线程1"); MyThread thread2 = new MyThread(); thread2.setName("线程2"); Jedis jedis = new Jedis("localhost", 6379); jedis.del("myCounter");//每次初始删除key jedis.close(); thread1.start(); thread2.start(); //可以多设立几个线程,方便查看异常结果 } } class MyThread extends Thread { final int amountLimit = 100;//总库存量 String keyName = "myCounter";//redis key Name @Override public void run() { //每个线程执行7次 for (int i = 0; i < 7; i++) { v1(); } } //计数器v1 public void v1() { Jedis jedis = new Jedis("localhost", 6379); int incrAmount = 1;//每次incr大小 if (!jedis.exists(keyName)) { jedis.set(keyName, String.valueOf(95)); } int currentAmount = Integer.parseInt(jedis.get(keyName)); if (currentAmount + incrAmount > amountLimit) { System.out.println(Thread.currentThread() + "Bad luck!v1"); } else { jedis.incrBy(keyName, incrAmount); System.out.println(Thread.currentThread() + "Good Luck!v1"); } jedis.close(); } //计数器v2 public void v2() { Jedis jedis = new Jedis("localhost", 6379); int incrAmount = 1; if (!jedis.exists(keyName)) { jedis.setnx(keyName, String.valueOf(95)); } if (jedis.incrBy(keyName, incrAmount) > amountLimit) { jedis.decrBy(keyName, incrAmount);//超额回滚 System.out.println(Thread.currentThread() + "Bad luck!v2"); } else { System.out.println(Thread.currentThread() + "Good Luck!v2"); } jedis.close(); } }
有什么问题欢迎讨论
查看全部 -
set 设置值 exists 判断key是否存在 get 获取值 incr 增加/减少值 incrby 增加/减少指定数值 setnx 不存在才能设置key查看全部
-
PHP
课程介绍
> 认识Redis的本质:设计目标,应用场景
>理解Redis的工作模式
>认识Redis计数器
>如何用Redis计数器实现并发场景下的数量控制
查看全部 -
课程总结
Redis 的本质
Redis 的工作模式
用 Redis:实现计数器
用 Redis 计数器实现并发场景下的数量控制
查看全部 -
数量控制器 v2
查看全部 -
数量控制器 v1
并发场景:客户端 A、B 同时访问数量控制器
问题 1:
A 先执行 incrby,然后 B 执行 set,数据不一致
问题 2:
假定限量 100,A、B 同时读到当前数量为 99,A、B 执行完 incrby 后,总量为 101,超限了
查看全部 -
Redis 数量控制器
商品抢购。没控制住?库存不够了,成本失控
抽奖限量。没控制住?钱多花了
抢红包。
查看全部 -
Redis 计数器
频率控制:接口防刷,密码尝试次数限制。
数量统计:请求量统计。
数量控制:商品抢购,奖励额度控制。
查看全部 -
Redis 常用数据类型
STRING 字符串。整数型字符串
HASH 哈希。PHP 关联数组,Python 字典
LIST 列表。Python 元组
SET 集合。集合中的元素唯一
ZSET 有序集合。元素有分值,用于排序
Redis 的数据类型如此丰富,如果仅仅当作缓存来用,确实是“杀鸡焉用牛刀”。Memcache 更合适。
查看全部 -
Redis 优缺点
优点:无需处理并发问题,降低系统复杂度
缺点:不适合缓存大尺寸对象(超过 100KB)(为什么?)
查看全部 -
Redis 的工作模式
单进程 单进程 单进程(重要的事情说三遍!!!)
阻塞式
Redis 在同一时刻只能处理一个请求,后来的请求需要排队等待!
查看全部 -
Redis 与 Memcache 对比
Memcache 是内存对象缓存系统,设计目标为通过缓解数据库的压力来加快 web 应用的响应速度
Redis 应用场景更丰富,Memcache 仅适合作为缓存使用
查看全部 -
Redis 是什么
缓存
数据库
消息代理
查看全部 -
课程介绍
认识 Redis 的本质:设计目标,应用场景
理解 Redis 的工作模式
认识 Redis 计数器
如何用 Redis 计数器实现并发场景下的数量控制
查看全部 -
并发场景下数量控制
查看全部
举报