• NOSQL----redis的安装和基础命令


    redis是什么

    1.redis-------非关系型数据库

    redis是非关系数据库的一种,也称为缓存型数据库。

    非关系型数据库和关系型数据库

    1.关系型数据库

    • 关系型数据库是一个结构化的数据库,记录方式是行和列(列:声明对象,行:记录对象属性)
    • sql语句。表与表之间是有关联的,使用sql语句,来对指定的表,库进行增删改查。
    • 在创建表时,我们是设计好了表的结构,按照表结构去存储数据。数据与表结构不匹配,存储数据会失败。

    2.非关系型数据库

    • nomysql(not lnly mysql),不仅仅是数据库,是非关系型数据库的总称
    • 不需要定义库,也不需要定义表的结构,直接记录即可,而且每条记录都可以有不同的数据类型,字段(字段个数)

    3.非关系型数据库和关系型数据库的区别

    (1)数据的存储方式不同

    关系型数据库和非关系型数据库的主要区别就在于数据的存储方式

    • 关系型数据天然就是表格式的,因此存储在数据表的行和列中。数据表可以彼此关联协作存储,也很容易提取数据。
    • 与其相反,非关系型数据不适合存储在数据表的行和列中,而是大块组合在一起。非关系型数据通常存储在数据集中,就像文档、键值对或者图结构。你的数据及其特性是选择数据存储和提取方式的首要影响因素。

    (2) 扩展方式

    • 性能上的提升,SQL靠的是提升本机性能。
    • NOMYSQL提升性能可以横向扩展(添加集群),加入节点的方式提高性能

    • 横向扩展:增加服务器(比较便宜,性价比高)
    • 纵向扩展:提高硬件配置,比如说cpu性能,硬盘,磁盘I/O,内存条等

    (3) 对事务的支持性能不同

    • MySQL支持事务
    • 非关系型数据库也支持事务,redis也可以支持事务,但是稳定性和处理能力都不如关系型数据库。

    关系型数据库:特别适合高事务性要求和需要控制执行计划的任务,事务处理更加精细。

    非关系型数据库:事务控制会稍显弱势,其价值点在于高扩展性和大数据量处理方面。

    2.非关系型数据库的主要运用场景

    1.操作的扩展性

    2.大数据量处理

    3.MySQL和nomysql数据记录对比

    关系型数据库:

    • 实例-->数据库-->表(table)-->记录行(row)、数据字段(column)

    非关系型数据库

    • 实例-->数据库-->集合(collection) -->键值对(key-value)
    • 不需要手动创建库,表

    非关系型数据库工作示意图:

    redis的相关知识

    1.介绍

    开源的,使用c语言编写的NQL数据库。

    redis:基于内存运行,支持持久化(数据恢复)。采用的就算key-value(键值对)的存储形式。目前在分布式架构中是非常重要的一环

    1. redis服务器程序,是一个单进程模式,即只有一个主进程工作。也就是说在一台服务器上可以启动多个redis(端口号不能冲突)
    2. redis的实际处理速度是完全依靠主进程的执行效率。
    3. 服务器只部署一个redis进程,多个客户端访问,可能会导致redis的处理能力下降
    4. 如果部署了多个redis进程,虽然能提高redis的并发处理能力,但是会给服务器cpu带来很大的压力。
    5. 一台服务器,一般部署3个redis进程。(根据情况来看,高并发,要部署多个。一般的情况,单进程足够)

    2.redis的特点

    1. 极高的读写数据速度,数据读取每秒110000次,写入数据每秒81000的写入。
    2. 支持丰富的数据类型。
    3. 支持持久化。平常的数据都是保存在内存中,持久化可以写入你,既可以保存到本地,也可以实现备份。
    4. 原子性(最小单位,不可被分割)
    5. 支持主从模式-----master,slave

    3.redis为什么这么快???

    1.redis是一个纯内存结构,避免磁盘I/O的耗时

    2.核心模块是一个单进程,减少了线程切换和回收线程的时间。

    3.I/O的多路复用机制,每一个执行线路,都可以同时执行读和写。并发效率大大提高。

    *特殊说明:redis的读写任然是单进程处理

    4.redis的五大数据类型

    1. string(字符串)
    2. list----列表。(列表内的元素类型还是string)
    3. hash类型
    4. set数据类型
    5. 有序集合

    redis的部署和安装

    1.redis的编译安装

    1. 关闭防火墙
    2. systemctl stop firewalld
    3. setenforce 0
    4. 安装编译环境
    5. yum install -y gcc gcc-c++ make
    6. 将安装包拖入/opt,然后解压
    7. tar zxvf redis-5.0.7.tar.gz -C /opt/
    8. cd /opt/redis-5.0.7/
    9. make
    10. make PREFIX=/usr/local/redis install
    11. #执行软件包提供的 install_server.sh 脚本文件设置 Redis 服务所需要的相关配置文件
    12. cd /opt/redis-5.0.7/utils
    13. ./install_server.sh
    14. ...... #一直回车
    15. Please select the redis executable path [/usr/local/bin/redis-server] /usr/local/redis/bin/redis-server
    16. #需要手动修改为 /usr/local/redis/bin/redis-server ,注意要一次性正确输入
    17. #把redis的可执行程序文件放入路径环境变量的目录中便于系统识别
    18. ln -s /usr/local/redis/bin/* /usr/local/bin/
    19. #当 install_server.sh 脚本运行完毕,Redis 服务就已经启动,默认监听端口为 6379
    20. netstat -natp | grep redis

    #Redis 服务控制
    /etc/init.d/redis_6379 stop                #停止
    /etc/init.d/redis_6379 start            #启动
    /etc/init.d/redis_6379 restart            #重启
    /etc/init.d/redis_6379 status            #状态

    修改配置 /etc/redis/6379.conf 参数

    1. vim /etc/redis/6379.conf
    2. bind 127.0.0.1 192.168.233.10 #70行,添加 监听
    3. wq
    4. 重启服务
    5. /etc/init.d/redis_6379 restart

    Redis 命令工具

    redis-server:用于启动 Redis 的工具
    redis-benchmark:用于检测 Redis 在本机的运行效率
    redis-check-aof:修复 AOF 持久化文件
    redis-check-rdb:修复 RDB 持久化文件
    redis-cli:Redis 命令行工具

    redis-cli 命令行工具

    语法:redis-cli -h host -p port -a password
    -h :指定远程主机
    -p :指定 Redis 服务的端口号
    -a :指定密码,未设置数据库密码可以省略-a 选项
    若不添加任何选项表示,则使用 127.0.0.1:6379 连接本机上的 Redis 数据库

    redis-cli -h 192.168.233.21 -p 6379 -a 123456

    redis五大字符串详解

    1.string(字符串)

    概述:String是 redis 最基本的类型,最大能存储 512MB 的数据,
    String类型是二进制安全的,即可以存储任何数据、比如数字、图片、序列化对象等

    SET/GET/DEL/APPEND

    1. set:存放数据,命令格式为 set key value
    2. get:获取数据,命令格式为 get key
    3. keys * 查看有多少键
    4. 20.0.0.170:6379> set stu zzr
    5. OK
    6. 20.0.0.170:6379> get stu
    7. "zzr"
    8. 20.0.0.170:6379>

    set可以创建键,也可以直接覆盖键值

    直接更改键值

    1. 20.0.0.170:6379> set stu zzr
    2. OK
    3. 20.0.0.170:6379> get stu
    4. "zzr"
    5. 20.0.0.170:6379> set stu 100
    6. OK
    7. 20.0.0.170:6379> get stu
    8. "100"

    删除键----del

    1. 20.0.0.170:6379> KEYS *
    2. 1) "test1"
    3. 2) "test"
    4. 3) "stu"
    5. 20.0.0.170:6379> del test1 test
    6. (integer) 2
    7. 20.0.0.170:6379> KEYS *
    8. 1) "stu"

    查看对应键的类型

    1. 20.0.0.170:6379> type stu
    2. string

    给键添加字符:APPEND key value追加键值,并返回追加后的长度(若键不存在,则相当于创建)

    1. 20.0.0.170:6379> KEYS *
    2. 1) "stu"
    3. 20.0.0.170:6379> type stu
    4. string
    5. 20.0.0.170:6379> append test hello
    6. (integer) 5
    7. 20.0.0.170:6379> KEYS *
    8. 1) "test"
    9. 2) "stu"
    10. 20.0.0.170:6379> get test
    11. "hello"
    12. 20.0.0.170:6379> append test world
    13. (integer) 10
    14. 20.0.0.170:6379> get test
    15. "helloworld"

    incr/decr/incrby/descby

    incr----让键值递增1

    decr----让键值递减1

    incrby/decrby-----给指定键值增加或者减少

    (如果键不存在,则从0开始递减)

    SETEX

    1. setex key seconds value:设置指定key的过期时间为seconds
    2. 20.0.0.170:6379> setex test 15 hello
    3. OK
    4. 20.0.0.170:6379> ttl test1
    5. (integer) -2
    6. 20.0.0.170:6379> ttl test
    7. (integer) 5
    8. 20.0.0.170:6379> ttl test
    9. (integer) 4
    10. 20.0.0.170:6379> ttl test
    11. (integer) 3
    12. 20.0.0.170:6379> ttl test
    13. (integer) 3
    14. 20.0.0.170:6379> ttl test
    15. (integer) 2
    16. 20.0.0.170:6379> ttl test
    17. (integer) 2
    18. 20.0.0.170:6379> ttl test
    19. (integer) 1
    20. 20.0.0.170:6379> ttl test
    21. (integer) 0
    22. 20.0.0.170:6379> ttl test
    23. (integer) -2
    24. 20.0.0.170:6379> ttl test
    25. (integer) -2
    26. 20.0.0.170:6379> ttl test
    27. (integer) -2

    -2表示当前键值对已过期

    -1表示永不过期

    expire--对已有键值设置生命周期

     SETNX:
    SETNX key value:不存在键的话执行set操作,存在的话不执行

    1. 20.0.0.170:6379> del stu #删除该键,以便于下面的测试验证。
    2. (integer) 1
    3. 20.0.0.170:6379> setnx stu "hello" #该键并不存在,因此setnx命令执行成功。
    4. (integer) 1
    5. 20.0.0.170:6379> get stu
    6. "hello"
    7. 20.0.0.170:6379> setnx stu "123" #该键已经存在,因此本次设置没有产生任何效果。
    8. (integer) 0
    9. 20.0.0.170:6379> get stu #从结果可以看出,返回的值仍为第一次设置的值。
    10. "hello"

    mset/mget----同时设置

    MSET key value [key value …]:批量设置键-值对
    MGET key [key …]:批量获取键值对

    1. 20.0.0.170:6379> mset test 123 test2 234
    2. OK
    3. 20.0.0.170:6379> KEYS *
    4. 1) "test"
    5. 2) "test2"
    6. 3) "stu"
    7. 20.0.0.170:6379> mget test test2
    8. 1) "123"
    9. 2) "234"

    2.list数据类型----列表

    列表当中的元素还是string类型。

    LPUSH/LPUSHX/ LRANGE

    LPUSH key value [value …]在头部(左侧)依次插入列表元素 
    LPUSHX key value:键必须存在才能执行,在头部插入元素值并返回并返回列表元素数量
    LRANGE key start stop:取从位置索引start到位置索引stop的所有元素(所以以0开始)

    LPUSH创建列表
    1. 20.0.0.170:6379> LPUSH zzr a b c d 1 2 3
    2. (integer) 7
    3. 20.0.0.170:6379> LRANGE zzr 0 -1
    4. 1) "3"
    5. 2) "2"
    6. 3) "1"
    7. 4) "d"
    8. 5) "c"
    9. 6) "b"
    10. 7) "a"
    11. 20.0.0.170:6379> LRANGE zzr 1 3
    12. 1) "2"
    13. 2) "1"
    14. 3) "d"

    LRANGE:查看

    0代表第一个,-1代表最后一个(这里序号排列和数组下标一致)

    但lpush创建的元素与所查看的顺序相反,如果想要顺序一致,可以使用rpush命令

    RPUSH
    1. 20.0.0.170:6379> rpush zzr1 1 2 3 a b c d
    2. (integer) 7
    3. 20.0.0.170:6379> LRANGE zzr1 0 -1
    4. 1) "1"
    5. 2) "2"
    6. 3) "3"
    7. 4) "a"
    8. 5) "b"
    9. 6) "c"
    10. 7) "d"

    添加

    l---从左(上)往右添加

    r---从右(下)往左添加

    1. 20.0.0.170:6379> lpush zzr1 10
    2. (integer) 8
    3. 20.0.0.170:6379> LRANGE zzr1
    4. (error) ERR wrong number of arguments for 'lrange' command
    5. 20.0.0.170:6379> LRANGE zzr1 0 -1
    6. 1) "10"
    7. 2) "1"
    8. 3) "2"
    9. 4) "3"
    10. 5) "a"
    11. 6) "b"
    12. 7) "c"
    13. 8) "d"
    14. 20.0.0.170:6379> rpush zzr1 100
    15. (integer) 9
    16. 20.0.0.170:6379> LRANGE zzr1 0 -1
    17. 1) "10"
    18. 2) "1"
    19. 3) "2"
    20. 4) "3"
    21. 5) "a"
    22. 6) "b"
    23. 7) "c"
    24. 8) "d"
    25. 9) "100"

    5.删除   lpop/rpop

    lpop:从左(上)删
    rpop:从右(下)删
    1. 20.0.0.170:6379> LPOP zzr1
    2. "10"
    3. 20.0.0.170:6379> LRANGE zzr1 0 -1
    4. 1) "1"
    5. 2) "2"
    6. 3) "3"
    7. 4) "a"
    8. 5) "b"
    9. 6) "c"
    10. 7) "d"
    11. 8) "100"
    12. 20.0.0.170:6379> RPOP zzr1
    13. "100"
    14. 20.0.0.170:6379> LRANGE zzr1 0 -1
    15. 1) "1"
    16. 2) "2"
    17. 3) "3"
    18. 4) "a"
    19. 5) "b"
    20. 6) "c"
    21. 7) "d"

    指定索引下标修改 lset/linsert

    1. 20.0.0.170:6379> lset zzr1 3 www
    2. OK
    3. 20.0.0.170:6379> LRANGE zzr1 0 -1
    4. 1) "1"
    5. 2) "2"
    6. 3) "3"
    7. 4) "www"
    8. 5) "b"
    9. 6) "c"
    10. 7) "d"

    指定位置插入

    1. 20.0.0.170:6379> LINSERT zzr1 before 3 aaa
    2. (integer) 8
    3. 20.0.0.170:6379> LRANGE zzr1 0 -1
    4. 1) "1"
    5. 2) "2"
    6. 3) "aaa"
    7. 4) "3"
    8. 5) "www"
    9. 6) "b"
    10. 7) "c"
    11. 8) "d"

    3.hash类型

    hash类型用于存储对象,采用hash格式来进行操作。占用的磁盘空间少,而且一个hash可以存储4294967295个键值对

     HSET/HGET/HDEL/HEXISTS/HLEN/HSETNX

    添加
    1. 20.0.0.170:6379> hset zzr2 tall 190
    2. (integer) 1
    3. 20.0.0.170:6379> hget zzr2 tall
    4. "190"
    5. 20.0.0.170:6379> hset zzr2 face smart
    6. (integer) 1
    7. 20.0.0.170:6379> hmget zzr2 tall face
    8. 1) "190"
    9. 2) "smart"

    删除
    1. 20.0.0.170:6379> hset zzr2 age 21
    2. (integer) 1
    3. 20.0.0.170:6379> hdel zzr2 tall face
    4. (integer) 2
    5. 20.0.0.170:6379> hmget zzr2 tall face age
    6. 1) (nil)
    7. 2) (nil)
    8. 3) "21"

    查询所有字段
    1. 20.0.0.170:6379> hmset zzr3 tall 180 stu 123 score 90
    2. OK
    3. 20.0.0.170:6379> hgetall zzr3
    4. 1) "tall"
    5. 2) "180"
    6. 3) "stu"
    7. 4) "123"
    8. 5) "score"
    9. 6) "90"

    查询所有键
    1. 20.0.0.170:6379> hgetall zzr3
    2. 1) "tall"
    3. 2) "180"
    4. 3) "stu"
    5. 4) "123"
    6. 5) "score"
    7. 6) "90"
    8. 20.0.0.170:6379> HKEYS zzr3
    9. 1) "tall"
    10. 2) "stu"
    11. 3) "score"

    所有值

    1. 20.0.0.170:6379> hvals zzr3
    2. 1) "180"
    3. 2) "123"
    4. 3) "90"

    删除方式还是del

    !!!hmset创建时,一定要一个键对应一个键值,否则会因为缺少参数而报错

    4.set数据类型

    set数据类型(无须集合)元素类型也是string。元素是唯一的,不允许重复。多个集合类型可以进行并集,交集,差集进行运算。

    set当中的元素类型是唯一的,可以根据一些唯一性的数据。比如访问微博的用户名,只要把对应名称写入redis,set集合会自动保存唯一性,方便下一次访问。

    1. 20.0.0.170:6379> sadd myset a a c
    2. (integer) 2
    3. 20.0.0.170:6379> SMEMBERS myset
    4. 1) "a"
    5. 2) "c"

    不能重复,所以只保存2个

    查询   1-----存在    0------不存在

    1. 20.0.0.170:6379> SMEMBERS myset
    2. 1) "a"
    3. 2) "c"
    4. 20.0.0.170:6379> SISMEMBER myset c
    5. (integer) 1
    6. 20.0.0.170:6379> SISMEMBER myset f
    7. (integer) 0

    spop myset 随机移除一个

    1. 20.0.0.170:6379> spop myset
    2. "c"
    3. 20.0.0.170:6379> spop myset
    4. "a"

    SRANDMEMBER myset 随机查询一个

    1. 20.0.0.170:6379> sadd myset a b c d e f g
    2. (integer) 7
    3. 20.0.0.170:6379> SRANDMEMBER myset
    4. "e"
    5. 20.0.0.170:6379> SRANDMEMBER myset
    6. "g"
    7. 20.0.0.170:6379> SRANDMEMBER myset
    8. "b"

    指定移除  srem myset 【】 【】 【】

    1. 20.0.0.170:6379> SMEMBERS myset
    2. 1) "a"
    3. 2) "d"
    4. 3) "e"
    5. 4) "b"
    6. 5) "c"
    7. 6) "f"
    8. 7) "g"
    9. 20.0.0.170:6379> srem myset a b c
    10. (integer) 3
    11. 20.0.0.170:6379> SMEMBERS myset
    12. 1) "d"
    13. 2) "e"
    14. 3) "f"
    15. 4) "g"

    5.有序集合

    有序集合,元素类型也是string,元素唯一,不能重复。

    每个元素都会关联一个double(小数点)的分数(score,表示权重),可以通过权重的大小进行排序。元素的权重可以相同

    zset:可以运用在一些 在线积分的排行榜,可以实时更新用户的分数和排名。

    zrange命令获取比如积分top10的用户

    zrank命令通过用户的名称来获取玩家的信息。按照权重来排列

    权重是1,元素是one

    1. 20.0.0.170:6379> zadd myzset 1 one
    2. (integer) 1
    3. 20.0.0.170:6379> ZRANGE myzset 0 -1 withscores
    4. 1) "one"
    5. 2) "1"
    6. 20.0.0.170:6379> ZRANGE myzset 0 -1
    7. 1) "one"

    加withscores显示权重,不加只显示元素

    查询元素

    无序集合一样,0为第一位

    1. 20.0.0.170:6379> zrank myzset one
    2. (integer) 0
    3. 20.0.0.170:6379> zrank myzset two
    4. (integer) 1
    5. 20.0.0.170:6379> zrank myzset three
    6. (integer) 2

    统计权重在1--2范围之内的个数---zcard/zocount

    1. 20.0.0.170:6379> zcount myzset 1 2
    2. (integer) 2
    3. 20.0.0.170:6379> zcard myzset
    4. (integer) 3

    查看权重--zscore
    1. 20.0.0.170:6379> zscore myzset two
    2. "2"

    set和hset 创建普通类型和hash类型,一般情况下,如无特殊需求,普通的创建方式即可

    对一个键进行多字段存储,节省内存,使用hash方式。

    如何对已有keys重命名

    重命名之后,内部值不变

    当前库 键的数量

    redis的库 都是创建好的,16个库

    数字排名 0-15 每个数据库之间互相独立,互补干扰

    select用来切换库

    move移动数据,移动之后,原先的库数据就没了,转移到新库

    设置密码

    auth 123456 在内声明

    在外声明-------端口后 -a 密码

    删除库--使用注意,缝纫机警告⚠!!!!!

    删除当前库

    flushall-----删除所有库

    缝纫机警告⚠

  • 相关阅读:
    springboot+电子族谱信息系统 毕业设计-附源码161714
    34. 干货系列从零用Rust编写负载均衡及代理,异步测试在Rust中的实现
    idea中dataBase模板生成
    精选20个爆火的Python实战项目(含源码),直接拿走不谢
    栈、队列应用
    【LeetCode-中等题】210. 课程表 II
    介绍grpc
    MYSQL--未提交(read uncommitted)、读已提交(read committed)和repeatable read(可重复读)
    20240425金融读报:银行绿色数据收集ESG&银行物联网智慧贵金属案例
    VME-7807RC-414001 350-93007807-414001 VMIVME-017807-411001 VMIVME-017807-414001
  • 原文地址:https://blog.csdn.net/qq_51506982/article/details/134506063