MySQL学习笔记04(redis)
一:存储过程
存储过程比普通SQL语句功能更强大,而且能够实现功能性编程,它是SQL语句集,当执行成功后会被存储在数据库服务器中,并允许客户端直接调用,而且存储过程可以提高SQL语句的执行效率,还能保证安全性。
1.1创建存储过程
创建语法:
create procedure sp_name([in|out|inout] param_name type[,…])
begin
存储过程主体
end
结束符
解释如下:
sp_name:存储过程名称
in|out|inout:参数的类型
param_name: 参数的名称
type:参数的数据类型
1. 创建存储过程,接收账户id参数,查询该账户余额。(演示in参数类型)
delimiter $$
create procedure sp_check_balance(balance_id int)
begin
select accname,balance from account where id=balance_id;
end
$$
调用存储过程: call sp_check_balance(2) $$
2. 创建存储过程,接收账户id参数,并将查询到的余额存储到输出参数中(演示out参数类型)
delimiter $$
create procedure sp_out_balance(balance_id int,out money double)
begin
select balance into money from account where id=balance_id;
end
$$
调用存储过程:call sp_out_balance(1,@x)
3. 创建存储过程,查询account表中的记录总数
delimiter $$
create procedure sp_count(inout total int)
begin
if (total is not null) then
select count(*) into total from account;
end if;
end
$$
调用存储过程:set @x=1 $$
call sp_count(@x) $$
select @x $$
3. while循环
delimiter //
create procedure sp_while()
begin
declare x int default 1;
while (x<=100) do
set x=x+2;
end while;
set @a=x;
end
//
调用存储过程:call sp_while() //
select @a //
二:存储过程控制语句
2.1 if条件控制语句
if 条件判断 then
执行语句
end if;
2.2 while语句
while 循环条件 do
循环主体
end while;
三:触发器
n触发器与数据表紧密关联,当该数据表(宿主表)有插入(insert)、更改(update)或删除(delete)事件发生时,所设置的触发器就会自动被执行。
触发器只能由数据库的特定事件来触发,并且不能接收参数。
3.1 触发器语法
create trigger 触发器名称 trigger_time trigger_event on tbl_name for each row
trigger_stmt
解释:trigger_time 触发时机
trigger_event 触发事件
tbl_name 触发器宿主表
trigger_stmt 触发器语句体
在MySQL触发器中,有两个特殊的别名来引用和触发器相关的表中的列值,它们分别是OLD和NEW,利用NEW.colname可以获取将要插入的新行的一列的值,而OLD.colname则可以在删除或更新数据之前来获取旧的数据。
触发器的删除
drop trigger 触发器名称
3.2 代码演示
1.创建日志表
create table log(
id int primary key auto_increment,
msg varchar(50),
operate_time datetime
);
2. 创建触发器
A. 创建修改触发器
delimiter $$
create trigger account_update_trigger after
update on account for each row
begin
insert into log(msg,operate_time)values('account表更新数据了',now());
end
$$
测试触发器:
修改account表数据: update account set password='13579' where id=2 $$
B. 创建删除触发器
delimiter $$
create trigger account_delete_trigger after
delete on account for each row
begin
insert into log(msg,operate_time)values
(concat(old.accname,'账户被删除了'),now());
end
$$
测试触发器:
delete from account where id=2 $$
C. 创建插入触发器
delimiter $$
create trigger account_insert_trigger after
insert on account for each row
begin
insert into log(msg,operate_time)values
(concat(new.accname,'账户添加了'),now());
end
$$
测试触发器:
insert into account(accname,password,balance)values('alice','24680',5000) $$
四:用户与权限
4.1语法
1、创建用户
create user '用户名'@'该用户可在指定主机进入mysql' identified by '登录密码';
2、给用户设置权限
grant 权限 on 数据库名.表名 to '用户名'@'该用户可在指定主机进入mysql'
identified by '用户登录密码' [with grant option];
3、删除用户
drop user '用户名'@'该用户可在指定主机进入mysql';
4.2 代码演示
1.创建MySQL的tom用户
create user 'tom'@'%' identified by '123456';
2.给tom用户设置mydb数据库的account表的select权限
grant select on mydb.account to 'tom'@'%' identified by '123456'
with grant option;
五、redis
5.1 redis简介
Redis的全称是Remote Dictionary Server
Redis是一种基于键值对(key-value)的NoSQL数据库。
5.2 redis的安装于配
一:下载并安装Redis
1.下载Redis源码 wget http://download.redis.io/releases/redis-3.2.5.tar.gz
2.解压缩到当前目录 tar -xzvf redis-3.2.5.tar.gz
3.进入解压缩之后的目录 cd redis-3.2.5
4.编译 make
5.安装 sudo make install
二:配置Redis
将Redis的配置文件redis.conf拷贝到Home目录 cp redis.conf ~
将Home目录中的redis.conf配置文件修改如下:
daemonize yes 解释:这是将Redis的服务启动改为后台
3.启动Redis服务
redis-server redis.conf配置文件的位置
4.关闭Redis服务
redis-cli shutdown # 默认关闭的是-h 主机地址 -p 端口号服务
或者加上参数关闭服务redis-cli -h 主机地址 -p 端口号 shutdown
5.进入Redis客户端
redis-cli # 默认进入本机的6379Redis客户端或者redis-cli -h 主机地址 -p 端口号
5.3 sshf服务安装
1.安装ssh服务 sudo apt-get install openssh-server 如果遇到锁定问题,解决如下: E: 无法获得锁 /var/lib/dpkg/lock - open (11: 资源暂时不可用) E: 无法锁定管理目录(/var/lib/dpkg/),是否有其他进程正占用它?
解决办法: sudo rm /var/cache/apt/archives/lock
sudo rm /var/lib/dpkg/lock
5.4 redis特性
1、速度快
正常情况下,Redis执行命令的速度非常快,官方的数据是读写性能10万/秒。
速度快的主要原因:
Redis所有数据都是在内存中操作的;
Redis是用C语言实现的;
Redis使用了单线程架构;
2、基于键值对的数据结构服务器
Redis提供了5种基本数据结构:字符串、哈希、列表、集合、有序集合。
3、持久化
虽然Redis的所有数据都是在内存中操作的,但也提供了持久化的功能。
4、主从复制
5.5 redis基本命令
keys * 查看所有的key
type key 查看key所对应的value的数据类型
del key [key1 key2 …]删除key
lexpire key 过期时间(秒)
ttl key 查看键的剩余过期时间
大于等于0的整数:键剩余的过期时间
-1:键没设置过期时间
-2:键不存在
5.6 redis数据类型
1、字符串(string)
常用命令
(1)设置值
set key value [nx|xx]
注意:nx当key不存在时,才能设置成功
xx当key存在时,才能设置成功
(2)获取值
get key
(3)批量设置值
mset key value [key value …]
(4)批量获取值
mget key [key …]
(5) 计数
incr key
注意:incr 命令用于对值做自增操作,返回 结 果有三种情况:
值不是整数,返回错误
值是整数,返回自增后的结果
键不存在,按照值为0自增,返回结果为1
2、哈希(hash)
在Redis中,哈希类型是指值本身又是一个键值对结构。
n常用命令
(1) 设置值
hset key field value
(2) 获取值
hget key field
(3)删除field
hdel key field [field …]
(4)计算field个数
hlen key
(5)批量设置或获取field-value
hmset key field value [field value…]
hmget key field [field …]
(6) 通过key获取对应的所有filed-value
hgetall key
3、列表(list)
列表类型用来存储多个有序元素
常用命令
(1)从右边插入元素
rpush key value [value …]
(2)从左边插入元素
lpush key value[value…]
(3)获取指定范围内的元素列表
lrange key start end(注意:此处包括end索引)
(4)获取列表指定索引下标的元素
lindex key index
(5)获取列表长度
llen key
(6) 从列表左侧(右侧)弹出元素
lpop|rpop key
(7)删除指定元素
lrem key count value
根据count的不同删除元素:
count>0,从左到右,删除最多count个元素
count<0,从右到左,删除最多count绝对值 个元素
count=0 删除所有
(8)修改指定索引下标的元素
lset key index newValue
列表可以组织成栈和队列:
lpush + lpop = Stack(栈)
lpush + rpop = Queue(队列)
4、集合(set)
集合中不允许有重复元素,并且集合中的元素是无序的,不能通过索引下标获取元素
集合内操作
(1)添加元素
sadd key element [element…]
(2)删除元素
srem key element[element…]
(3)计算元素个数
scard key
(4)获取所有元素
smembers key
(5)随机从集合返回指定个数元素
srandmember key [count]
(6)从集合随机弹出元素
spop key [count]
注意:从Redis3.2版本开始,才支持[count]参数
4.1、集合间操作
(1)求多个集合的 交集
sinter key [key…]
(2)求多个集合的并集
sunion key [key…]
(3)求多个集合的差集
sdiff key [key…]
5、有序集合(zset)
l有序集合保留了集合不能有重复成员的特性,但不同的是,有序集合中的元素可以根据每个成员的分数进行排序
常用操作
(1)添加成员
zadd key score member [score member …]
(2)计算成员个数
zcard key
(3)获取某个成员的分数
zscore key member
(4)删除成员
zrem key member [member…]
(5)增加成员分数
zincrby key increment member
(6)计算成员的排名
zrank key member (从低到高)
zrevrank key member (从高到低)
(7)返回指定排名范围的成员
zrange key start end [withscores]
zrevrange key start end [withscores]
(8)返回指定分数范围的成员
zrangebyscore key min max [withscores]
zrevrangebyscore key max min[withscores]
(9)返回指定分数范围成员个数
zcount key min max
(10)删除指定分数范围的成员
zremrangebyscore key min max
5.7、复制
在分布式系统中为了解决单点问题,通常会把数据复制多个副本部署到其他机器,满足故障恢复和负载均衡等需求。
参与复制的Redis实例划分为主节点(master)和从节点(slave)。默认情况下,Redis都是主节点。每个从节点只能有一个主节点,而主节点可以同时具有多个从节点。复制的数据流是单向的,只能由主节点复制到从节点
在从服务器(slave)Redis命令行中直接输入:
slaveof master的地址 master的端口号
断开与主节点的复制关系:
slaveof no one
slaveof命令还可以实现切主操作,所谓切主是指把当前从节点对主节点的复制切换到另一个主节点。
可以通过info replication命令查看当前节点的信息。
代码演示
演示:Redis主从复制演示
1. 重新拷贝两份redis配置文件
cp redis.conf redis.conf2
cp redis.conf redis.conf3
2. 修改redis.conf2和redis.conf3中的端口号
redis.conf2的端口修改为: port 6380
redis.conf3的端口修改为: port 6381
3. 分别启动6379端口的Redis服务(redis.conf配置文件中)和6380服务、6381服务
redis-server redis.conf # 启动6379服务
redis-server redis.conf2 # 启动6380服务
redis-server redis.conf3 # 启动6381服务
4. 进入三个客户端
redis-cli # 进入localhost上的6379端口的客户端
redis-cli -p 6380 # 进入localhost上的6380端口的客户端
redis-cli -p 6381 # 进入localhost上的6381端口的客户端
5. 使6380端口的客户端从属于6379(即,6379是主节点,6380是从节点)
127.0.0.1:6380> slaveof localhost 6379
6. 在6379节点上设置数据,并在6380上查看
127.0.0.1:6379> set fruit apple
127.0.0.1:6380> keys *
7. 在6380上断开与6379的主从关系
127.0.0.1:6380> slaveof no one
发现:断开连接后,原从节点复制的数据还在
8. 6380重新与6379建立主从关系
发现:6380上又复制了6379上的所有数据(包括断连期间设置的数据)
9. 在6381上设置数据,并将6380切主到6381
127.0.0.1:6381> set subject Python
127.0.0.1:6380> slaveof localhost 6381
发现:6380上的数据完全与新的主节点6381上的一致
原文地址https://blog.csdn.net/weixin_42569562/article/details/82918914