目录
一、关系型和非关系型数据库
1、概念
2、关系型和非关系型数据库的区别:
3、非关系型数据库的主要场景:
4、数据库缓存:
5、总结
二、redis概述
1、redis的工作特点:
2、redis的特点:
3、redis为什么这么快?
4、缓存的概念:
三、安装部署redis
四、redis的常用命令
1、redis命令工具:
2、Redis 数据库常用命令
五、redis 的五大数据类型:
1、string(字符串):
2、list数据类型
3、HASH类型
4、set数据类型(无序集合):set
5、有序集合:zset
●关系型数据库:
关系型数据库是一个结构化的数据库,创建在关系模型(二维表格模型)基础上,一般面向于记录。
SQL 语句(标准数据查询语言)就是一种基于关系型数据库的语言,用于执行对关系型数据库中数据的检索和操作。
主流的关系型数据库包括 Oracle、MySQL、SQL Server、Microsoft Access、DB2、PostgreSQL 等。
以上数据库在使用的时候必须先建库建表设计表结构,然后存储数据的时候按表结构去存,
如果数据与表结构不匹配就会存储失败。
●非关系型数据库
NoSQL(NoSQL = Not Only SQL ),意思是“不仅仅是 SQL”,是非关系型数据库的总称。
除了主流的关系型数据库外的数据库,都认为是非关系型。
不需要预先建库建表定义数据存储表结构,每条记录可以有不同的数据类型和字段个数
(比如微信群聊里的文字、图片、视频、音乐等)。
主流的 NoSQL 数据库有 Redis、MongBD、Hbase、Memcached 等。
关系型数据库sql:
关系型数据库是一个结构化的数据库,行和列。列声明对象,行记录对象属性。
表与表之间是有关联的,使用sql语句,来对指定的表、库进行增删改查
在创建表时,我们是设计好了表的结构。按照表结构存储数据。数据如果与表结构不匹配,存储数据会失败
非关系型数据库no sql:not only sql
不需要定义库,也不需要定义表的结构,直接记录即可,而且每条记录都可以有不同的数据类型,字段(字段个数)
redis key:values 键值对形式存储。每个键之间没有直接关联。库与库之间互相独立
区别:
关系型数据库靠的是提升本机的性能。
非关系数据库可以横向扩展,加入节点服务器的方式提高性能
非关系型数据库redis也可以支持事务,其稳定性和处理能力都不如关系数据库
web2.0核心:交互
纯动态网站的三高问题:
常见的集中缓存需求场景:
数据库缓存
web页面缓存
cpu和硬盘之间的缓存
关系型数据库:
库——>表——>行,列——>存储数据
非关系型数据库:
库——>集合——>键值对(不需要手动创建库和集合)
redis:开源的,使用c语言编写的no sql数据库。
redis工作方式:基于内存运行,支持持久化(数据恢复)。采用的就是key-values(键值对)的存储形式。目前在分布式架构中是非常重要的一环
非关系数据库
1、数据保存在缓存中,利于读取速度/查询数据
2、架构中位置灵活
3、分布式、扩展性高
关系数据库
1、安全性高(持久化)
2、事务处理能力强
3、任务控制能力强
4、可以做日志备份、恢复、容灾的能力更强一点。
redis服务器程序是一个单进程模式,即只有一个主进程工作。也就是说在一台服务器上可以启动多个redis(端口号不能冲突)
redis的实际处理速度是完全依靠主进程的处执行效率
服务器只部署了一个redis进程,多个客户端访问,可能会导致redis的处理能力下降
如果部署了多个redis进程,虽然能提高redis的并发处理能力,但是会给服务器的CPU带来很大的压力
一台服务器一般部署3个redis进程(根据情况来看,高并发要部署多个。一般情况,单进程足够了)
特殊说明:redis的读写。任然是单进程处理
缓存是一种用于存储临时数据副本的技术,目的是提高数据访问速度和性能。
缓存通常位于数据的访问路径上,可以在不直接访问原始数据源的情况下提供对数据的快速访问。
缓存数据: 缓存存储的是原始数据的副本。这可以是计算结果、数据库查询结果、文件内容等。
缓存命中: 当请求的数据在缓存中找到时,发生了缓存命中。这避免了对原始数据源的访问,提高了访问速度。
缓存未命中: 当请求的数据在缓存中未找到时,发生了缓存未命中。
系统将不得不从原始数据源中检索数据,然后将其存储在缓存中以供将来使用。
缓存淘汰: 当缓存空间不足时,系统需要决定哪些数据应该被淘汰以腾出空间。
这通常是基于一些策略,例如最近最少使用(LRU)或先进先出(FIFO)。
缓存策略: 缓存系统使用不同的策略来确定哪些数据应该被缓存、保留多长时间以及何时淘汰。
这包括淘汰策略(LRU、LFU)、缓存过期策略等。
缓存层次结构: 复杂系统中可能存在多个层次的缓存,从本地内存到分布式缓存,甚至是内容分发网络(CDN)。
缓存透明性: 缓存应该对应用程序透明,应用程序无需了解缓存的存在,缓存应该自动处理。
分布式缓存: 在分布式系统中,缓存通常以分布式方式部署,以支持大规模的应用程序。
缓存的使用可以显著提高系统性能,减轻原始数据源的负载,并降低数据访问延迟。
常见的缓存应用包括 Web 页面缓存、数据库查询缓存、对象缓存等。
关闭防火墙和安全机制
安装环境:
yum install -y gcc gcc-c++ make
解压
tar -xf redis-5.0.7.tar.gz
进入目录,编译
cd redis-5.0.7/
make -j4
指定路径安装:
make PREFIX=/usr/local/redis install
进入cd utils/目录
cd utils/
./install_server.sh
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 #客户端命令工具
软连接命令识别:
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 20.0.0.41 #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-benchmark -h 20.0.0.26 -p 6379 -c 100 -n 100000
如何进入redis
redis-cli -h 20.0.0.26 -p 6379
-h 指定IP地址
-p 指定端口号
-a 指定登录密码
redis-cli 本机直接进,仅限于本地,远程还是需要指定目标服务器的IP地址和端口
基础数据类型包括:string(字符串)、list(列表,双向链表)、
hash(散列,键值对集合)、set(集合,不重复)和sorted set也可以称为Zset(有序集合)。
新建:
set 键名 键值
查询:
get 键名
set:存放数据,命令格式为 set key value
get:获取数据,命令格式为 get key
keys * 查看全部键值对
查询键值对:
判断键值对是否存在:exists
删除键:del
del 键名1 键名2
查看键的类型:type
如何对已有key进行重命名:rename
rename 原键名 新键名
如何查看当前库 键的数目
dbsize
redis的库都是创建好的库,默认16个库,按照数字进行排名
数字排名:0-15
每个数据库之间互相独立,互不干扰
切换库:select
select 1~15(默认有16个库从0开始命名)
将当前库的键值对移动到其他库去:move
move 键名 库名
给库创建密码:
config set requirepass 123456
清空:永不操作的操作
redis数据类型 五大数据类型:
也是redis最基本的类型,最大能存储512MB的数据,可以存储任何数据,数字,文字,图片等等
SET/GET/APPEND/STRLEN:
PS:APPEND
APPEND key value追加键值,并返回追加后的长度(若键不存在,则相当于创建)
返回键的长度
set 键入值是覆盖
数字自增:
INCR/DECR/INCRBY/DECRBY:
INCR key:key值递增加1(key值必须为整数)
DECR key:key值递减1(key值必须为整数)
INCR 表名
DECR 表名
指定加减:
如何给键值设置过期时间
SETEX:
setex key seconds value:设置指定key的过期时间为seconds
-1表示键值对永不过期
-2表示键值对过期
SETEX test2 15 lo
对已有键值添加生命周期
EXPIRE test 30
MSET/MGET/MSETNX:批量操作
MSET key value [key value …]:批量设置键-值对
MGET key [key …]:批量获取键值对
MSETNX key value [key value …]:批量设置键-值对,都不存在就执行并返回1;只要有一个存在就不执行并返回0
概述:列表的元素类型为string,按照插入顺序排序,在列表的头部或尾部添加元素
创建列表
lpush从右到左插入元素
rpush从左到右插入元素
插入数据:
lpushx/rpushx
删除数据:
lpop/rpop
删头/删尾
llen 获取表中元素数量
索引下标:
lindex 表名 索引下标:查询索引下标对应的值(索引下标从0开始)
在索引下标后添加元素:lset
lset key 3 ok:在第三位(第四个元素)后面添加ok
在索引下标位置前插入元素:
linsert 表名 before 索引下标 元素
HASH类型用于存储对象,采用HASH格式进行操作。占用的磁盘空间少,而且一个HASH可以存储4294967295个键值对
创建hset
hset 键名 字段 值
打印hget
hget 键名 字段
创建多个字段:
hmset 键名 字段1 值1 字段2 值2
打印指定字段:
hmget 键名 字段1 字段2
打印全部字段和值:
HGETALL 键名
打印指定多个字段:
hmget 键名 字段1 字段2
创建多个字段:
hmset 键名 字段1 值1 字段2 值2
打印全部字段和值:
HGETALL 键名
hkeys命令仅获取myhash键中所有字段的名字
删除键:del 键名
删除键中的字段:
hdel 键名 字段1 字段2
删除:del
元素类型也是string。元素值是唯一的,不允许重复,多个集合类型可以进行并集、交集、差集运算
set当中的元素类型是唯一的,可以跟踪一些唯一性的数据,如访问微博的用户名,只要把对应的名称写入redis,set会自动保存他的唯一性,方便下一次访问
创建:
sadd 键名 元素
判断元素是否已经存在
sismember 表名 元素
随机的返回了某一元素
SRANDMEMBER 键名
随机移除一个元素
spop 键名
指定移除:
srem 键名 元素1 元素2 元素3
元素类型也是string,元素也不能重复唯一
每个元素都要关联一个double类型(浮点数)的分数(score,表示权重),可以通过权重的大小进行排序。元素不能相同但是元素的score权重的可以相同
用于在线积分的排行榜,实时更新用户的分数和排名。zrange命令获取积分top10的用户。zrank命令通过username获取用户的排行信息
创建:
zadd myzset 1 one
权重是1,元素是one
查看索引位置:
zrank 键名 元素
如何查询成员数量:
zcard 键名
zcount 键名 1 2 查看权重1-2的成员数量
删除:
zrem 键名 元素
查看有序集合的权重和元素
只查看元素:ZRANGE 键名 0 -1
查看权重和元素:ZRANGE 键名 0 -1 withscores
0表示第一个 -1表示最后一个
查看元素对应的权重
zscore 键名 元素
set和hset 创建普通类型和HASH类型:
一般情况下,如无特殊需求,普通的创建方式即可
对一个键进行对字段存储,节省内存,使用HASH方式
工作中set足够
五大数据类型: