redis非关系型数据库,缓存型数据库
关系型数据库是一个结构化的数据库。
记录方式:行和列
行的作用:记录对象的属性
列的作用:声明对象
表与表之间是有关联的:外键关联、左连接、右连接、内连接。使用sql语句,来对指定的表、库进行增删改查。
在创建表时,设计好了表的结构。按照表结构存储数据。数据与表结构不匹配那么存储数据会失败。
非关系型数据库:nosql not only sql
非关系型数据库不需要定义库也不需要定义表的结构,而且直接记录即可,每条记录可以有不同的数据类型、字段。甚至字段个数都可以自定义。
redis key:value 键值对形式存储。每个键之间没有直接关联。库与库之间互相独立。
1、 存储方式不同:关系型数据库需要提前声明数据类型。非关系型则不需要提前声明数据类型。是键值对形式存储。
2、 扩展方式,性能上的提升。关系型数据库靠的是提升本机性能。非关系型数据库,可以横向扩展,加入节点服务器的方式提高性能。
3、 对事务的支持性不同:原子性:最小单元、隔离性:一个事务执行不能被其他事务干扰、一致性:前后数据保持一致,保证诗句完整性、持久性:一旦写入不可更改
非关系型数据库也可以支持事务,但是其稳定性和处理能力都不如关系型数据库。
1、 操作的扩展性
2、 大数据量处理(海量数据处理)
web2.0的核心作用:交互
纯动态网站的三高问题:
1、 对数据库高并发读写的需求
2、 对海量数据高效存储与访问的需求
3、 对数据库的高可扩展性与高可用性的需求
常见的缓存需求场景:数据库缓存、web页面缓存、cpu和硬盘之间的缓存
非关系型数据库缓存工作流程图:

关系型数据库:
库--->---表---->---行,列--->----存储数据
非关系型数据库:
库---->---集合---->键值对
非关系型数据库不需要手动创建库和集合(本身自带)
夹在两个应用程序之间就是中间键
redis是开源的,使用c语言编写的NQL数据库。
redis基于内存运行,支持持久化(数据恢复)。采用key-value(键值对)的存储形式。目前在分布式架构中,非常重要的一环。
redis的数据流向和工作流程架构图:

redis服务器程序是一个单进程模式。即只有一个主进程工作。也就是说可以在一台服务器上启动多个redis。需要注意端口号不能冲突
1、 redis的实际处理速度,是完全依靠主进程的执行效率。
2、 服务器只部署了一个redis进程,多个客户端访问可能会导致redis的处理能力下降。
3、 如果部署了多个redis进程虽热能提高redis的并发处理能力,但是会给服务器cpu带来很大的压力。
工作中,一台服务器,一般部署3个redis进程。(视情况而定)一般情况单进程足够了。
1、 具有极高的读写速度,数据读取支持每秒11万次。写入数据支持每秒执行8万1千次写入。
2、 可以支持丰富的数据类型。
3、 支持持久化。平常的数据都是保存在内存中。持久化可以写入到磁盘中。既可以保存到本地也可也实现备份。
4、 原子性:最小单位。redis所有的操作都是原子性。要么都成功要么都失败
5、 支持主从模式实现数据同步。master-slave模式
- tar -xf redis
- #解压redis安装包
- make -j4
- #编译
- make PREFIX=/usr/local/redis install
- #指定安装位置
- cd utils
- ./install_server.sh
- 默认端口号回车
- 指定配置文件默认回车
- 指定日志文件路径默认回车
- 指定数据文件路径默认回车
- 指定工作目录:/usr/local/redis/bin/redis-server
- ln -s /usr/local/redis/bin/* /usr/local/bin/
- #创建一个软连接
- netstat -antp | grep redis
- #查看一下redis端口是否启动成功
-
-
- redis安装成功!
redis的服务为控制命令:
- /etc/init.d/redis_6379
- /etc/init.d/redis_6379 stop
- #停止redis服务
-
- /etc/init.d/redis_6379 start
- #启动redis服务
-
- /etc/init.d/redis_6379 restart
- #重启redis服务
-
- /etc/init.d/redis_6379 status
- #查看redis的状态
-
- vim /etc/redis/6379.conf
- 70行添加本机的ip即可
redis的命令工具:
- redis-server
- #可以直接启动redis
-
- redis-benchmark
- #检测redis在本机的运行效率
-
- redis-cli
- #命令行工具
-
- redis-check-aof
- #检测持久化文件AOF文件是否正常
-
- redis-check-rbd
- #检测持久化文件RBD文件是否正常
redis-benchmark的语法:检测redis在本机的运行效率
- redis-benchmark -h
- #指定服务器的主机名 ip地址
-
- redis-benchmark -p
- #指定服务器的端口号
-
- redis-benchmark -c
- #指定并发连接数
-
- redis-benchmark -n
- #指定请求数
- redis-cli -h 本机ip -p 端口号
- redis-cli -h 20.0.0.26 -p 6379
- #进入redis
-
- redis-cli
- #仅限于本地,远程登录还是需要指定目标服务器的ip地址
-
- redis-cli -h 20.0.0.26 -p 6379
- #-h 指定IP地址
- #-p 指定端口号
- #-a 指定登录密码
- KEYS *
- #查看有哪些键
-
- set 键名 值
- set test zyg
- #set给键起个名字
-
- get 键名
- get test
- #查询键的值
-
- set test 10
- #可以直接替换键内部的值
-
- keys 键名
- keys test
- #模糊查询法
-
- keys t*
- #模糊查询法任意长度(生产中尽量别用*)
-
- keys t?
- #以t开头后面任意1位的键
-
- keys t??
- #以t开头后面意义2位置的键

- exists 键名
- exists test
- #判断键名是否存在。返回1表示存在,返回0表示不存在
-
- del 键名 键名
- del t1 t22
- #删除键,可以一次1个也可也一次多个

- type 键名
- type test
- #查看键值对的类型
-
- append 键名 值
- append test1 hello
- #如果键不存在,直接返回键的长度
-
- append test1 world
- #如果键已经存在,会拼接起来,返回拼接后的总长度
-
- strlen 键名
- strlen test1
- #直接返回键的长度

- set 键名 值
- set test1 10
- #可以直接覆盖键的值
-
- get test1
- incr 键名
- incr test1
- #自增1
-
- decr 键名
- decr test1
- #自减1
-
- 只能对数字类型进行操作

- set test1 15
- decrby 键名 值
- decrby test1 10
- #对指定数值进行减少
-
- incrby 键名 值
- incrby test1 20
- #对指定数值增加
-
- get test1

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

- mset 键名1 值 键名2 值
- mset key1 hello key2 world
- #批量设置键
-
- keys *
- #查看键
-
- mget 键名1 键名2
- mget key1 key2
- #同时打印多个键的值

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

- lpushx 键名 值
- lpushx guoqi1 10
- #共左插入
-
- lrange 键名 范围
- lrange guoqi1 0 -1
- #通过索引下标范围查看
-
- rpushx guoqi1 5
- #从右插入
-
- lrange guoqi1 0 -1
- #通过索引下标范围查看

- lpop 键名
- lpop guoqi1
- #从左边开始删
-
- lrange guoqi1 0 -1
- #范围查看键值对内部的值
-
- rpop 键名
- rpop guoqi1
- #从右边开始删
-
- lrange guoqi1 0 -1
-
- llen 键名
- llen guoqi1
- #查询列表内的元素
-
- lindex 键名 索引下标
- lindex guoqi1 3
- #指定索引下标查询
-
- lrange guoqi1 0 -1
-
- linsert 键名 before 索引下标范围
- linsert guoqi1 before 3 10
- #在指定位置前插入数据
-
- lrange guoqi1 0 -1

- hset 键名 字段 值
- hset zyg2 tall yes
- #创建一个hash类型的数据
-
- hget 键名 字段
- hget zyg2 tall
- #打印tall的值
-
- hset 键名 字段 值
- hset zyg2 hangsan yes
- #添加1个字段
-
- hmget 键名 字段 字段
- hmget zyg2 tall handsan
- #批量打印字段
-
- hset 键名 字段 值
- hset zyg2 age 20
- #再添加一个字段
-
- hmget 键名 字段 字段 字段
- hmget zyg2 tall hangdsan age
- #一次性打印多个字段

- hdel 键名 字段
- hdel zyg2 hangsan
- #删除单个字段
-
- hdel 键名 字段 字段
- hdel zyg2 tall age
- #删除多个字段
-
- hmget 键名 字段 字段 字段
- hmget zyg2 tall hangsan age
- #差选多个字段

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

- hgetall 键名
- hgetall zyg3
- #查看键的字段和值
-
- hkeys 键名
- hkeys zyg3
- #当前键值对的字段名
-
- hvals 键名
- hvals zyg3
- #当前键值对的值

- del zyg3
- #删除键值对

set当中的元素类型是唯一的,可以跟踪一些唯一的数据。访问微博的用户名。访问微博的用户名,只要把对饮名称redis,set集合可以自动保存唯一性,方便下一次的访问
创建集合
- flushall
- #清除所有库的所有内容
-
- sadd 集合名 值
- sadd myset a a c
- #创建无序集合myset并创建成员
-
- smembers 集合名
- SMEMBERS myset
- #查看成员信息
-
- 合集中不能插入重复数据!

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

- srandmember 集合名
- SRANDMEMBER myset
- #随机返回一个值
-
- spop 集合名
- spop myset
- #随机移除一个值
-
- srem 集合名 值
- srem myset a e f
- #指定值删除
-
- smembers 集合名
- SMEMBERS myset
- #查看合集的内容

每个元素都会关联一个double(小数点)的分数(score,表示权重)通过权重大小。进行排序。元素的权重可以相同。
zset:运用在在线积分的排行榜,可以实时跟新用户的分数和排名。
zrange命令返回积分top10的用户。zrank命令通过username来获取用户的排行信息。
通过权重来排列
创建有序集合
- zadd 集合名 权重 元素
- zadd myzset 1 "one"
- #创建有序集合myzset 权重是1 元素是one
-
- zadd 集合名 权重 元素 权重 元素
- zadd myzset 2 two 3 three
- #创建多个元素
-
- zrange 集合名 索引下标范围 WITHSCORES
- zrange myzset 0 -1 WITHSCORES
- #打印所有元素
- #不加WITHSCORES是只显示元素
- #加WITHSCORES是权重和元素都显示

- zrank 集合名 元素
- zrank myzset one
- #查看位置索引
-
- zrank 集合名 元素
- zrank myzset fore
- #如果成员不存在返回nil
-
- zcard 集合名
- zcard myzset
- #查询成员数量
-
- zcont 集合名 权重范围
- zcount myzset 1 2
- #表示查询权重的范围
- #查询权重1-2的范围之内的成员数量
-
- 表示权重范围:1<=score<=3

- zrem 集合名 元素
- zrem myzset three
- #删除成员
-
- zrange 集合名 索引下标范围 withscores
- zrange myzset 0 -1 withscores
- #查看所有成员,查看删除后的结果
-
- zscore 集合名 元素
- zscore myzset two
- #查看权重

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

redis的库都是创建好的,有16个库
数字排名:0-15
每个数据库之间互相独立,互不干扰
- dbsize
- #查看当前库中键的数量
-
- keys *
-
- select 库的序号
- select 1
- #切换库
-
- keys *
-
- redis库是按照数字排列的:0-15 一共16个 初始位置默认是0库

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

- config set requirepass 密码
- config set requirepass 123456
- #创建redis的密码
- 可以进入redis的库但是看不到库
-
- auth 123456
- #在内声明密码
-
- redis-cli -h 20.0.0.26 -p 6379 -a 123456
- #在外声明密码
- #-h指定ip地址
- #-p指定端口
- #-a指定密码

- flushdb
- #清空当前库
- flushall
- #清空所有库
-
- 不建议使用了解即可!

redis的特点:读写速度快
数据类型:
1、 string(包含所有,不只是字符串)
2、 list
3、 hash 对一个键进行多字段操作要用hash 节省内存空间。只要没有持久化之前都是保存在内存当中的。
4、 无序集合 set 元素不能重复,可以用来定义唯一值
5、 有序集合zset 元素不能重复,但是权重可以相同。可以用来排名
redis快的原因是什么?
1、 redis是纯内存结构。避免了磁盘I/O的耗时
2、 redis只有一个主进程,没有其他的限制。核心模块是一个单进程,减少了线程切换和回收线程资源的事件。
3、 实现I/O的多路复用机制。每一个执行线路都可以同时执行读和写。高并发的效率大大提高。
特殊说明:redis的读写仍然是单进程处理