- 博客(31)
- 收藏
- 关注
原创 python中redis incr的使用
在一些项目中,有时候需要记录一些数字,比如需要知道每天微信推送了多少条模板消息或者其他的一些需求,或者一个功能:用户扫码当天达到20次即不再让用户扫码,或者秒杀活动中,这件商品只规定卖200件,如果我们使用数据库来作为查询,那么并发量特别大,db就会抗不住,我们就需要用中间件来削峰,并且配合redis, 当然,我们的电商项目肯定没有那么大,并发量也不会那么大,为了避免超卖,我们使用mysql中的乐观锁也可以,但是为了更快,我们就可以使用redis中的incr来提高效率为什么可以使用redis中的incr.
2021-05-31 16:04:41 2718
原创 java中的方法引用
通过对象名引用成员方法public class MethodRerObject { //定义一个成员方法,传递字符串,把字符串按照大写输出 public void printUpperCaseString(String str){ System.out.println(str.toUpperCase()); }}/* 定义一个打印的函数式接口 */@FunctionalInterfacepublic interface Printable .
2021-05-29 18:37:10 1312
原创 java中的steam流
当需要对多个元素进行操作(特别是多步操作)的时候,考虑到性能及便利性,我们应该首先拼好一个"模型"步骤方案,然后再按照方案去执行它 这张图展示了过滤 映射 跳过 计数等多步操作,这是一种集合元素的处理方案,而方案就是一种"函数模型",图中的每一个方框都是一个“流”,调用指定的方法,可以从一个流模型转换为另一个模型流,而最右侧的数字3是最终结果。 这里的filter map skip都是在对函数模型进行操作,集合元素并没有真正被处理,只有当终结方法count执行的时候,整个模型才会按照指定策略执
2021-05-29 18:12:26 2316 1
原创 java中函数式调用Function
import java.util.function.Function;/* java.util.function.Function<T,R>接口用来根据一个类型的数据得到另一个类型的数据, 前者称为前置条件,后者称为后置条件。 Function接口中最主要的抽象方法为:R apply(T t),根据类型T的参数获取类型R的结果。 使用的场景例如:将String类型转换为Integer类型。 */public class Demo01Func
2021-05-29 16:49:31 1969
原创 java中函数式调用Predicate
import java.util.function.Predicate;/* java.util.function.Predicate<T>接口 作用:对某种数据类型的数据进行判断,结果返回一个boolean值 Predicate接口中包含一个抽象方法: boolean test(T t):用来对指定数据类型数据进行判断的方法 结果: 符合条件,返回true 不符
2021-05-29 16:43:36 1042
原创 java函数式调用Consumer
import java.util.function.Consumer;/* java.util.function.Consumer<T>接口则正好与Supplier接口相反, 它不是生产一个数据,而是消费一个数据,其数据类型由泛型决定。 Consumer接口中包含抽象方法void accept(T t),意为消费一个指定泛型的数据。 Consumer接口是一个消费型接口,泛型执行什么类型,就可以使用accept方法消费什么类型的数据 至于具体怎么
2021-05-29 16:14:35 581
原创 java中函数式调用Supplier
import java.util.function.Supplier;/* 常用的函数式接口 java.util.function.Supplier<T>接口仅包含一个无参的方法:T get()。用来获取一个泛型参数指定类型的对象数据。 Supplier<T>接口被称之为生产型接口,指定接口的泛型是什么类型,那么接口中的get方法就会生产什么类型的数据 */public class Demo01Supplier { //定义一个方法,方法的参
2021-05-29 16:03:02 873
原创 java中函数式Comparator排序
package com.itheima.demo03.LambdaTest;import java.util.Arrays;import java.util.Comparator;/* 如果一个方法的返回值类型是一个函数式接口,那么就可以直接返回一个Lambda表达式。 当需要通过一个方法来获取一个java.util.Comparator接口类型的对象作为排序器时,就可以调该方法获取。 */public class Demo02Comparator { //定义一个方法
2021-05-29 15:55:09 317
原创 java的序列化流
import java.io.Serializable;public class Person implements Serializable{ // 声明id,防止序列化后再反序列化发现id不一致报错 private static final long serialVersionUID = 1L; private String name; //private static int age; 静态变量不能反序列化 //private transient int a
2021-05-29 13:22:15 169
原创 java中的缓冲流和转换流
// 字符缓冲流 和 redis中的管道非常像,就是将数据都放到一个缓冲的地方(redis中称为管道),然后最后一起执行操作import java.io.*;public class Demo33Class { public static void main(String[] args) throws IOException { // 1. 定义写缓冲字符流 BufferedWriter bw = new BufferedWriter(new FileWr
2021-05-29 13:09:26 133
原创 java中的I/O基本操作
// 字节流, 没有字符流兼容性强,中文容易乱码import java.io.*;import java.util.Properties;import java.util.Set;public class Demo32Class{ public static void main(String[] args) throws IOException { // 1. 定义写字节流 append表示追加写 FileOutputStream fos = new
2021-05-29 08:40:35 77
原创 java中对文件的操作
// file操作文件import java.io.File;import java.io.IOException;public class Demo31Class { public static void main(String[] args) { // ; System.out.println(File.pathSeparator); // \ System.out.println(File.separator);
2021-05-28 14:51:02 67
原创 java函数式编程和lambda匿名函数
lambda的语法非常简介,完全没有面向对象复杂的约束, 但是使用时有几个问题需要特别注意;使用lambda必须具有接口,且要求接口中有且只有一个抽象方法无论是jdk内置Runnable Comparator接口还是自定义的接口,只有当接口的抽象方法存在且唯一时,才可以使用Lambda使用Lambda必须具有上下文推断也就是方法的参数或局部变量类型必须为lambda对应的接口类型,才能使用lambda作为该接口的实例有且仅有一个抽象方法的接口,叫做函数式接口// 函数式编程, lambda匿名函
2021-05-28 10:35:15 135
原创 java线程之间的通信
// 线程之间的通信,类似与订阅者和消费者之间的关系,比如一个线程生产包子,另一个线程用来吃包子// 线程之间的通信,前提: 同一个对象中线程的通信public class Demo28Class extends Thread { public static void main(String[] args) { Object obj1 = new Object(); // 使用匿名类生成第一个对象(顾客) new Thread(){
2021-05-27 15:24:37 98
原创 java线程池
创建线程池的第一种方法:/*使用线程池的好处:1. 降低资源的消耗。线程本身是一种资源,创建和销毁线程会有CPU开销;创建的线程也会占用一定的内存。2. 提高任务执行的响应速度。任务执行时,可以不必等到线程创建完之后再执行。3. 提高线程的可管理性。线程不能无限制地创建,需要进行统一的分配、调优和监控。使用线程池的坏处:1. 频繁的线程创建和销毁会占用更多的CPU和内存2. 频繁的线程创建和销毁会对GC产生比较大的压力3. 线程太多,线程切换带来的开销将不可忽视4. 线程太少,多核C.
2021-05-27 13:59:05 54
原创 java多线程资源竞争
先看一下java多线程资源竞争的案例/* 当多个线程访问同一个变量时,这个变量被称为共享变量,而当多个线程操作同一个变量时,就会出现资源竞争的问题,* 举例, 有个变量num为100, 每个线程对其的操作就是减去1(想想一下卖票系统,100个票,有三个售票员[三个线程]),有一个* 在cpu哪里累死累活抢到了使用权,拿到了100,还没来的及去减1, 完了,cpu被第二只线程抢了过去,一看num还是100,然后执行了100-1* num就这样变为了99,这时第一个cpu终于抢到了cpu的使用权.
2021-05-27 11:19:15 1156 1
原创 java匿名多线程
实现代码:// 并发:就是交替执行, python中一般叫串行, 也就是多线程的执行方式// 并行:就是各执行个的,互不干扰,就是多进程的执行方式// 匿名多线程 java中的多线程是抢占式调用,而不是这个线程执行一个,下一个就是另外一个线程来执行,而是// 进程会随机选择一个线程当做"亲"儿子,让他多执行一会public class Demo24Class { public static void main(String[] args) { // Thread匿名多线
2021-05-26 10:52:04 1148
原创 java实现多线程
java实现多线程有两种方法Thread和RunnableThread实现代码实现类Demo19Class代码:// 多线程用法一public class Demo19Class extends Thread { @Override public void run() { // 打印子线程的名字 1 String stringName1 = getName(); System.out.println(stringName1);.
2021-05-26 10:27:40 313 1
原创 java中的自动拆箱和装箱
自动拆箱和自动装箱(包装类和数据类型)// 将int变为包装类(这里隐含了自动装箱) System.out.println("==========装箱"); Integer num1 = 99; // 装箱 Integer num2 = Integer.valueOf(100); System.out.println(num1); System.out.println(num2); // 将包
2021-05-25 10:47:20 69
原创 java中的异常捕捉
java中的异常捕捉和python的很相似,catch里面的错误一般都会写到日志中,而不是程序因为一些意外原因报错而让其停止运行,而是捕捉到放到日志中去查询// 什么是包装类: 一些变量原来没有对应的方法来操作他们,所以要搞一些方法来操作他们,而管理这些方法的类叫做包装类import java.lang.reflect.Array;import java.util.*;public class Demo14Class { public static void main(String[]
2021-05-25 10:24:31 209
原创 java中hashmap遍历
java中hashmap遍历有两种方法,第一种就是将所有的key放到set中,然后通过遍历set通过key来获取value,可以选择使用迭代器遍历也可以使用增强for来遍历,第二种可以使用entryset来循环,推荐使用entryset,因为entry里面放的是key和value,所以效率更快// hashmap操作(key value, key不可以重复, 无序)key 经过hash加密,并且equal对比来确定其内存地址 System.out.println("hashmap操作===
2021-05-25 10:09:38 3630
原创 python中的继承
在Java中是不支持多继承的,但是在python中是可以多继承的,但是多继承中,python2中如果是经典类则是深度优先,新式类是广度优先,但是在python3中则是舍弃了这两种继承方式,而是采用C3算法,那么C3算法的主要是依靠merge,那么根据代码来看看merge如何实现的class SSClass(object): def __init__(self): print('我是最高级父类初始化') def my_func(self): print(.
2021-05-20 12:09:35 96
原创 python操作鼠标进行点击
python中的pyautogui库可以操作鼠标安装:pip install pyautoguiimport timeimport pyautoguidef click_operation(): """点击操作""" for i in range(3): # 鼠标需要移动到的位置 x, y = 1396, 850 # 将鼠标移动到指定坐标的间隔时间 num_seconds = 2 # 延迟2秒
2021-05-11 11:54:31 13378 1
原创 mysql索引回表
回表定义:先索引扫描,再通过ID去取索引中未能提供的数据,即为回表。假如有个表T, 里面三个字段:id k name, 其中对k建立了索引如果语句是 select * from T where id=500,即主键查询方式(聚集索引),则只需要搜索 ID 这棵 B+ 树,查询一表即可如果语句是 select id, k from T where k=5,即普通索引查询方式,则只要搜索 k 索引树,这样的话查询一表即可。如果语句是 select id, k , name from T
2021-05-10 12:08:51 2763
原创 数据库设计的三大范式
什么是范式:简言之就是,数据库设计对数据的存储性能,还有开发人员对数据的操作都有莫大的关系.所以建立科学的,规范的的数据库是需要满足一些.范式的规范说法:第一范式 – 每表中的字段不可再分割第二范式 – 要有主键,并且其他字段依赖于主键(方便唯一确定数据行,并定位其他字段)第三范式 – 在二范式的基础上,消除传递依赖,各种信息只在一个地方存储,不出现在多张表中。比如学生信息表的学号为主键,此时要查看他所在的系信息,那么不能直接将系信息存储在学生信息表中,因为系信息已经在系别管理表中,此时只能在学生
2021-05-10 11:42:57 193
转载 设计模式的六大原则
1. 单一职责原则(Single Responsibility Principle,简称SRP ) 1 核心思想:应该有且仅有一个原因引起类的变更 2 问题描述:假如有类Class1完成职责T1,T2,当职责T1或T2有变更需要修改时,有可能影响到该类的另外一个职责正常工作。 3 好处:类的复杂度降低、可读性提高、可维护性提高、扩展性提高、降低了变更引起的风险。 4 需注意:单一职责原则提出了一个编写程序的标准,用“职责”或“变化原因”来衡量接口或类设计得是否优良,但是“职责”和“变化原因”都是不可
2021-05-10 11:13:38 80
原创 django使用装饰器来验证权限
在django项目中,我们需要验证权限等,使用django封装的不能够准确的提醒用户是缺少什么权限,所以我们就可以使用装饰器在视图上来进行权限管理装饰器的原理:闭包,在函数内部定义一个函数,并且这个函数用到了外部函数的变量,那么将这个函数以及用到的变量称之为闭包视图代码:from django.utils.decorators import method_decoratorfrom users.decorator import set_func, DecoratorClass# @meth.
2021-05-09 10:31:07 994
原创 rabbitmq在python中实现延时队列(库存回滚)
RabbitMQ延时队列实现1.1 消息的TTL消息的TTL(Time To Live)就是消息的存活时间,单位是毫秒 RabbitMQ 可以对队列和消息分别设置TTL对队列设置就是队列没有消费者连着的保留时间,也可以对每一个单独的消息做单独的设置。超过了这个时间,我们认为这个消息就是死了,称之为死信如果队列设置了,消息也设置了,那么会取小的。所以一个消息如果被路由到不同的队列中,这个消息死亡的时间有可能不一样(不同的队列设置)。这里单讲单个消息的TTL,因为它才是实现延迟任务的关键。可以通过设..
2021-05-07 15:15:44 635
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人