• redis非关系型数据库


    redis非关系型数据库,缓存型数据库

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

    关系型数据库

    关系型数据库是一个结构化的数据库。

    记录方式:行和列

    行的作用:记录对象的属性

    列的作用:声明对象

    表与表之间是有关联的:外键关联、左连接、右连接、内连接。使用sql语句,来对指定的表、库进行增删改查。

    在创建表时,设计好了表的结构。按照表结构存储数据。数据与表结构不匹配那么存储数据会失败。

    非关系型数据库

    非关系型数据库:nosql not only sql

    非关系型数据库不需要定义库也不需要定义表的结构,而且直接记录即可,每条记录可以有不同的数据类型、字段。甚至字段个数都可以自定义。

    redis key:value 键值对形式存储。每个键之间没有直接关联。库与库之间互相独立。

    区别

    1、 存储方式不同:关系型数据库需要提前声明数据类型。非关系型则不需要提前声明数据类型。是键值对形式存储

    2、 扩展方式,性能上的提升。关系型数据库靠的是提升本机性能。非关系型数据库,可以横向扩展,加入节点服务器的方式提高性能

    3、 对事务的支持性不同:原子性:最小单元、隔离性:一个事务执行不能被其他事务干扰、一致性:前后数据保持一致,保证诗句完整性、持久性:一旦写入不可更改

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

    非关系型数据库的主要场景

    1、 操作的扩展性

    2、 大数据量处理(海量数据处理)

    非关系型数据库产生的原因

    web2.0的核心作用:交互

    纯动态网站的三高问题:

    1、 对数据库高并发读写的需求

    2、 对海量数据高效存储与访问的需求

    3、 对数据库的高可扩展性与高可用性的需求

    常见的缓存需求场景:数据库缓存、web页面缓存、cpu和硬盘之间的缓存

    非关系型数据库缓存工作流程图:

    总结

    关系型数据库:

    库--->---表---->---行,列--->----存储数据

    非关系型数据库:

    库---->---集合---->键值对

    非关系型数据库不需要手动创建库和集合(本身自带)

    夹在两个应用程序之间就是中间键

    什么是redis?

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

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

    redis的数据流向和工作流程架构图:

    redis的工作特点

    redis服务器程序是一个单进程模式。即只有一个主进程工作。也就是说可以在一台服务器上启动多个redis。需要注意端口号不能冲突

    1、 redis的实际处理速度,是完全依靠主进程的执行效率。

    2、 服务器只部署了一个redis进程,多个客户端访问可能会导致redis的处理能力下降。

    3、 如果部署了多个redis进程虽热能提高redis的并发处理能力,但是会给服务器cpu带来很大的压力。

    工作中,一台服务器,一般部署3个redis进程。(视情况而定)一般情况单进程足够了。

    redis的特点

    1、 具有极高的读写速度,数据读取支持每秒11万次。写入数据支持每秒执行8万1千次写入。

    2、 可以支持丰富的数据类型。

    3、 支持持久化。平常的数据都是保存在内存中。持久化可以写入到磁盘中。既可以保存到本地也可也实现备份。

    4、 原子性:最小单位。redis所有的操作都是原子性。要么都成功要么都失败

    5、 支持主从模式实现数据同步。master-slave模式

    redis部署

    1. tar -xf redis
    2. #解压redis安装包
    3. make -j4
    4. #编译
    5. make PREFIX=/usr/local/redis install
    6. #指定安装位置
    7. cd utils
    8. ./install_server.sh
    9. 默认端口号回车
    10. 指定配置文件默认回车
    11. 指定日志文件路径默认回车
    12. 指定数据文件路径默认回车
    13. 指定工作目录:/usr/local/redis/bin/redis-server
    14. ln -s /usr/local/redis/bin/* /usr/local/bin/
    15. #创建一个软连接
    16. netstat -antp | grep redis
    17. #查看一下redis端口是否启动成功
    18. redis安装成功!

    redis进行服务控制命令

    redis的服务为控制命令:

    1. /etc/init.d/redis_6379
    2. /etc/init.d/redis_6379 stop
    3. #停止redis服务
    4. /etc/init.d/redis_6379 start
    5. #启动redis服务
    6. /etc/init.d/redis_6379 restart
    7. #重启redis服务
    8. /etc/init.d/redis_6379 status
    9. #查看redis的状态
    10. vim /etc/redis/6379.conf
    11. 70行添加本机的ip即可

    redis的命令工具:

    1. redis-server
    2. #可以直接启动redis
    3. redis-benchmark
    4. #检测redis在本机的运行效率
    5. redis-cli
    6. #命令行工具
    7. redis-check-aof
    8. #检测持久化文件AOF文件是否正常
    9. redis-check-rbd
    10. #检测持久化文件RBD文件是否正常

    redis-benchmark的语法:检测redis在本机的运行效率

    1. redis-benchmark -h
    2. #指定服务器的主机名 ip地址
    3. redis-benchmark -p
    4. #指定服务器的端口号
    5. redis-benchmark -c
    6. #指定并发连接数
    7. redis-benchmark -n
    8. #指定请求数

    redis的数据类型

    如何进入redis?

    1. redis-cli -h 本机ip -p 端口号
    2. redis-cli -h 20.0.0.26 -p 6379
    3. #进入redis
    4. redis-cli
    5. #仅限于本地,远程登录还是需要指定目标服务器的ip地址
    6. redis-cli -h 20.0.0.26 -p 6379
    7. #-h 指定IP地址
    8. #-p 指定端口号
    9. #-a 指定登录密码

    redis五大数据类型

    1、 string(字符串):是redis最基本的类型,最大能存储512MB的数据,可以存储任何数据

    查询键值对和修改键值对名
    1. KEYS *
    2. #查看有哪些键
    3. set 键名 值
    4. set test zyg
    5. #set给键起个名字
    6. get 键名
    7. get test
    8. #查询键的值
    9. set test 10
    10. #可以直接替换键内部的值
    11. keys 键名
    12. keys test
    13. #模糊查询法
    14. keys t*
    15. #模糊查询法任意长度(生产中尽量别用*)
    16. keys t?
    17. #以t开头后面任意1位的键
    18. keys t??
    19. #以t开头后面意义2位置的键

    查询键值对是否存在和删除键指定键
    1. exists 键名
    2. exists test
    3. #判断键名是否存在。返回1表示存在,返回0表示不存在
    4. del 键名 键名
    5. del t1 t22
    6. #删除键,可以一次1个也可也一次多个

    查询键值对的类型和长度
    1. type 键名
    2. type test
    3. #查看键值对的类型
    4. append 键名 值
    5. append test1 hello
    6. #如果键不存在,直接返回键的长度
    7. append test1 world
    8. #如果键已经存在,会拼接起来,返回拼接后的总长度
    9. strlen 键名
    10. strlen test1
    11. #直接返回键的长度

    键值对的自增和自减
    1. set 键名 值
    2. set test1 10
    3. #可以直接覆盖键的值
    4. get test1
    5. incr 键名
    6. incr test1
    7. #自增1
    8. decr 键名
    9. decr test1
    10. #自减1
    11. 只能对数字类型进行操作

    对指定数值进行增加和减少
    1. set test1 15
    2. decrby 键名 值
    3. decrby test1 10
    4. #对指定数值进行减少
    5. incrby 键名 值
    6. incrby test1 20
    7. #对指定数值增加
    8. get test1

    声明键值对的生命周期
    1. setex 键名 值 lo
    2. setex test2 5 lo
    3. #新建时声明键值对的声明周期
    4. ttl 键名
    5. ttl test2
    6. #查看键值对的生命周期 -2代表键值对已经失效-1表示永不过期
    7. expire 键名 时间(秒)
    8. expire test 30
    9. #对已有键值对修改生命周期 30秒

    批量创建键值对
    1. mset 键名1 值 键名2 值
    2. mset key1 hello key2 world
    3. #批量设置键
    4. keys *
    5. #查看键
    6. mget 键名1 键名2
    7. mget key1 key2
    8. #同时打印多个键的值

    2、 list数据类型:列表。但是列表当中的元素还是string类型

    创建列表
    1. lpush 键名 值
    2. lpush zyg a b c d 1 2 3
    3. #创建列表 后面时内容,但是当中的元素还是string类型
    4. lrange 键名 范围
    5. lrange zyg 0 -1
    6. #查看列表中的数据(倒叙)
    7. lindex 键名 索引下标
    8. lindex zyg 0
    9. lindex zyg 4
    10. #根据索引下标打印数据
    11. rpush 键名 值
    12. rpush guoqi1 1 2 3 4
    13. #创建列表正序查看
    14. lrange guoqi1 0 -1
    15. #正序查看
    16. lrange guo1i1 1 2
    17. #指定范围查看

    对列表插入值
    1. lpushx 键名 值
    2. lpushx guoqi1 10
    3. #共左插入
    4. lrange 键名 范围
    5. lrange guoqi1 0 -1
    6. #通过索引下标范围查看
    7. rpushx guoqi1 5
    8. #从右插入
    9. lrange guoqi1 0 -1
    10. #通过索引下标范围查看

    删除列表内的值
    1. lpop 键名
    2. lpop guoqi1
    3. #从左边开始删
    4. lrange guoqi1 0 -1
    5. #范围查看键值对内部的值
    6. rpop 键名
    7. rpop guoqi1
    8. #从右边开始删
    9. lrange guoqi1 0 -1
    10. llen 键名
    11. llen guoqi1
    12. #查询列表内的元素
    13. lindex 键名 索引下标
    14. lindex guoqi1 3
    15. #指定索引下标查询
    16. lrange guoqi1 0 -1
    17. linsert 键名 before 索引下标范围
    18. linsert guoqi1 before 3 10
    19. #在指定位置前插入数据
    20. lrange guoqi1 0 -1

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

    创建hash类型的数据
    1. hset 键名 字段 值
    2. hset zyg2 tall yes
    3. #创建一个hash类型的数据
    4. hget 键名 字段
    5. hget zyg2 tall
    6. #打印tall的值
    7. hset 键名 字段 值
    8. hset zyg2 hangsan yes
    9. #添加1个字段
    10. hmget 键名 字段 字段
    11. hmget zyg2 tall handsan
    12. #批量打印字段
    13. hset 键名 字段 值
    14. hset zyg2 age 20
    15. #再添加一个字段
    16. hmget 键名 字段 字段 字段
    17. hmget zyg2 tall hangdsan age
    18. #一次性打印多个字段

    删除一个或多个
    1. hdel 键名 字段
    2. hdel zyg2 hangsan
    3. #删除单个字段
    4. hdel 键名 字段 字段
    5. hdel zyg2 tall age
    6. #删除多个字段
    7. hmget 键名 字段 字段 字段
    8. hmget zyg2 tall hangsan age
    9. #差选多个字段

    一次性创建多个值
    1. hmset 键名 字段 值 字段 值 字段 值 字段 值
    2. hmset zyg3 tall 1 rich 2 age 23 fcz 500
    3. #一次性创建多个字段
    4. hmget 键名 字段 字段 字段 字段
    5. hmget zyg3 tall rich age fcz
    6. #一次性打印多个名称和值

    直接查看键值对的所有字段和值
    1. hgetall 键名
    2. hgetall zyg3
    3. #查看键的字段和值
    4. hkeys 键名
    5. hkeys zyg3
    6. #当前键值对的字段名
    7. hvals 键名
    8. hvals zyg3
    9. #当前键值对的值

    删除键值对
    1. del zyg3
    2. #删除键值对

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

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

    创建集合

    1. flushall
    2. #清除所有库的所有内容
    3. sadd 集合名 值
    4. sadd myset a a c
    5. #创建无序集合myset并创建成员
    6. smembers 集合名
    7. SMEMBERS myset
    8. #查看成员信息
    9. 合集中不能插入重复数据!

    查看合集中值是否存在

    1. sismember 键名 值
    2. sismember myset c
    3. #查看合集中数据是否存在
    4. 1表示存在0表示不存在

    随机返回和移除
    1. srandmember 集合名
    2. SRANDMEMBER myset
    3. #随机返回一个值
    4. spop 集合名
    5. spop myset
    6. #随机移除一个值
    7. srem 集合名 值
    8. srem myset a e f
    9. #指定值删除
    10. smembers 集合名
    11. SMEMBERS myset
    12. #查看合集的内容

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

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

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

    zrange命令返回积分top10的用户。zrank命令通过username来获取用户的排行信息。

    通过权重来排列

    创建有序集合

    1. zadd 集合名 权重 元素
    2. zadd myzset 1 "one"
    3. #创建有序集合myzset 权重是1 元素是one
    4. zadd 集合名 权重 元素 权重 元素
    5. zadd myzset 2 two 3 three
    6. #创建多个元素
    7. zrange 集合名 索引下标范围 WITHSCORES
    8. zrange myzset 0 -1 WITHSCORES
    9. #打印所有元素
    10. #不加WITHSCORES是只显示元素
    11. #加WITHSCORES是权重和元素都显示

    获取集合中的位置索引
    1. zrank 集合名 元素
    2. zrank myzset one
    3. #查看位置索引
    4. zrank 集合名 元素
    5. zrank myzset fore
    6. #如果成员不存在返回nil
    7. zcard 集合名
    8. zcard myzset
    9. #查询成员数量
    10. zcont 集合名 权重范围
    11. zcount myzset 1 2
    12. #表示查询权重的范围
    13. #查询权重1-2的范围之内的成员数量
    14. 表示权重范围:1<=score<=3

    如何删除成员和查看权重
    1. zrem 集合名 元素
    2. zrem myzset three
    3. #删除成员
    4. zrange 集合名 索引下标范围 withscores
    5. zrange myzset 0 -1 withscores
    6. #查看所有成员,查看删除后的结果
    7. zscore 集合名 元素
    8. zscore myzset two
    9. #查看权重

    如何对已有key进行重命名

    set和hset:创建普通类型和hash类型,一般情况下,如无特殊需求,普通的创建方式即可,对一个键进行多字段存储,节省内存,使用hash方式。(一般工作中set足够)

    1. set test 10
    2. get test
    3. rename 键名 新键名
    4. rename test zygg
    5. #对键重命名

    查询redis库

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

    数字排名:0-15

    每个数据库之间互相独立,互不干扰

    1. dbsize
    2. #查看当前库中键的数量
    3. keys *
    4. select 库的序号
    5. select 1
    6. #切换库
    7. keys *
    8. redis库是按照数字排列的:0-15 一共16个 初始位置默认是0库

    移动键到其他库

    1. move 键名 库的序号
    2. move guoqi1 1
    3. #把键移动到其他的库中

    创建密码

    1. config set requirepass 密码
    2. config set requirepass 123456
    3. #创建redis的密码
    4. 可以进入redis的库但是看不到库
    5. auth 123456
    6. #在内声明密码
    7. redis-cli -h 20.0.0.26 -p 6379 -a 123456
    8. #在外声明密码
    9. #-h指定ip地址
    10. #-p指定端口
    11. #-a指定密码

    如何清空当前库和所有库

    1. flushdb
    2. #清空当前库
    3. flushall
    4. #清空所有库
    5. 不建议使用了解即可!

    总结

    redis的特点:读写速度快

    数据类型:

    1、 string(包含所有,不只是字符串)

    2、 list

    3、 hash 对一个键进行多字段操作要用hash 节省内存空间。只要没有持久化之前都是保存在内存当中的。

    4、 无序集合 set 元素不能重复,可以用来定义唯一值

    5、 有序集合zset 元素不能重复,但是权重可以相同。可以用来排名

    补充

    redis快的原因是什么?

    1、 redis是纯内存结构。避免了磁盘I/O的耗时

    2、 redis只有一个主进程,没有其他的限制。核心模块是一个单进程,减少了线程切换和回收线程资源的事件。

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

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

  • 相关阅读:
    Springboot毕设项目校园靓拍网站7883cjava+VUE+Mybatis+Maven+Mysql+sprnig)
    海洋cms新手入门安装配置教程
    Golang单元测试举例
    实验室信息管理系统(LIMS)全套源码,ASP.NET Dotnet 3.5 +EXT.NET+MSSQL 2018
    高并发下秒杀促销活动,你必须知道的9个细节
    【Rust】自定义数据类型—结构体——Rust语言基础13
    Oracle数据库:oracle组函数,聚合函数,多行函数,avg,sum,min,max,count,group by,having
    如何修改CentOS登录时默认目录
    Spring Boot整合Swagger
    Shiro安全框架
  • 原文地址:https://blog.csdn.net/m0_75209491/article/details/134499643