学到哪,总结到哪之数据库章节

这段时间开始重新接触后端的springboot
大体总结一下几个点

  1. 首先总结Jedis+Redis的配置和使用
  2. sql语句区分以及用法
  3. 各种零碎生成及原理

Jedis+redis

首先了解一下jedis和Redis

Jedis:即java操作Redis的一种集成工具,方便在java中操作Redis。
Redis:是完全开源免费的一个高性能的key-value数据库,基于内存的数据库。

Redis 有以下三个特点:
1、Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用。
2、 Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储(这些数据类型主要指的的是value的,key是正常的字符串)
3.、Redis支持数据的备份
接下来直接介绍具体Redis数据类型
Redis支持的数据类型(主要指的value,key一般就是字符串)
string(字符串) hash(哈希) list(列表) set(集合) zset(sorted set:有序集合)
  1. String(字符串)
    string是redis最基本的类型,一个key对应一个value。
    string类型是二进制安全的。意思是redis的string可以包含任何数据。比如jpg图片或者序列化的对象 。
    string类型是Redis最基本的数据类型,一个键最大能存储512MB。
例如:

	127.0.0.1:6379> SET name "briup"
	OK
	127.0.0.1:6379> GET name
	"briup"
	//删除
	127.0.0.1:6379> del name
	(integer) 1
	
注意:value中的双引号要不要都可以
  1. hash(哈希)
    Redis hash 是一个键值对集合。
    Redis hash 是一个string类型的field和value的映射表,hash特别适合用于存储对象。
例如:
		127.0.0.1:6379> HMSET user username briup password 123
		OK

		127.0.0.1:6379> HGETALL user
		1) "username"
		2) "briup"
		3) "password"
		4) "123"

		127.0.0.1:6379> hget user username
		"briup"
		
		//删除
		127.0.0.1:6379> del user
		(integer) 1

		例子中使用了 hash 数据类型存储了包含用户信息的用户对象。 
		每个 hash 可以存储2的31次方个键值对。

		注意:命令不区分大小写
  1. list(列表)
    Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。
127.0.0.1:6379> lpush mylist briup
		(integer) 1

		127.0.0.1:6379> lpush mylist hello
		(integer) 2

		127.0.0.1:6379> lpush mylist world
		(integer) 3

		127.0.0.1:6379> lrange mylist 0 0
		1) "world"

		127.0.0.1:6379> lrange mylist 0 1
		1) "world"
		2) "hello"

		127.0.0.1:6379> lrange mylist 0 2
		1) "world"
		2) "hello"
		3) "briup"

		//删除
		127.0.0.1:6379> del mylist
		(integer) 1

		列表最多可存储2的31次方个元素。
  1. set(集合)
    Redis的Set是string类型的无序集合。
    集合是通过哈希表实现的。
    sadd 命令
    添加一个string元素到,key对应的set集合中,成功返回1,如果元素已经存在则返回0,key对应的set不存在返回错误。
例如:
		127.0.0.1:6379> sadd myset hello
		(integer) 1
		127.0.0.1:6379> sadd myset world
		(integer) 1
		127.0.0.1:6379> sadd myset briup
		(integer) 1
		127.0.0.1:6379> sadd myset briup
		(integer) 0
		127.0.0.1:6379> smembers myset
		1) "hello"
		2) "world"
		3) "briup"

		//删除
		127.0.0.1:6379> del myset
		(integer) 1

		集合中最大的成员数为 2的31次方。
  • zset(有序集合)
    Redis中 zset 和 set 一样也是string类型元素的集合,且不允许重复的成员。
    不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。
    zset的成员是唯一的,但分数(score)却可以重复。
    zadd 命令
    添加元素到集合,元素在集合中存在则更新对应score
例如:

		127.0.0.1:6379> zadd myzset 2 briup
		(integer) 1

		127.0.0.1:6379> zadd myzset 0 hello
		(integer) 1

		127.0.0.1:6379> zadd myzset 1 world
		(integer) 1
		
		127.0.0.1:6379> zadd myzset 1 gogo
		(integer) 1
		
		127.0.0.1:6379> zrangebyscore myzset 0 3
		1) "hello"
		2) "gogo"
		3) "world"
		4) "briup"
		
		//删除
		127.0.0.1:6379> del myzset
		(integer) 1

接下来了解一下redis在springboot中的配置
太复杂 T _ T,没理解 = _ =


主要围绕高性能提升

一、 总结最近学习

  • sql的精简 能减少重复调用数据库做操作,数据量太大,时间问题需要大量减少。
  • 合理利用多线程,分布式线程开发
sql语句用法

多使用批量操作来对数据进行操作,减少对数据库的调用,增加性能。

  • 建表语句
    create table table_name ([column1] [type] [not null] [primary key],[column2] [type] [not null] ,…) column 属性 type 属性类型 not null 是否可以为空 primary key 主键等约束条件
    例:
    create table table_name(
    id int(10),
    name varchar(255),

  • 插入语句
    insert into table_name([column1],[column2],[column3]…) values ([value1],[value2],[value3],…),([value1],[value2],[value3],…); 可以用作多条插入
    Oracle下也可以用
    insert all
    into table_name(([column1],[column2],[column3]…) values ([value1],[value2],[value3],…)),
    into table_name(([column1],[column2],[column3]…) values ([value1],[value2],[value3],…)),
    select * from dual;

  • 修改语句
    修改表下属性的value值
    update table_name set (column1 = [value1],column2 = [value2],…) where column1 = [value] and …

  • 查询优化
    常规查询:select * from table_name where id = [id]
    优化后:select * from table_name where id in ([id1],[id2],…)

  • alter table 用法

  • 对表结构进行添加属性
    alter table [table_name] add [column_name] [type(length)]

  • 对表结构进行删除属性
    alter table [table_name] drop column [column_name]

  • 对表结构属性进行修改
    alter table [table_name] alter column [column_name] [type(length)] null /not null

  • 常用小技巧

  • 复制表结构,不带数据
    create table [table_copy_name] as select * from [table_name] where 1=2;
    其中1=2 是因为1=2的条件在数据库中查不到任何数据,所以只是复制了表结构若需要数据,去掉where 1=2即可。

  • select count(num) from [table_name];
    查询表中数据的数量
    **count:**用来计算数量的关键词,count(ags) count可以传参,传入随意number数量,都是代表查询该表中所有元素的数量;传入某一属性名,查询某一元素的数量

  • 去重关键词:distinct
    在查询返回结果是 在属性名前加distinct可以对该属性进行去重查询。

  • 交集,差集,左连接,右连接,内连接等
    交集 > 定义原理:获取tableA和tableB相同的部分,并返回的相同部分,返回结构与表tableA结构相同
    eg: select a.id from [table_a] a,[table_b] b where a.id = b.id;
    差集 > 定义原理:在交集的基础上,通过对比不同于tableA的id的部分,并返回
    eg: select id from [table_a] where id not in (select a.id from [table_a] a,[table_b] b where a.id = b.id);
    左连接 > 定义原理:以左表为基础,首先查询左表满足条件的数据,之后以查询结果为基础,查询出右表满足条件的结果。
    eg:select * from [tableA] a left join [tableB] b on a.id = b.id;
    解释:若tableA存在数据2条,tableB存在43条,最终查询结果满足tableA条件的数据为24条,则返回这10条数据,并全部显示。
    右连接 > 定义原理:以右表为基础,首先查询右表满足条件的数据,之后以查询结果为基础,查询出左表满足条件的结果。
    解释:同上,查结果为返回43条,优先查询出右表43条数据,之后和tableA匹配的只有24条数据,所以只有这个24条数据的后面tableA字段上有对应的数据,其他19条数据因为没有对应的符合条件的,所以在tableA字段上都为空,但是都返回,因为是右连接,以tableB为基础。
    eg:select * from [tableA] a right join [tableB] b on a.id = b.id;
    内连接 > 定义原理:只显示符合条件的数据,多余的不显示
    eg:select * from [tableA] a inner join [tableB] b on a.id = b.id;
    解释:在本次例子中,因为相对tableB包含tableA中的条件,所以内连接就是左连接结果。解释就是以条件少一点的为基础,两张表不符合条件数据不会查询出来。
    特例:内连接及其与嵌套相似,由于tableB包含tableA内容,so 如下sql所示:
    select * from [tableB] where id in (select id from [tableA]); =>=>=>=>=>=> 值得思考,看情况编写不同的sql

  • 删除操作
    drop:适用于删除表结构,无需提交事务。
    eg: drop table [table_name];
    truncate:适用于快速清空表中全部数据,高效快速,数据量很大时极力推荐,释放空间(清空表数据后,默认id自动归0)。
    eg:truncate table [table_name];
    delete:适用于删除数据,指定条件删除数据,不释放空间(删除数据,默认id不会删除,在下次添加时,id不连续),而且需要事务提交,删除效率低于truncate table
    eg:delete table [table_name] (where [column] = [value])
    总结如下:当你不在用这张表时,用drop;当你还想用表结构,而是清除表中所有数据,最有效的方式用truncate table ,释放空间;最后如果想删除部分数据信息,用delete并需要事务提交,不释放空间。

  • 条件查询(between … and …
    在指定范围内查询满足条件的数据。
    语法:select * from [table_name] where [column] between [value1] and [value2];

  • 模糊查询(like
    合理利用通配符模糊查询符合条件的结果,利用关键词like

通配符描述语法
%替代多个字符,或前或后或两端‘字符串%’;’%字符串’;’%字符串%’
_替代单个字符,或前或后或两端‘字符串_’;’_字符串’;’_字符串 _’
[charlist]头部为charlist中的字符[ANL] 头部为A、N、L的通配符
[!charlist] 或 [^charlist]头部不为charlist中的字符[!ANL] 或 [^ANL] 头部不为A、N、L的通配符

eg:select * from [table_name] where name like (通配符/模糊查询条件)

  • 排序 (order … by …
    asc:代表查询结果按指定属性从小到大顺序列出,默认为改排序方式;
    desc:代表查询结果按指定属性从大到小顺序列出;
    语法:select * from [table_name] order by [column] desc;
  • 函数使用(avg:平均值;count:计数;max:最大值;min:最小值;sum:总和
    sql可以做简单的运算。
    语法:select [avg/count/max/min/sum] ([column]) from [table_name];
  • group by … (having … )
    当我们选不只一个栏位,且其中至少一个栏位有包含函数的运用时,我们就需要用到group by…,增加having的原因是,where关键词不能与函数配合使用。
    语法:select num,sum(num) from [table_name] (where [column] = [value])group by num (having sum(num) < 20);
    自己悟 看例子差不多
  • 格式转换
    太多不怎么常用的函数
    W3School-sql
  • 约束分类
    check约束 primary key主键 foreign key外键
    最后总结:减少对于数据库的调用

下面总结网上学习到的

  1. 尽量指定类、方法的final修饰符
    带有final修饰符的类是不可派生的。在Java核心API中,有许多应用final的例子,例如java.lang.String,整个类都是final的。为类指定final修饰符可以让类不可以被继承,为方法指定final修饰符可以让方法不可以被重写。如果指定了一个类为final,则该类所有的方法都是final的。Java编译器会寻找机会内联所有的final方法,内联对于提升Java运行效率作用重大,具体参见Java运行期优化。此举能够使性能平均提高50%
  2. 尽量重用对象
    特别是String对象的使用,出现字符串连接时应该使用StringBuilder/StringBuffer代替。由于Java虚拟机不仅要花时间生成对象,以后可能还需要花时间对这些对象进行垃圾回收和处理,因此,生成过多的对象将会给程序的性能带来很大的影响。
  3. 尽可能使用局部变量
    调用方法时传递的参数以及在调用中创建的临时变量都保存在栈中,速度较快,其他变量,如静态变量、实例变量等,都在堆中创建,速度较慢。另外,栈中创建的变量,随着方法的运行结束,这些内容就没了,不需要额外的垃圾回收。
  4. 及时关闭流
    Java编程过程中,进行数据库连接、I/O流操作时务必小心,在使用完毕后,及时关闭以释放资源。因为对这些大对象的操作会造成系统大的开销,稍有不慎,将会导致严重的后果。
  5. 不要将数组声明为public static final
    因为这毫无意义,这样只是定义了引用为static final,数组的内容还是可以随意改变的,将数组声明为public更是一个安全漏洞,这意味着这个数组可以被外部类所改变
  6. 字符串变量和字符串常量equals的时候将字符串常量写在前面

这是一个比较常见的小技巧了,如果有以下代码:

String str = "123";
if (str.equals("123"))
{
    ...
}

建议修改为:

String str = "123";
if ("123".equals(str))
{
    ...
}

这么做主要是可以避免空指针异常

  1. 把一个基本数据类型转为字符串,基本数据类型.toString()是最快的方式、String.valueOf(数据)次之、数据+""最慢
  2. 不捕获Java类库中定义的继承自RuntimeException的运行时异常类
    异常处理效率低,RuntimeException的运行时异常类,其中绝大多数完全可以由程序员来规避,比如:
  • ArithmeticException可以通过判断除数是否为空来规避
  • NullPointerException可以通过判断对象是否为空来规避
  • IndexOutOfBoundsException可以通过判断数组/字符串长度来规避
  • ClassCastException可以通过instanceof关键字来规避
  • ConcurrentModificationException可以使用迭代器来规避

很多提高性能的注意点

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值