MySQL学习笔记04(redis)

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 Tair(兼容Redis),内存型 2GB
简介: MySQL学习笔记04(redis) 一:存储过程 存储过程比普通SQL语句功能更强大,而且能够实现功能性编程,它是SQL语句集,当执行成功后会被存储在数据库服务器中,并允许客户端直接调用,而且存储过程可以提高SQL语句的执行效率,还能保证安全性。

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

 原文地址https://blog.csdn.net/weixin_42569562/article/details/82918914

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
4天前
|
NoSQL 关系型数据库 MySQL
Redis 事务特性、原理、具体命令操作全方位诠释 —— 零基础可学习
本文全面阐述了Redis事务的特性、原理、具体命令操作,指出Redis事务具有原子性但不保证一致性、持久性和隔离性,并解释了Redis事务的适用场景和WATCH命令的乐观锁机制。
20 0
Redis 事务特性、原理、具体命令操作全方位诠释 —— 零基础可学习
|
13天前
|
Oracle NoSQL 关系型数据库
主流数据库对比:MySQL、PostgreSQL、Oracle和Redis的优缺点分析
主流数据库对比:MySQL、PostgreSQL、Oracle和Redis的优缺点分析
40 2
|
21天前
|
NoSQL 关系型数据库 MySQL
当Redis与MySQL数据一致性校验中Redis数据量小于MySQL时的全量查询处理方法
保持Redis和MySQL之间的数据一致性是一个需要细致规划和持续维护的过程。通过全量数据同步、建立增量更新机制,以及定期执行数据一致性校验,可以有效地管理和维护两者之间的数据一致性。此外,利用现代化的数据同步工具可以进一步提高效率和可靠性。
42 6
|
1月前
|
NoSQL 关系型数据库 Redis
mall在linux环境下的部署(基于Docker容器),Docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongo
mall在linux环境下的部署(基于Docker容器),docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongodb、minio详细教程,拉取镜像、运行容器
mall在linux环境下的部署(基于Docker容器),Docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongo
|
1天前
|
NoSQL 关系型数据库 MySQL
Tomcat、MySQL、Redis最大支持说明
综上所述,Tomcat、MySQL、Redis的并发处理能力均非固定值,而是通过合理的配置与优化策略,结合系统硬件资源,共同决定了它们在实际应用中的表现。开发者应根据应用的具体需求和资源条件,对这些组件进行细致的调优,以达到最佳性能表现。
10 0
|
1月前
|
缓存 NoSQL 关系型数据库
MySQL与Redis缓存一致性的实现与挑战
在现代软件开发中,MySQL作为关系型数据库管理系统,广泛应用于数据存储;而Redis则以其高性能的内存数据结构存储特性,常被用作缓存层来提升数据访问速度。然而,当MySQL与Redis结合使用时,确保两者之间的数据一致性成为了一个重要且复杂的挑战。本文将从技术角度分享MySQL与Redis缓存一致性的实现方法及其面临的挑战。
66 2
|
2月前
|
缓存 NoSQL 关系型数据库
Redis学习总结
Redis学习总结
33 1
|
2月前
|
SQL 关系型数据库 MySQL
MySQL学习笔记
这篇文章是一份关于MySQL数据库操作的学习笔记,涵盖了数据库的终端操作、数据类型、建表约束、事务处理以及SQL的连接查询等基础知识点。
|
2月前
|
NoSQL 关系型数据库 MySQL
无法访问Docker 里的 mysql, redis
无法访问Docker 里的 mysql, redis
20 0
|
3天前
|
存储 缓存 NoSQL
数据的存储--Redis缓存存储(一)
数据的存储--Redis缓存存储(一)
24 1

热门文章

最新文章

推荐镜像

更多