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

  1. 将Redis的配置文件redis.conf拷贝到Home目录 cp redis.conf ~

  2. 将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上的一致

猜你喜欢

转载自blog.csdn.net/weixin_42569562/article/details/82918914