这段时间开始重新接触后端的springboot
大体总结一下几个点
- 首先总结Jedis+Redis的配置和使用
- sql语句区分以及用法
- 各种零碎生成及原理
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:有序集合)
- 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中的双引号要不要都可以
- 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次方个键值对。
注意:命令不区分大小写
- 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次方个元素。
- 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外键
最后总结:减少对于数据库的调用
下面总结网上学习到的
- 尽量指定类、方法的final修饰符
带有final修饰符的类是不可派生的。在Java核心API中,有许多应用final的例子,例如java.lang.String,整个类都是final的。为类指定final修饰符可以让类不可以被继承,为方法指定final修饰符可以让方法不可以被重写。如果指定了一个类为final,则该类所有的方法都是final的。Java编译器会寻找机会内联所有的final方法,内联对于提升Java运行效率作用重大,具体参见Java运行期优化。此举能够使性能平均提高50% - 尽量重用对象
特别是String对象的使用,出现字符串连接时应该使用StringBuilder/StringBuffer代替。由于Java虚拟机不仅要花时间生成对象,以后可能还需要花时间对这些对象进行垃圾回收和处理,因此,生成过多的对象将会给程序的性能带来很大的影响。 - 尽可能使用局部变量
调用方法时传递的参数以及在调用中创建的临时变量都保存在栈中,速度较快,其他变量,如静态变量、实例变量等,都在堆中创建,速度较慢。另外,栈中创建的变量,随着方法的运行结束,这些内容就没了,不需要额外的垃圾回收。 - 及时关闭流
Java编程过程中,进行数据库连接、I/O流操作时务必小心,在使用完毕后,及时关闭以释放资源。因为对这些大对象的操作会造成系统大的开销,稍有不慎,将会导致严重的后果。 - 不要将数组声明为public static final
因为这毫无意义,这样只是定义了引用为static final,数组的内容还是可以随意改变的,将数组声明为public更是一个安全漏洞,这意味着这个数组可以被外部类所改变 - 字符串变量和字符串常量equals的时候将字符串常量写在前面
这是一个比较常见的小技巧了,如果有以下代码:
String str = "123";
if (str.equals("123"))
{
...
}
建议修改为:
String str = "123";
if ("123".equals(str))
{
...
}
这么做主要是可以避免空指针异常
- 把一个基本数据类型转为字符串,基本数据类型.toString()是最快的方式、String.valueOf(数据)次之、数据+""最慢
- 不捕获Java类库中定义的继承自RuntimeException的运行时异常类
异常处理效率低,RuntimeException的运行时异常类,其中绝大多数完全可以由程序员来规避,比如:
- ArithmeticException可以通过判断除数是否为空来规避
- NullPointerException可以通过判断对象是否为空来规避
- IndexOutOfBoundsException可以通过判断数组/字符串长度来规避
- ClassCastException可以通过instanceof关键字来规避
- ConcurrentModificationException可以使用迭代器来规避