Linux基本操作
Linux目录结构
bin:存放二进制执行文件
sbin: 存放二进制执行文件,只有root才能访问
usr:存放共享的系统资源 usr下的profile文件是配置环境变量
home:家目录
切换目录:
cd usr 切换到该目录下的usr目录
cd ../ 切换到上一级目录
cd / 切换到根目录
创建目录 mkdir 目录名称
创建多级目录: mkdir -p aa/bb (如果有aa不会报错,没有就会创建aa)
查看目录
ls 目录:查看该目录下的所有目录和文件
ls -a 目录:包括隐藏文件
ls -l 目录:查看该目录下的所有目录和文件的详细 可缩写为 ll
寻找目录
如查找/root下的与test相关的目录(文件) find /root -name ‘*test*’
查找文件里符合条件的字符串
grep lang anaconde-ks.cfg 在文件中查找lang
grep lang anaconde-ks.cfg --color 在文件中查找lang,并高亮显示
修改目录名称 mv 旧名称 新名称
移动目录位置—剪切 mv 名称 新位置
复制目录 cp -r r代表递归拷贝 文件不需要-r
如:将/usr下的newTest拷贝到根目录下的test cp -r /usr/newTest /test
删除目录 rm -rf 目录
创建文件 touch 文件名
查看文件 cat/more/less/tail 文件
cat只能显示最后一屏内容
more可以显示百分比,回车可以向下一行, 空格可以向下一页,q可以退出查看
less可以使用键盘上的PgUp和PgDn向上 和向下翻页,q结束查看
tail -10 查看文件的后10行,Ctrl+C结束
tail -f 文件 可以对某个文件进行动态监控
修改文件内容 vi vim
压缩文件 tar -zcvf
Linux中的打包文件一般是以.tar结尾的,压缩的命令一般是以.gz结尾的。
打包并压缩后的文件的后缀名一般.tar.gz。
命令:tar -zcvf 打包压缩后的文件名 要打包压缩的文件
其中:z:调用gzip压缩命令进行压缩
c:打包文件
v:显示运行过程
f:指定文件名
示例:打包并压缩/test下的所有文件 压缩后的压缩包指定名称为xxx.tar.gz
tar -zcvf xxx.tar.gz /test/*
解压压缩包tar -zxvf -C表示指定位置
其中:x:代表解压
如:将/test下的xxx.tar.gz解压到当前目录下 tar -xvf xxx.tar.gz
如:将/test下的xxx.tar.gz解压到根目录/usr下 tar -xvf xxx.tar.gz -C /usr
显示当前位置 pwd
搜索命令 grep 要搜索的字符串 要搜索的文件
如:搜索/usr/sudu.conf文件中包含字符串to的行 grep to /usr/sudu.conf
关键字显示颜色 grep to /usr/sudu.conf –color
管道命令 |:将前一个命令的输出作为后一个命令的输入
查看进程 :ps -ef:
杀死进程:kill -9 进程的pid
查看当前系统的端口使用:netstat -an
重定向输出>和>>
>:重定向输出,覆盖原有内容
>>:重定向输出,追加功能
cat /etc/passwd > a.txt 将输出定向到a.txt中
cat /etc/passwd >> a.txt 输出并且追加
权限
文件类型:
-:表示文件
d:表示目录
l:表示链接
属主u 输组g 其他用户o
rwx 421
如:修改/test下的aaa.txt的权限为属主有全部权限,属主所在的组有读写权限,其他用户只有读的权限 chmod u=rwx,g=rw,o=r aaa.txt 或 chmod 764 aaa.txt
修改字符集编码
CentOS 6 vi /etc/sysconfig/i18n
CentOS 7 vi/etc/sysconfig/locale
修改主机名:
临时: hostname 新的主机名
永久生效: vim /etc/sysconfig/network
NoSQL==Not Only SQL 泛指非关系型数据库
主流NoSql hbase MongoDB Redis
什么是Redis
Redis是用C语言开发的一个键值对(key-value)数据库,
redis的应用场景
1.缓存
2.任务队列(秒杀)
远程连接Redis
Jedis jedis=new Jedis(host,port); 6379
//Jedis jedis=new Jedis("192.168.0.10",6379);
jedis.set(key,value);
jedis.get(key);
jedis.close();
主要用在激活码多长时间失效(比如5分钟之内有效)
连接池:
redis的数据结构:
redis存储的是:key,value格式的数据,其中key都是字符串,value有5种不同的数据结构
Redis 6379 支持五种数据类型:
字符串类型 string
哈希类型 hash(理解为map格式)
列表类型 list
集合类型 set
有序集合类型 sortedset
String(重要)
set key value:若key存在则覆盖
get key:若key不出在,返回null
getset key value:先获取key的值,然后设置key的值
incr key:若key不存在,初始值是0 将指定的key的value原子性的递增1.
decr key: 若key不存在,初始值是0 将指定的key的value原子性的递减1.
incrby key increment:若key不存在, 初始值是0 将指定的key的value原子性增加increment
decrby key increment:若key不存在, 初始值是0 将指定的key的value原子性增加increment
append key value:如果该key存在,则在原有的value后追加该值;如果该key 不存在,则重新创建一个key/value
del key:删除key
hash
hset key field value:为指定的key设定field/value对(键值对)。
hmset key field1 value1 field2 value2 …:设置key中的多个filed/value
hget key field:返回指定的key中的field的值
hmget key field1 field2 …. 获取key中的多个filed的值
hgetall key:获取key中的所有filed-vaule
hexists key field:判断指定的key中的filed是否存在,存在为1,不存在为0
hlen key:获取key所包含的field的数量
hincrby key field increment:设置key中filed的值增加increment,如:age增加20
hdel key field:删除某一个值
del key:删除所有值
List
lpush key value1 value2.. :在list的头部插入所有的values
rpush key value1 value2.. :在list的尾部插入所有的values
lrange key start end:若为-1则表示链表尾部的元素,-2则表示倒数第二个
如:lrange key 0 -1
lpushx key value:在list的头部插入所有的values,仅当参数中指定的key存在时(没有不行,插入不进去)
rpushx key value:在list的尾部插入所有的values,仅当参数中指定的key存在时
lpop key:取出头部元素
rpop key:取出尾部元素
rpoplpush resource destination:取出resource的尾部元素放到destination的头部元素
llen key:显示链表中的元素数量
lset key index value:0表示头元素,-1表示尾元素 修改指定位置的元素
lrem key count value:删除count个值为value的元素 若count>0, 从头向尾删除,若count<0,从尾到头,若count=0,则删除指定的所有的value元素
linsert key before|after 元素 value:在指定的元素前或后插入元素
set set集合中不允许出现重复的元素
sadd key value1 value2:向set中添加数据
smembers key:获取set中所有的成员
scard key:获取set中成员的数量
sismember key member:判断参数中指定的成员是否在该set中,1表示存在,0表示不存在或者该key本身就不存在
srem key member1、member2…:删除set中指定的成员
srandmember key:随机返回set中的一个成员
sdiff key1 key2:返回key1有,而key2没有的
sdiffstore destination key1 key2:将key1有,而key2没有的的成员存储在destination上
sinter key[key1,key2…]:返回交集(都有的)
sinterstore destination key1 key2:将返回的交集存储在destination上
sunion key1、key2:返回并集
sunionstore destination key1 key2:将返回的并集存储在destination上
sortedset:不允许重复元素,且元素有顺序
它们之间的主要差别是Sorted-Sets中的每一个成员都会有一个分数(score)与之关联,Redis正是通过分数来为集合中的成员进行从小到大的排序。然 而需要额外指出的是,尽管Sorted-Sets中的成员必须是唯一的,但是分数(score) 却是可以重复的。
zadd key score member score2 member2 … :将所有成员以及该成员的分数存放到sorted-set中
zcard key:获取集合中的成员数量
zrange key 0 -1 [withscores]:获取成员[可以看里面的分数]
zcount key min max:获取分数在[min,max]之间的成员
zrem key value:删除
通用命令:
keys *:查询所有的键
type key:获取键对应的value类型
del key : 删除指定的kye
redis事务
multi:开启事务
exec:提交事务
discard:回滚事务
redis持久化
redis支持两种方式的持久化,一种是RDB,一种是AOF
RDB持久化(默认支持,无需配置):在指定的时间间隔内将内存中的数据集快照写入磁盘
AOF持久化:以日志的形式记录服务器处理的每一个写操作
项目中,修改比较频繁的东西放在缓存中,缓存中没有在读数据库
使用ajax方法,来页面展示下拉框
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="js/jquery-3.3.1.min.js"></script>
<script>
$(function () {
//发送ajax请求,加载所有省份数据
$.get("provinceServlet",{},function (data) {
//[{"id":1,"name":"北京"},{"id":2,"name":"上海"},{"id":3,"name":"广州"},{"id":4,"name":"陕西"}]
//1.获取select
var province = $("#province");
//2.遍历json数组
$(data).each(function () {
//3.创建<option>
var option = "<option name='"+this.id+"'>"+this.name+"</option>";
//4.调用select的append追加option
province.append(option);
});
});
});
</script>
</head>
<body>
<select id="province">
<option>--请选择省份--</option>
</select>
</body>
</html>
@WebServlet("/provinceServlet")
public class ProvinceServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.调用service查询
ProvinceService service = new ProvinceServiceImpl();
List<Province> list = service.findAll();
//2.序列化list为json
ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(list);
//3.响应结果
response.setContentType("application/json;charset=utf-8");
response.getWriter().write(json);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
使用缓存
@WebServlet("/provinceServlet")
public class ProvinceServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.调用service查询
ProvinceService service = new ProvinceServiceImpl();
String json = service.findAllJson();
System.out.println(json);
//3.响应结果
response.setContentType("application/json;charset=utf-8");
response.getWriter().write(json);
}
/**
使用redis缓存
*/
@Override
public String findAllJson() {
//1.先从redis中查询数据
//1.1获取redis客户端连接
Jedis jedis = JedisPoolUtils.getJedis();
String province_json = jedis.get("province");
//2判断 province_json 数据是否为null
if(province_json == null || province_json.length() == 0){
//redis中没有数据
System.out.println("redis中没数据,查询数据库...");
//2.1从数据中查询
List<Province> ps = dao.findAll();
//2.2将list序列化为json
ObjectMapper mapper = new ObjectMapper();
try {
province_json = mapper.writeValueAsString(ps);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
//2.3 将json数据存入redis
jedis.set("province",province_json);
//归还连接
jedis.close();
}else{
System.out.println("redis中有数据,查询缓存...");
}
return province_json;
}