NoSql-redis
2020-11-20 14:24:14 1 举报
AI智能生成
登录查看完整内容
redis
作者其他创作
大纲/内容
NoSql-redis
NoSql 入门和概述
入门概述
单机 MYSQL 的美好年代
Memcached(缓存)+Mysql+垂直拆分
mysql 主从复制读写分离
分库分表+水平拆分+mysql集群
mysql的扩展瓶颈
为什么使用NoSql
是什么(NoSql -> Not Only Sql:意思是: 不仅仅是Sql)
泛指 font color=\"#c41230\
能干嘛
易扩展
大数据量和高性能
redis 1s 写 8w 读11w次
多样灵活的数据模型
而在关系型数据库里 增删 字段是一件非常麻烦的事情
传统 RDBMS VS NoSql
RDBMS
高度组织结构化数据
结构化查询语言 (sql)
数据和关系都存储在单独的表中
严格的一致性
基础事务
NoSql
代表着不仅仅是sql
没有声明性查询语言
没有预定义的模式
font color=\"#c41230\
非结构化和不可预知的数据
CAP原理
高性能: 高可用和可伸缩性
去哪下
Redis
Memcache
Mongdb
怎么玩
KV
Cache
Persistene(持久化)
...
3V+3高
大数据时代的3V
海量 Volume(体积)
多样 Variety(种类)
实时 Velocity(高速)
互联网需求的3高
高并发
高性能
高可扩
横向扩展
栗子 1个人干不了 2个人来干(集群)
没有极限
纵向扩展
有极限
当下NoSQL的经典应用
当下应用是 sql 和 NoSql 一起使用的
阿里巴巴中文站商品信息是如何存放的
阿里巴巴网站首页 以女装包包 为栗子
商品基本信息
存储在关系型数据库 mysql(也不是我们使用的mysql)/oracle 目前淘宝在去O 化 (拿掉了Oracle)
存储在文档数据库 MongDB 中
商品图片
商品图片展现类
分布式的文件系统中
淘宝自己的TFS
Google 的GFS
Hadoop 的HDFS
商品的关键字(搜索框里面的文字)
ISearch
商品的波段性的热点高频信息
内存数据库
支付宝
难点
数据类型多样性
数据源多样性和变化重构
数据源改造而数据数据服务平台不需要大面积重构
解决方案
UDSL是什么?
什么样?
映射
API
热点缓存
NoSql数据模型简介
以一个点上font color=\"#c41230\
传统的关系型数据库你如何设计呢?
ER图 (1:1/1:N/N:N 主外键等常见)
NoSql 是如何设计的?
什么是BSON?
NoSql 模型为
为什么NoSql 情况可以用聚合模型来处理
分布式事务是支持不了太多的并发
想想关系型数据库是如何查的?
如果使用BSON 这样查询是不是很简单少了很多的left join
聚合模型
KV键值对
BSON
列族
图形
NoSql 数据库的四大分类
KV键值
新浪 Berkeley + redis
美团 redis + tair
文档型数据库(bson 格式比较多)
CouchDB
MongoDB
是一个基于font color=\"#c41230\
列存储数据库
分布式文件系统
图关系数据库
四者对比
子主题
在分布式数据库中CAP原理 CAP +BASE
传统的ACID是什么
原子性
隔离性
持久性
一致性
CAP
C: Consisteny 强一致性
A: Availabilty 可用性
P: Partition tolerance 分区容错性
CAP 的3进2
CAP: 核心是 font color=\"#c41230\
CA(传统Oracle/mysql数据库)
CP(Redis、Mongodb)
AP(大多数网站架构的选择)
BASE
什么是 base ?
base 就是为了解决关系数据库强一致性引起的可用性降低而提出的解决方案
basically available -基本可用
soft state - 软状态
eventually consistent -最终一致
它的思想是font color=\"#c41230\
分布式+集群简介
分布式
不同的多态服务器上面部署font color=\"#c41230\
集群
问题
缺点: 有大量的io效率问题
Redis入门介绍
入门概览
是什么?
redis : REmote DIctionary Server (远程字典服务器)
redis 与其它 k/v缓存产品有以下3个特点
redis 和 memcache 区别
持久化
redis 支持持久化 memcache不支持持久化
数据类型
memcache 只支持string类型
架构
redis 单线程+多路IO复用
memcache 多线程+锁
能干嘛?
如: 可以将最新的10条评论的ID放到 redis的list集合里面模拟类似于 httpsession 这种需要设定过期时间的功能
去哪下?
http://www.redis.cn/
怎么玩?
事务的控制
复制
Redis-Linux 安装
运行 make命令的时候出现 /bin/sh: cc: 未找到命令
安装gcc
yum install gcc-c++ -y
二次运行make 出现 致命错误:jemalloc/jemalloc.h:没有那个文件或目录
运行 make distclean 然后在执行 make
继续执行出现 错误:‘struct redisServer’没有名为‘server_cpulist’的成员
1、安装gcc套装:yum install cppyum install binutilsyum install glibcyum install glibc-kernheadersyum install glibc-commonyum install glibc-develyum install gccyum install make2、升级gccyum -y install centos-release-sclyum -y install devtoolset-9-gcc devtoolset-9-gcc-c++ devtoolset-9-binutilsscl enable devtoolset-9 bash3、执行完上述命令后再次make即可。
Hint: It's a good idea to run 'make test' ;) 编译成功
执行 make install 安装
Redis启动后杂项基础知识讲解
单进程
Select 命令切换数据库
Dbsize 查看当前数据库的key数量
flushall 通杀全部数据库
flushdb 清空当前数据库
redis 的索引是从零开始的
为什么默认端口是 6379
Redis 数据类型
Redis 五大数据类型
String 字符串
Hash 哈希类似于Java里的Map
List 列表
Set 集合
Zset (Sorted set 有序集合)
不同的是zset每个元素都会关联一个double类型的分数
哪里去获取redis常见数据库类型操作命令
Redis 键(key)
keys * --查看当前数据库所有k
exists k -- 判断当前数据库k是否存在1为存在0为不存在
move k 2 -- 把k移动到2号数据库
expire k 10 -- 为k设置过期时间10s
ttl k -- 查看还有多少秒过期 -1表示永不过期 -2 表示已过期
type k -- 查看k的数据类型
dbsize -- 查看数据库的key数量
flushdb -- 清空当前库
flushall -- 通杀全部库
Redis --- string
set / get /del / append / strlen
Incr (加)/ decr (减)/ Incrby /decrby (注意一定要是数字才能进行加减)
getrange
setrange
设置覆盖key对应的string的一部分,从指定的offset处开始,覆盖value的长度。
setex
设置key在给定的seconds时间之后超时过期
setnx
将key设置值为value,如果key不存在,这种情况下等同SET命令。
mset / mget / msetnx
设置添加/获取/当所有key都不存在添加多个k - v
getset
Redis --- list
lpop / rpop
lindex --- 按照索引下标获取元素(按照左/右的下标)
llen --获取当前数据长度
lrem -- 从list集合中删除n个value
ltrim --截取指定范围后的值然后在赋值给key
rpoplpush -- 意思是从列表右侧 弹出一个 放入第二列表的左侧(rpop 和 lpush)
lset --设置 列表index 位置的value
linsert -- 把某个值插入在指定的值before / after
Redis --- set
sadd / smembers(查询集合全部元素)
sismember -- 判断一个给定的值是否是一个集合的成员
scard --获取集合中的元素个数
srem - 从集合中删除一个或者多个元素
srandmember -- 从集合中随机取出来几个元素
spop -- 随机出栈
数学集合类
交集 sinter
并集 sunion
Redis --- hash
hset / hget / hmset / hmget / hgetall /hdel
hlen -- 查看hash长度
hexists --判断 k 的字段是否存在
hkeys / hvals
hincrby / hincrbyfloat
Redis --- zset(最复杂的数据类型)
zadd / zrange
zrem -- 从集合中删除一个或多个元素
zrank --确定在排序集合中的索引
zscore k v -- 根据v获取对应的分数 score
zrevrank --逆方向获取下标值
zrevrange --逆时针排序
zrevrangebyscore -- 逆时针根据分数排序 从高到低
解析配置文件 redis.conf
Units 单位
对大小写不敏感
INCLUDES
GENERAL
daemonize no
pidfile \"/var/run/redis_6379.pid\"
# requirepass foobared
NETWORK
tcp-backlog 511
timeout 0
tcp-keepalive 300
loglevel notice
logfile \"\"
# syslog-enabled no
# syslog-ident redis
# syslog-facility local0
databases 16
SNAPSHOTTING (快照)
# save <seconds> <changes> : save 秒数 写操作次数
可以禁用save
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
rdb-del-sync-files no
dir ./
SECURITY (安全)
获取启动redis的目录
config get dir
重新设置redis 密码
config set requirepass \"密码\"
获取当前redis密码
config get requirepass
怎么在redis输入命令呢
auth \"密码\"
取消redis密码如何操作呢
config set requirepass \"\"
shutdown -> exit
重启redis 然后使其生效
CLIENTS 客户端限制
# maxclients 10000
MEMORY MANAGEMENT(内存管理限制)
# maxmemory <bytes>
# maxmemory-samples 5
# maxmemory-policy noeviction (默认永不过期)
redis memory 过期策略(当内存不足以容纳新写入数据时)
volatile-lru
allkeys-lru(常用)
volatile-lfu
在过期密集的键中,使用LFU算法进行删除key。
allkeys-lfu
使用LFU算法移除所有的key。
volatile-random
allkeys-random
移除随机的key
volatile-ttl
noeviction
APPEND ONLY MODE (追加一个方式)
appendfilename \"appendonly.aof\"
appendfsync everysec
no
依靠OS进行刷新,redis不主动刷新AOF,这样最快,但安全性就差
always
everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
REDIS CLUSTER (集群)
# cluster-enabled yes
# cluster-config-file nodes-6379.conf
# cluster-node-timeout 15000
# cluster-require-full-coverage yes
Redis 的持久化
总体介绍
Redis持久化
rdb (Redis DataBase)--存储的数据
在指定的时间间隔能对你的数据进行快照存储到磁盘
Fork
rdb 保存的是 dump.rdb 文件
如何触发RDB快照
配置文件中默认的快照配置
冷拷贝后重新使用
可以 cp dump.rdb dump_bk.rdb
命令save 或者 bgsave
redis.conf 配置文件满足 save 的判断可以自动保存
如何恢复
将备份文件 (dump.rdb )移动到 redis 安装目录并启动服务即可
config get dir 获取redis安装目录
优势
适合大规模的数据恢复
对数据的完整性和一致性要求不高
劣势
如何停止
小总结
aof (Append Only File) --存储的指令
b style=\
aof 保存的是 appendonly.aof文件
文件位置
保存在 rdb 统一目录下即 dir 目录
aof 启动/修复 / 恢复
正常恢复
启动: 设置yes
将有数据的 aof 文件复制一份保存到对应目录 (config get dir)
恢复: 重启redis 然后重新加载
异常恢复
启动: 设置 yes
备份被写坏的aof 文件
修复: redis-check-aof --fix 文件名 ->进行修改
Rewrite
重写原理
触发机制
auto-aof-rewrite-percentage 100auto-aof-rewrite-min-size 64mb 可以看出
每秒同步 appendfsync always
每修改同步 appendfsync everysec
不同步 appendfsync no
从不同步操作
相同的数据集的数据而言 aof 文件要远大于 rdb文件 恢复速度慢于rdb
客户端 --命令请求--> 服务器 --网络协议格式的命令内容--> aof文件
总结 (Which one)
rdb 持久化方式能够在指定的时间间隔能对你的数据进行快照存储
同时开启2中持久化方式
性能建议
Redis 的事务
redis 事务的主要作用是 串联多个命令防止别的命令插队
redis的事务
Redis事务
常用命令
Case1 : 正常执行
Case2 : 放弃事务
Case3 : 全体连坐
Case4 : 源头债主
Case5 : watch监控
悲观锁/乐观锁/CAS( check and set)
悲观锁
乐观锁
CAS
初始化信用卡可用余额和欠额
有加塞篡改
unwatch
一旦执行了 exec 之前加的监控所都会被取消了
小结
阶段
开启 : multi开始一个事务
执行 :exec命令触发事务
特性
ab工具模拟并发
安装
yum install httpd-tools
ab -n 请求数
ab -c 并发数
ab -p 指定请求数据文件
在 /home/myredis/创建profile文件
ab -T \"application/x-www-form-urlencoded\" 表示post请求
案例
get请求
ab -n 1000 -c 200 http://192.168.247.1:8080/spike/commodity?commodity=100
post请求
ab -n 1000 -c 200 -p /home/myredis/profile -T \"application/x-www-form-urlencoded\" http://192.168.247.1/spike/commodity
LUA脚本
LUA脚本在redis中的优势
Redis 的发布订阅(了解)
订阅/发布消息图
命令
psubscribe
订阅一个或多个符合给定模式的频道
pubsub subcommand
查看订阅与发布系统的指定频道
publish
退订所有给定模式的频道
subscribe
订阅给定一个或多个频道
unsubscribe
指退订给定频道
案栗
设置消息接受者 psubscribe
设置消息的发送者 pusblish
Redis 的复制(master-slave)
官方文档
Redis复制
容灾恢复
读写分离
info replication
拷贝多个 redis.conf 文件
开启 daemonize yes
pid 文件名称
指定端口 port
log 文件名字
dump名字.rdb
一主二仆
init
一个master 俩个 slave
日志查看
主从问题演示
薪火相传
slaveof 新主库 ip 新主库端口
反客为主
slaveof no one
复制原理
全量复制
增量复制
但是只要是重新连接 master 一次完全同步(全量复制)将被自动执行
哨兵模式 ( sentinel)
在自定义的 /home/myredis/目录下创建 font color=\"#c41230\
配置哨兵 sentinel 文件
seninel monitor 被监控主机数据库名字(自己给服务器起的名字) 127.0.0.1 6379 1
启动哨兵
redis-sentinel /home/myredis/sentinel.conf
一组 sentinel 能同时监控多个 master
复制的缺点
Redis 的集群
为什么要用集群?
redis 集群实现了对redis的font color=\"#c41230\
怎么用
安装 ruby环境
yum install ruby
yum install rubygems
修改redis.conf配置文件
把集群注销掉的内容打开
同时打开6台redis的服务
打开后如下 ps -ef|grep redis
将6个节点合成一个集群
将集群合体 cd /opt/自己的redis目录/src
redis-cli --cluster create 192.168.247.110:6379 192.168.247.110:6380 192.168.247.110:6381 192.168.247.110:6389 192.168.247.110:6390 192.168.247.110:6391 --cluster-replicas 1
以集群的方式进入客户端
redis-cli -c -p 某一端口号
如何查看集群信息
cluster nodes
redis cluster如何分配这6个节点
什么是 slots ?
节点A负责处理 0 - 5500 号插槽
节点B负责处理 5501-11000 号插槽
节点C负责处理 11001-16384 号插槽
在集群中录入值
查询集群中的值
cluster keyslot xx
计算键key 应该被放置在那个槽上
cluster countkeysinslot xx
返回槽slot 目前包含的键值对数量
cluster getkeysinslot xx xx
返回count个slot槽中的键
故障恢复
从节点可以自动升级为主节点 master
主节点变为从服务器 slaver
redis 集群好处
实现扩容
无中心配置相对简单
redis 集群的不足
如何取消redis集群
Redis 的java的JedisCluster
0 条评论
回复 删除
下一页