redis非关系型数据库
redis非关系型数据库,缓存型数据库
关系型数据库和非关系型数据库的区别:
关系型数据库是一个机构化的数据库,行和列。
列:声明对象
行:记录对象的属性
表与表之间是有关联。使用sql语句,来对指定的表,库,进行增删改查
在创建表时,我们是设计好了表的结构。按照表结构来存储数据。数据与表结构不匹配,存储数据,会失败。
非关系型数据库:nosql not only sql
不需要定义库,也不需要定义表结构,直接记录即可,而且每条记录都可以有不同的数据类型,字段(字段个数)
redis key:value 键值对形式存储。每个键之间没有直接关联。库与库之间互相独立。
区别:
- 数据的存储方式不同
- 扩展方式,性能上的提升。关系型数据库靠的是提升本机性能。非关系型数据库,可以横向扩展,加入节点服务器的方式提高性能
- 对事务的支持性,mysql支持事务
原子性 隔离性 一致性 持久性
非关系型数据库也支持事务,redis也可以支持事务,但是稳定性和处理能力都不如关系型数据库。
非关系型数据的主要场景:1.操作的扩展
- 海量数据处理 ????????????
Web2.0主要功能:交互
纯动态网站的三高问题:
- 对数据库高并发读写的需求
- 对海量数据高效存储与访问的需求
- 对数据库的高可扩展性与高可用性的需求
数据库缓存:
Web页面缓存
cpu和硬盘之间缓存
常见的缓存需求场景
关系型数据库:
库————表————行,列————存储数据
非关系型数据库:
库————集合————键值对
不需要手动的创建库和集合
redis:开源的,使用c语言编写的NQL数据库
redis:基于内存的运行,支持持久化(数据恢复)。采用的就是key-value(键值对)的存储形式。目前在分布式架构中,非常重要的一环。
Redis服务器程序,是一个单进程模式,即只有一个主进程工作。也就是说在一台服务器上可以启动多个redis(端口号不能冲突)
Redis的实际处理速度是完全依靠主进程的执行效率。
服务器只部署了一个redis进程,多个客户端访问,可能会导致redis的处理能力下降
如果部署了多个redis进程,虽然能提高redis的并发处理能力,但是会给服务器的cpu带来很大的压力。
一台服务器,一般部署3个redis进程。(根据情况来看,高并发,要部署多个。一般的情况,单进程足够)
redis的特点:
- 具有极高的读写速度,数据读取每秒110000次,写入数据每秒可以执行81000的写入
- 支持丰富的数据类型
- 支持持久化。平常的数据都是保存在内存中,持久化可以写入到磁盘中,既可以保存到本地,也可以实现备份。
- 原子性,所有的操作都是原子性
- 支持主从模式——master-slave模式
redis为什么这么快?
- redis是纯内存结构,避免磁盘I/O的耗时
- 核心模块是一个单进程,减少了线程切换和回收线程的时间
- I/O的多路复用机制。每一个执行线路,都可以同时执行读和写,高并发的效率大大提高
**特殊说明:redis的读写,仍然是单进程处理
redis的源码编译安装
#关闭防火墙
?systemctl stop firewalld
?setenforce 0
?#安装环境依赖包
?yum install -y gcc gcc-c++ make
?#上传软件包并解压
?cd /opt
?tar zxvf redis-5.0.7.tar.gz -C /opt/
?cd /opt/redis-5.0.7
?#开2核编译安装,指定安装路径为/usr/local/redis
?make -j?2 && make install
make PREFIX=/usr/local/redis install
?#由于Redis源码包中直接提供了Makefile 文件,所以在解压完软件包后,不用先执行./configure 进行配置,可直接执行make与make install命令进行安装。
??
?#执行软件包提供的install_server.sh 脚本文件,设置Redis服务所需要的相关配置文件
?cd /opt/redis-5.0.7/utils
?./install_server.sh
?.......?#一直回车
??
?Please select the redis executable path [] /usr/local/redis/bin/redis-server
?#这里默认为/usr/local/bin/redis-server,需要手动修改为/usr/local/redis/bin/redis-server,注意要一次性正确输入
??
?Selected config:
?Port: 6379 ?????????????????????????????????????#默认侦听端口为6379
?Config file: /etc/redis/6379.conf ??????????????#配置文件路径
?Log file: /var/log/redis_6379.log ??????????????#日志文件路径
?Data dir : /var/lib/redis/6379 ?????????????????#数据文件路径
?Executable: /usr/local/redis/bin/redis-server ??#可执行文件路径
?Cli Executable : /usr/local/bin/redis-cli ??????#客户端命令工具
??
?#把redis的可执行程序文件放入路径环境变量的目录中便于系统识别
?ln -s /usr/local/redis/bin/* /usr/local/bin/
#当 install_server.sh 脚本运行完毕,Redis 服务就已经启动,默认监听端口为 6379
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 参数
vim /etc/redis/6379.conf
bind 127.0.0.1 192.168.120.10 #70行,添加 监听的主机地址
port 6379 #93行,Redis默认的监听端口
daemonize yes #137行,启用守护进程(后台运行)
pidfile /var/run/redis_6379.pid #159行,指定 PID 文件
loglevel notice #167行,日志级别
logfile /var/log/redis_6379.log #172行,指定日志文件
重启
/etc/init.d/redis_6379 restart
redis的命令工具:
redis-server:直接启动redis,只能启动
redis-benchmark:检测redis在本机的运行效率
redis-cli:命令行工具
redis-check-aof:检测AOF文件是否正常
redis-check-rdb:检测rdb文件是否正常
redis-benchmark:
-h:指定服务器的主机名IP地址
-p:指定服务器的端口号
-c:指定并发连接数
-n:指定请求数
如何进入redis
redis-cli -h192.168.120.110 -p 6379
-h:指定ip地址
-p:指定端口号
-a指定登录密码
#向 IP 地址为 192.168.120.110、端口为 6379 的 Redis 服务器发送 100 个并发连接与 100000 个请求测试性能
redis-benchmark -h 192.168.120.110 -p 6379 -c 100 -n 100000
#测试存取大小为 100 字节的数据包的性能
redis-benchmark -h 192.168.120.110 -p 6379 -q -d 100
#测试本机上 Redis 服务在进行 set 与 lpush 操作时的性能
redis-benchmark -t set,lpush -n 100000 -q
redis的数据类型 五大数据类型:
- string(字符串):也是redis最近本的类型,最大能存储512MB的数据,可以存储任何数据,数字,文字,图片等等。
- list数据类型
列表当中的元素还是string类型
- hash类型:
hash类型用于存储对象,采用hash格式来进行操作。占用的磁盘空间少,而且一个hash可以存储4294967295个键值对
- set数据类型(无序集合)元素类型也是string,元素是唯一的,不允许重复。多个集合类型可以进行并集。交集和差集运算。
set当中的元素类型是唯一的,可以跟踪一些唯一性的数据。访问微博的用户名。只要把对应名称redis,set集合可以启动保存唯一性方便下一次的访问
5. zset有序集合 ?元素类型也是string,元素唯一,不能重复
?????????????每个元素都会关联一个double(小数点)的分数(score,表示权重),可
通过权重的大小,进行排序,元素的权重可以相同
在线积分的排行榜,可以实时更新用户的分数。zrange命令回去积分top10的用户。zrank命令通过username来获取用户的排行信息
set和hset 创建普通类型和hash类型,一般情况下,如无特殊需求,普通的创建方式即可
对一个键进行多字段存储,节省内存,使用hash方式
String数据类型:
set:存放数据,命令格式为 set key value
get:获取数据,命令格式为 get key
# keys 命令可以取符合规则的键值列表,通常情况可以结合*、?等选项来使用。
#查看当前数据库中所有键
192.168.120.110:6379> keys *
#查看当前数据库中以 v 开头的数据
192.168.120.110:6379> keys v*
#查看当前数据库中以 v 开头后面包含任意一位的数据
192.168.120.110:6379> keys v?
#查看当前数据库中以 v 开头 v 开头后面包含任意两位的数据
192.168.120.110:6379> keys v??
# exists 命令可以判断键值是否存在。
exists ?键 ??
返回结果 为0 则为不存在,返回为1即为存在
删除键
del 键
type 命令可以获取 key 对应的 value 值类型
type 键
键值对追加
append test hello
#该键并不存在,因此append命令返回当前Value的长度
append test world
#该键已经存在,因此返回追加后Value的长度
get test
#通过get命令获取该键,以判断append的结果
查看键值长度
strlen test
set还可以直接覆盖原有值
INCR key:key值递增加1(key值必须为字符类型)
DECR key:key值递减1(key值必须为字符类型)
#减少指定的整数
decrby test 10
#增加指定的整数
incrby test 33
设置指定key的过期时间为seconds
setex key seconds value
192.168.120.110:6379> setex test1 5 lo
#设置指定Key的过期时间为5秒。
192.168.120.110:6379> ttl test1
(integer) 2
#通过tt1命令查看指定Key的剩余存活时间(秒数),0表示已经过期,-1表示永不过期。
192.168.120.110:6379> ttl test1
(integer) -2
#该ttl命令的返回值显示,该Key已经过期。
(integer)-2 表示已过期
(integer)-1 表示永不过期
对已有键值对设置生命周期
expire test?5
批量创建多个值对
redis 127.0.0.1:6379> mset key1 "hello" key2 "world" ???#批量设置了key1和key2两个键。
redis 127.0.0.1:6379> mget key1 key2 ???????????????????#批量获取了key1和key2两个键的值。
1) "hello"
2) "world"
?rename 命令是对已有 key 进行重命名。(覆盖)
renamenx ?源key 目标key
list数据类型:
正序插入查看:192.168.120.110:6379> rpush dym1 1 2 3 4
(integer) 4
192.168.120.110:6379> LRANGE dym1 0 -1
1) "1"
2) "2"
3) "3"
4) "4"
倒序插入查看:192.168.120.110:6379> lpush dym a b c d 1 2 3
(integer) 7
192.168.120.110:6379> LRANGE dym 0 -1
1) "3"
2) "2"
3) "1"
4) "d"
5) "c"
6) "b"
7) "a"
取从位置1开始到位置2结束的2个元素。
192.168.120.110:6379> LRANGE dym1 1 2
1) "2"
2) "3"
取链表中的全部元素,其中0表示第一个元素,-1表示最后一一个元素。
192.168.120.110:6379> LRANGE dym1 0 -1
获取索引值为4(头部的第二个元素)的元素值
192.168.120.110:6379> lindex dym 4
获取列表长度
192.168.120.110:6379> llen dym1
根据索引下标修改元素
在元素shuai的前面插入新元素2
在元素shuai的后面插入新元素4
hash数据类型:
创建hash类型的数据
hset 键名 字段 值
hset dym2 tall yes
创建多个值
hmset 键名 字段 值 字段 值 字段 值
hmset dym2 tall 1 rich 2 age 23
获取字段的值
hget 键名 字段
hget dym2 tall
获取所有字段和值
hgetall 键名
添加一个新的字段
hset 键名 字段 值
hset dym2 handsan yes
获取多个字段的值
hmget 键名 字段 字段
hmget dym2 tall handsan
删除单个字段
hdel 键名 字段
hdel dym2 handsan
删除多个字段
hdel 键名 字段 字段
hdel dym2 tall age
Set数据类型
flushall
#清除所有库的所有内容
#创建无序集合myset并创建成员(合集中不能插入重复数据!)
sadd 集合名 值
sadd myset a a c
?#查看成员信息
smembers 集合名
SMEMBERS myset
查看合集中数据是否存在
1表示存在0表示不存在
sismember 键名 值
sismember myset c
随机返回一个值
srandmember 集合名
SRANDMEMBER myset
随机移除一个值
spop 集合名
spop myset
指定值删除
srem 集合名 ?值
srem myset c?e f
查看合集的内容
smembers 集合名
SMEMBERS myset
zset数据类型:
创建有序集合myzset 权重是1 元素是one
zadd 集合名 权重 元素
zadd myzset 1 one
创建多个元素
zadd 集合名 权重 元素 权重 元素
zadd myzset 2 two 3 three
获取所有元素
zrange 集合名 ?索引下标范围 WITHSCORES
zrange myzset 0 -1 WITHSCORES
#不加WITHSCORES是只显示元素
#加WITHSCORES是权重和元素都显示
查看位置索引
zrank 集合名 元素
zrank myzset one
如果成员不存在返回nil
zrank 集合名 元素
zrank myzset fore
查询成员数量
zcard 集合名
zcard myzset
表示查询权重的范围
查询权重1-2的范围之内的成员数量
zcont ?集合名 ?权重范围
zcount myzset 1 2
删除成员
zrem 集合名 ?元素
zrem myzset three
查看所有成员,查看删除后的结果
zrange 集合名 ?索引下标范围 withscores
zrange myzset 0 -1 withscores
查看权重
zscore 集合名 元素
zscore myzset two
查询redis库
Redis的库 库都是创建好的库,16个库
数字排名:0-15每个数据库之间互相独立,互不干扰
查看当前库中键的数量
dbsize
keys *
切换库
select 库的序号
select 1
keys *
redis库是按照数字排列的:0-15 一共16个 初始位置默认是0库
把键移动到其他的库中
move 键名 ??库的序号
move dym1 15
创建redis的密码
可以进入redis的库但是看不到库
config set requirepass 密码
config set requirepass 123456
在内声明密码
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 元素不能重复,但是权重可以相同。可以用来排名
?
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!