Redis

使用Redis搭建电商秒杀系统

我的梦境 提交于 2020-12-17 00:41:58
背景 秒杀活动是绝大部分电商选择的低价促销、推广品牌的方式。不仅可以给平台带来用户量,还可以提高平台知名度。一个好的秒杀系统,可以提高平台系统的稳定性和公平性,获得更好的用户体验,提升平台的口碑,从而提升秒杀活动的最大价值。 本文讨论云数据库Redis版缓存设计高并发的秒杀系统。 秒杀的特征 秒杀活动对稀缺或者特价的商品进行定时定量售卖,吸引成大量的消费者进行抢购,但又只有少部分消费者可以下单成功。因此,秒杀活动将在较短时间内产生比平时大数十倍,上百倍的页面访问流量和下单请求流量。 秒杀活动可以分为3个阶段: 秒杀前:用户不断刷新商品详情页,页面请求达到瞬时峰值。 秒杀开始:用户点击秒杀按钮,下单请求达到瞬时峰值。 秒杀后:一部分成功下单的用户不断刷新订单或者产生退单操作,大部分用户继续刷新商品详情页等待退单机会。 消费者提交订单,一般做法是利用数据库的行级锁,只有抢到锁的请求可以进行库存查询和下单操作。但是在高并发的情况下,数据库无法承担如此大的请求,往往会使整个服务blocked,在消费者看来就是服务器宕机。 秒杀系统 秒杀系统的流量虽然很高,但是实际有效流量是十分有限的。利用系统的层次结构,在每个阶段提前校验,拦截无效流量,可以减少大量无效的流量涌入数据库。 利用浏览器缓存和CDN抗压静态页面流量 秒杀前,用户不断刷新商品详情页,造成大量的页面请求。所以

一个人竟然撸了一个网易云音乐云村

我与影子孤独终老i 提交于 2020-12-16 23:36:17
今天推荐的这个项目是「 netease-cloud-music-community 」,是一个参照网易云音乐云村做的小程序社区,后端技术栈为 Java,SpringBoot,MySQL,Redis,前端技术栈为 uni-app。 功能简介 微信登录,发文本动态,发图文动态,发视频动态,关注,转发,评论,点赞,收藏等等。 技术栈 后端:Java,SpringBoot,MyBatis,MySQL,Redis 前端:uni-app 开发环境 后端:IntelliJ IDEA 前端:HbuilderX,微信开发者工具,QQ 小程序开发者工具 项目运行 后端: 1、创建数据库,执行根目录中的 live.sql,并修改 artist 表中的微信 APPID 等配置 2、使用 IDEA 导入 live-backend-mp 项目,并通过 Modules 的方式导入 live-backend-common 项目 3、修改 application-dev 中的 MySQL,Redis,阿里云 OSS 配置 前端: 1、使用 Hbuilder 导入项目 2、修改 manifest.json 的 APPID 配置(微信小程序或 QQ 小程序) 3、修改 App.vue 中的 domain 配置(修改为后端项目的路径) 4、运行到微信小程序 开源项目作者: fanchaoo , 开源项目地址

spring集成redis spring-data-redis

隐身守侯 提交于 2020-12-16 23:31:57
spring-data-redis封装了redis的操作,很方便的在项目中使用redis 整合spring-data-redis非常简单,一共需要修改3个文件。1.pom.xml 2.application-context.xml 3.redis.properties 1.在pom中添加spring-data-redis和redis的依赖 <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-redis</artifactId> <version>1.8.4.RELEASE</version> </dependency> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.9.0</version> </dependency> 2.在spring配置文件中增加相关配置 ps:密码是可选的 <bean id="jedisConnFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" p:host-name="${redis.host}"

Spring Boot 集成Spring Data

夙愿已清 提交于 2020-12-16 23:31:39
参考文档: Reference 30.Working with NoSQL Technologies (使用NoSQL技术) Spring Data 提供额外的模块帮助你接入各种各样的NoSQL技术,有MongoDB,Neo4J,ElasticSearch,Solr,Redis,Gemfire,Cassandra,Couchbase 还有 LDAP。Spring Boot 为上面的中间件提供自动配置文件。你可以使用它们,但是必须自己配置。请参考Spring-Data相关文档 Spring Boot Data Reference 。 30.1 Redis ( Reference_2.0.3.RELEASE ) Redis 集群安装 参考:https://www.cnblogs.com/yuanermen/p/5717885.html Error 4 Ruby required >= 2.2.2 https://blog.csdn.net/lixwjava/article/details/50408070 1.New Features 这一节简要的介绍了各个在新版本特性和要注意的方面。(1.5>1.6>1.7>1.8>2.0新特性) Spring Data Redis 1.8中的新功能 < 5/6/7 略> Jedis更新到2.9 Lettuce更新到4.2(JDK 版本最低 1.8)

解锁Redis锁的正确姿势

北城以北 提交于 2020-12-16 16:04:04
redis是php的好朋友,在php写业务过程中,有时候会使用到锁的概念,同时只能有一个人可以操作某个行为。这个时候我们就要用到锁。锁的方式有好几种,php不能在内存中用锁,不能使用zookeeper加锁,使用数据库做锁又消耗比较大,这个时候我们一般会选用redis做锁机制。 setnx 锁在redis中最简单的数据结构就是string。最早的时候,上锁的操作一般使用setnx,这个命令是当:lock不存在的时候set一个val,或许你还会记得使用expire来增加锁的过期,解锁操作就是使用del命令,伪代码如下: 1if (Redis::setnx("my:lock", 1)) { 2 Redis::expire("my:lock", 10); 3 // ... do something 4 5 Redis::del("my:lock") 6} 这里其实是有问题的,问题就在于setnx和expire中间如果遇到crash等行为,可能这个lock就不会被释放了。于是进一步的优化方案可能是在lock中存储timestamp。判断timestamp的长短。 set 现在官方建议直接使用set来实现锁。我们可以使用set命令来替代setnx,就是下面这个样子 1if (Redis::set("my:lock", 1, "nx", "ex", 10)) { 2 ... do

python海量数据快速查询的技巧

十年热恋 提交于 2020-12-16 15:29:00
欢迎关注”生信修炼手册”! 在实际工作中,经常会遇到查询的任务,比如根据某些rs号,检索dbsnp数据库,提取这些snp位点的信息,对于这样的任务,最基本的操作方法是将数据库的内容存为字典,然后检索特定的key即可。 对于小文件而言,这样的操作编码简单,运行速度也比较满意,但是对于大型数据库而言,将数据库存为字典这个动作是非常耗费时间的,而且每次运行代码都要执行这样的操作,导致效率大大降低。想要改善这一状况,有以下两种解决办法 1. 对象序列化 对象序列化就是将python中的对象保存为二进制的字节流文件,与之相对的是反序列化, 从二进制文件中读取内容,重新解析为python对象。通过序列化,只需要读取一次数据库,然后将生存的字典对象保存为一个文件,后续在使用时,直接读取序列化产生的文件,就可以快速得到数据库对应的字典。 在python中,通过内置模块pickle进行序列化相关操作,用法如下 >>> import pickle >>> >>> data = { 1 : 'A' , 2 : 'B' , 3 : 'C' } # dump 进行序列化 >>> with open( 'out' , 'wb' ) as f: ... pickle.dump(data, f) ... >>> # load 进行反序列化 >>> with open( 'out' , 'rb' ) as f: .

写代码有这16个好习惯,可以减少80%非业务的bug

混江龙づ霸主 提交于 2020-12-16 15:28:00
前言 每一个好习惯都是一笔财富,本文整理了写代码的16个好习惯,每个都很经典,养成这些习惯,可以规避多数非业务的bug!希望对大家有帮助哈,谢谢阅读,加油哦~ github地址,感谢每颗star ❝ https://github.com/whx123/JavaHome ❞ 公众号: 「捡田螺的小男孩」 1. 修改完代码,记得自测一下 「改完代码,自测一下」 是每位程序员必备的基本素养。尤其不要抱有这种侥幸 「心理:我只是改了一个变量或者我只改了一行配置代码,不用自测了」 。改完代码,尽量要求自己都去测试一下哈,可以规避很多不必要bug的。 2. 方法入参尽量都检验 入参校验也是每个程序员必备的基本素养。你的方法处理, 「必须先校验参数」 。比如入参是否允许为空,入参长度是否符合你的预期长度。这个尽量养成习惯吧,很多 「低级bug」 都是 「不校验参数」 导致的。 ❝ 如果你的数据库字段设置为varchar(16),对方传了一个32位的字符串过来,你不校验参数, 「插入数据库直接异常」 了。 ❞ 3. 修改老接口的时候,思考接口的兼容性。 很多bug都是因为修改了对外老接口,但是却 「不做兼容导致」 的。关键这个问题多数是比较严重的,可能直接导致系统发版失败的。新手程序员很容易犯这个错误哦~ 所以,如果你的需求是在原来接口上修改,,尤其这个接口是对外提供服务的话,一定要考虑接口兼容

写代码有这16个好习惯,可以减少80%非业务的bug

99封情书 提交于 2020-12-16 15:27:30
前言 每一个好习惯都是一笔财富,本文整理了写代码的16个好习惯,每个都很经典,养成这些习惯,可以规避多数非业务的bug!希望对大家有帮助哈,谢谢阅读,加油哦~ 1. 修改完代码,记得自测一下 「改完代码,自测一下」 是每位程序员必备的基本素养。尤其不要抱有这种侥幸 「心理:我只是改了一个变量或者我只改了一行配置代码,不用自测了」 。改完代码,尽量要求自己都去测试一下哈,可以规避很多不必要bug的。 2. 方法入参尽量都检验 入参校验也是每个程序员必备的基本素养。你的方法处理, 「必须先校验参数」 。比如入参是否允许为空,入参长度是否符合你的预期长度。这个尽量养成习惯吧,很多 「低级bug」 都是 「不校验参数」 导致的。 ❝ 如果你的数据库字段设置为varchar(16),对方传了一个32位的字符串过来,你不校验参数, 「插入数据库直接异常」 了。 ❞ 3. 修改老接口的时候,思考接口的兼容性。 很多bug都是因为修改了对外老接口,但是却 「不做兼容导致」 的。关键这个问题多数是比较严重的,可能直接导致系统发版失败的。新手程序员很容易犯这个错误哦~ 所以,如果你的需求是在原来接口上修改,,尤其这个接口是对外提供服务的话,一定要考虑接口兼容。举个例子吧,比如dubbo接口,原本是只接收A,B参数,现在你加了一个参数C,就可以考虑这样处理。 //老接口 void oldService

2020年,阿里内推Java后端面试题,文末附面试福利。

穿精又带淫゛_ 提交于 2020-12-16 13:57:49
阿里一面题目: osi七层网络模型,五层网络模型,每次层分别有哪些协议 死锁产生的条件, 以及如何避免死锁,银行家算法,产生死锁后如何解决 如何判断链表有环 虚拟机类加载机制,双亲委派模型,以及为什么要实现双亲委派模型 虚拟机调优参数 拆箱装箱的原理 JVM垃圾回收算法 CMS G1 hashset和hashmap的区别,haspmap的底层实现put操作,扩容机制,currenthashmap如何解决线程安全,1.7版本以及1.8版本的不同 md5加密的原理 有多少种方法可以让线程阻塞,能说多少说多少 synchronized和reetrantlock锁 AQS同步器框架,countdowmlatch,cyclebarrier,semaphore,读写锁 阿里二面题目: B-Tree索引,myisam和innodb中索引的区别 BIO和NIO的应用场景 讲讲threadlocal 数据库隔离级别,每层级别分别用什么方法实现,三级封锁协议,共享锁排它锁,mvcc多版本并发控制协议,间隙锁 数据库索引?B+树?为什么要建索引?什么样的字段需要建索引,建索引的时候一般考虑什么?索引会不会使插入、删除作效率变低,怎么解决? 数据库表怎么设计的?数据库范式?设计的过程中需要注意什么? 共享锁与非共享锁、一个事务锁住了一条数据,另一个事务能查吗? Spring bean的生命周期

写代码有这16个好习惯,可以减少80%非业务的bug

梦想与她 提交于 2020-12-16 13:53:50
Python实战社群 Java实战社群 长按识别下方二维码, 按需求添加 扫码关注添加客服 进Python社群▲ 扫码关注添加客服 进Java社群 ▲ 作者丨捡田螺的小男孩 来源丨捡田螺的小男孩 前言 每一个好习惯都是一笔财富,本文整理了写代码的16个好习惯,每个都很经典,养成这些习惯,可以规避多数非业务的bug!希望对大家有帮助哈,谢谢阅读,加油哦~ github地址,感谢每颗star ❝ https://github.com/whx123/JavaHome ❞ 1. 修改完代码,记得自测一下 「改完代码,自测一下」 是每位程序员必备的基本素养。尤其不要抱有这种侥幸 「心理:我只是改了一个变量或者我只改了一行配置代码,不用自测了」 。改完代码,尽量要求自己都去测试一下哈,可以规避很多不必要bug的。 2. 方法入参尽量都检验 入参校验也是每个程序员必备的基本素养。你的方法处理, 「必须先校验参数」 。比如入参是否允许为空,入参长度是否符合你的预期长度。这个尽量养成习惯吧,很多 「低级bug」 都是 「不校验参数」 导致的。 ❝ 如果你的数据库字段设置为varchar(16),对方传了一个32位的字符串过来,你不校验参数, 「插入数据库直接异常」 了。 ❞ 3. 修改老接口的时候,思考接口的兼容性。 很多bug都是因为修改了对外老接口,但是却 「不做兼容导致」 的