Redis学习文档
2022-02-25 18:06:43 15 举报
AI智能生成
Redis学习文档
作者其他创作
大纲/内容
1单机MySQL的美好年代
2 Memcached(缓存)+MySQL+垂直拆分
3 Mysql主从读写分离
4 分表分库+水平拆分+mysql集群
5 MySQL的扩展性瓶颈
6 今天是什么样子??
7 为什么用NoSQL
1 互联网时代背景下大机遇,为什么用nosql
2 是什么
易扩展
大数据量高性能
多样灵活的数据模型
传统RDBMS VS NOSQL
3 能干嘛
Redis
memcache
Mongdb
4 去哪下
KV
Cache
Persistence
......
5 怎么玩
入门概述
海量Volume
多样Variety
实时Velocity
大数据时代的3V
高并发
高可扩
高性能
互联网需求的3高
3V+3高
当下的应用是sql和nosql一起使用
演变过程
第5代
第5代架构使命
架构发展历程
和我们相关的,多数据源多数据类型的存储问题
看看阿里巴巴中文网站首页以女装/女包包为例
名称、价格,出厂日期,生产厂商等
为什么去IOE
关系型数据库:mysql/oracle目前淘宝在去O化(也即拿掉Oracle),注意,淘宝内部用的Mysql是里面的大牛自己改造过的
1 商品基本信息
多文字信息描述类,IO读写性能变差
文档数据库MongDB中
2 商品描述、详情、评价信息(多文字类)
商品图片展现类
淘宝自己的TFS
Google的GFS
Hadoop的HDFS
分布式的文件系统中
3 商品的图片
搜索引擎,淘宝内用
ISearch
4 商品的关键字
内存数据库
tair、Redis、Memcache
5 商品的波段性的热点高频信息
外部系统,外部第3方支付接口
支付宝
6 商品的交易、价格计算、积分累计
数据类型多样性
数据源多样性和变化重构
数据源改造而数据服务平台不需要大面积重构
难点
给学生画图介绍EAI和统一数据平台服务层
是什么
映射
API
热点缓存
什么样
阿里、淘宝干了什么?UDSL
解决办法
总结大型互联网应用(大数据、高并发、多样数据类型)的难点和解决方案
阿里巴巴中文站商品信息如何存放
当下的NoSQL经典应用
传统的关系型数据库你如何设计?
什么是BSON
给学生用BSon画出构建的数据模型
nosql你如何设计
高并发的操作是不太建议有关联查询的,互联网公司用冗余数据来避免关联查询
分布式事务是支持不了太多的并发的
为什么上述的情况可以用聚合模型来处理
启发学生,想想关系模型数据库你如何查?如果按照我们新设计的BSon,是不是查询起来很可爱
两者对比,问题和难点
以一个电商客户、订单、订购、地址模型来对比下关系型数据库和非关系型数据库
KV键值
bson
列族
图形
聚合模型
NoSQL数据模型简介
新浪:BerkeleyDB+redis
美团:redis+tair
阿里、百度:memcache+redis
KV键值:典型介绍
CouchDB
MongoDB
文档型数据库(bson格式比较多):典型介绍
分布式文件系统
列存储数据库
它不是放图形的,放的是关系比如:朋友圈社交网络、广告推荐系统
社交网络,推荐系统等。专注于构建关系图谱
图关系数据库
四者对比
NoSQL数据库的四大分类
A (Atomicity) 原子性
C (Consistency) 一致性
I (Isolation) 独立性
D (Durability) 持久性
传统的ACID分别是什么
C:Consistency(强一致性)
A:Availability(可用性)
P:Partition tolerance(分区容错性)
CAP
CAP的3进2
经典CAP图
BASE
分布式+集群简介
在分布式数据库中CAP原理CAP+BASE
NoSql入门和概述
Redis:REmote DIctionary Server(远程字典服务器)
Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用
Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储
Redis支持数据的备份,即master-slave模式的数据备份
Redis 与其他 key - value 缓存产品有以下三个特点
1是什么
内存存储和持久化:redis支持异步将内存中的数据写到硬盘上,同时不影响继续服务
取最新N个数据的操作,如:可以将最新的10条评论的ID放在Redis的List集合里面
模拟类似于HttpSession这种需要设定过期时间的功能
发布、订阅消息系统
定时器、计数器
2 能干嘛
http://redis.io/
http://www.redis.cn/
3 去哪下
数据类型、基本操作和配置
持久化和复制,RDB/AOF
事务的控制
复制
4 怎么玩
VMWare虚拟机的安装
如何查看自己的linux是32位还是64位
假如出现了不支持虚拟化的问题
CentOS或者RedHad5的安装
VMTools的安装
设置共享目录
上述环境都OK后开始进行Redis的服务器安装配置
VMWare+VMTools千里之行始于足下
Windows版安装
由于企业里面做Redis开发,99%都是Linux版的运用和安装,几乎不会涉及到Windows版,上一步的讲解只是为了知识的完整性,Windows版不作为重点,同学可以下去自己玩,企业实战就认一个版:Linux
重要提示:
下载获得redis-3.0.4.tar.gz后将它放入我们的Linux目录/opt
/opt目录下,解压命令:tar -zxvf redis-3.0.4.tar.gz
解压完成后出现文件夹:redis-3.0.4
进入目录:cd redis-3.0.4
能上网:yum install gcc-c++
不上网:
安装gcc
二次make
运行make distclean之后再make
jemalloc/jemalloc.h:没有那个文件或目录
Redis Test(可以不用执行)
运行make命令时故意出现的错误解析:
在redis-3.0.4目录下执行make命令
如果make完成后继续执行make install
服务启动起来后执行
redis-benchmark:性能测试工具,可以在自己本子运行,看看自己本子性能如何
redis-check-aof:修复有问题的AOF文件,rdb和aof后面讲
redis-check-dump:修复有问题的dump.rdb文件
redis-cli:客户端,操作入口
redis-sentinel:redis集群使用
redis-server:Redis服务器启动命令
查看默认安装目录:usr/local/bin
修改redis.conf文件将里面的daemonize no 改成 yes,让服务在后台启动
将默认的redis.conf拷贝到自己定义好的一个路径下,比如/myconf
启动
连通测试
/usr/local/bin目录下运行redis-server,运行拷贝出存放了自定义conf文件目录下的redis.conf文件
永远的helloworld
单实例关闭:redis-cli shutdown
多实例关闭,指定端口关闭:redis-cli -p 6379 shutdown
关闭
Linux版安装
Redis的安装
单进程模型来处理客户端的请求。对读写等事件的响应是通过对epoll函数的包装来做到的。Redis的实际处理速度完全依靠主进程的执行效率
epoll是Linux内核为处理大批量文件描述符而作了改进的epoll,是Linux下多路复用IO接口select/poll的增强版本,它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率。
单进程
默认16个数据库,类似数组下表从零开始,初始默认使用零号库
select命令切换数据库
dbsize查看当前数据库的key的数量
flushdb:清空当前库
Flushall;通杀全部库
统一密码管理,16个库都是同样密码,要么都OK要么一个也连接不上
Redis索引都是从零开始
为什么默认端口是6379
Redis启动后杂项基础知识讲解
Redis入门介绍
string(字符串)
hash(哈希,类似java里的Map)
list(列表)
set(集合)
zset(sorted set:有序集合)
Redis的五大数据类型
http://redisdoc.com/
哪里去获得redis常见数据类型操作命令
常用
keys *
exists key的名字,判断某个key是否存在
move key db ---当前库就没有了,被移除了
expire key 秒钟:为给定的key设置过期时间
ttl key 查看还有多少秒过期,-1表示永不过期,-2表示已过期
type key 查看你的key是什么类型
案例
Redis 键(key)
单值单value
set/get/del/append/strlen
getrange/setrange
setex(set with expire)键秒值/setnx(set if not exist)
mset/mget/msetnx
getset(先get再set)
Redis字符串(String)
单值多value
lpush/rpush/lrange
lpop/rpop
lindex,按照索引下标获得元素(从上到下)
llen
lrem key 删N个value
ltrim key 开始index 结束index,截取指定范围的值后再赋值给key
rpoplpush 源列表 目的列表
lset key index value
linsert key before/after 值1 值2
性能总结
Redis列表(List)
sadd/smembers/sismember
scard,获取集合里面的元素个数
srem key value 删除集合中元素
srandmember key 某个整数(随机出几个数)
spop key 随机出栈
smove key1 key2 在key1里某个值 作用是将key1里的某个值赋给key2
差集:sdiff
交集:sinter
并集:sunion
数学集合类
Redis集合(Set)
KV模式不变,但V是一个键值对
hset/hget/hmset/hmget/hgetall/hdel
hlen
hexists key 在key里面的某个值的key
hkeys/hvals
hincrby/hincrbyfloat
hsetnx
Redis哈希(Hash)
在set基础上,加一个score值。之前set是k1 v1 v2 v3,现在zset是k1 score1 v1 score2 v2
多说一句
withscores
zadd/zrange
withscores
( 不包含
limit 开始下标步 多少步
limit 作用是返回限制
zrangebyscore key 开始score 结束score
zrem key 某score下对应的value值,作用是删除元素
zrevrank key values值,作用是逆序获得下标值
zrevrange
zrevrangebyscore key 结束score 开始score
Redis有序集合Zset(sorted set)
Redis数据类型
地址
为什么我将它拷贝出来单独执行?
它在哪
units单位
INCLUDES包含
daemonize
pidfile
port
tcp-backlog
timeout
bind
tcp-keepalive
loglevel
logfile
syslog-enabled
syslog-ident
syslog-facility
databases
GENERAL通用
save 秒钟 写操作次数
禁用
Save
stop-writes-on-bgsave-error
rdbcompression
rdbchecksum
dbfilename
dir
SNAPSHOTTING快照
REPLICATION复制
访问密码的查看、设置和取消
SECURITY安全
maxclients
maxmemory
volatile-lru - remove the key with an expire set using an LRU algorithm
allkeys-lru - remove any key according to the LRU algorithm
volatile-random - remove a random key with an expire set
volatile-ttl - remove the key with the nearest expire time (minor TTL)
maxmemory-policy
maxmemory-samples
LIMITS限制
appendonly
appendfilename
always:同步持久化 每次发生数据变更会被立即记录到磁盘 性能较差但数据完整性比较好
everysec:出厂默认推荐,异步操作,每秒记录 如果一秒内宕机,有数据丢失
no
appendfsync
no-appendfsync-on-rewrite:重写时是否可以运用Appendfsync,用默认no即可,保证数据安全性。
auto-aof-rewrite-min-size:设置重写的基准值
auto-aof-rewrite-percentage:设置重写的基准值
APPEND ONLY MODE追加
常见配置redis.conf介绍
解析配置文件redis.conf
官网介绍
总体介绍
在指定的时间间隔内将内存中的数据集快照写入磁盘,也就是行话讲的Snapshot快照,它恢复时是将快照文件直接读到内存里
Redis会单独创建(fork)一个子进程来进行持久化,会先将数据写入到一个临时文件中,待持久化过程都结束了,再用这个临时文件替换上次持久化好的文件。整个过程中,主进程是不进行任何IO操作的,这就确保了极高的性能如果需要进行大规模数据的恢复,且对于数据恢复的完整性不是非常敏感,那RDB方式要比AOF方式更加的高效。RDB的缺点是最后一次持久化后的数据可能丢失。
是什么:
fork的作用是复制一个与当前进程一样的进程。新进程的所有数据(变量、环境变量、程序计数器等)数值都和原进程一致,但是是一个全新的进程,并作为原进程的子进程
Fork
rdb 保存的是dump.rdb文件
配置位置
可以cp dump.rdb dump_new.rdb
冷拷贝后重新使用
配置文件中默认的快照配置
Save:save时只管保存,其它不管,全部阻塞
BGSAVE:Redis会在后台异步进行快照操作,快照同时还可以响应客户端请求。可以通过lastsave命令获取最后一次成功执行快照的时间
命令save或者是bgsave
执行flushall命令,也会产生dump.rdb文件,但里面是空的,无意义
如何触发RDB快照
将备份文件 (dump.rdb) 移动到 redis 安装目录并启动服务即可
CONFIG GET dir获取目录
如何恢复
适合大规模的数据恢复
对数据完整性和一致性要求不高
优势
在一定间隔时间做一次备份,所以如果redis意外down掉的话,就会丢失最后一次快照后的所有修改
fork的时候,内存中的数据被克隆了一份,大致2倍的膨胀性需要考虑
劣势
动态所有停止RDB保存规则的方法:redis-cli config set save \"\"
如何停止
小总结
RDB(Redis DataBase)
以日志的形式来记录每个写操作,将Redis执行过的所有写指令记录下来(读操作不记录),只许追加文件但不可以改写文件,redis启动之初会读取该文件重新构建数据,换言之,redis重启的话就根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作
Aof保存的是appendonly.aof文件
修改默认的appendonly no,改为yes
启动:设置Yes
将有数据的aof文件复制一份保存到对应目录(config get dir)
恢复:重启redis然后重新加载
正常恢复
备份被写坏的AOF文件
redis-check-aof --fix进行修复
修复:
异常恢复
AOF启动/修复/恢复
AOF文件持续增长而过大时,会fork出一条新进程来将文件重写(也是先写临时文件最后再rename),遍历新进程的内存中数据,每条记录有一条的Set语句。重写aof文件的操作,并没有读取旧的aof文件,而是将整个内存中的数据库内容用命令的方式重写了一个新的aof文件,这点和快照有点类似
重写原理
Redis会记录上次重写时的AOF大小,默认配置是当AOF文件大小是上次rewrite后大小的一倍且文件大于64M时触发
触发机制
rewrite
每修改同步:appendfsync always 同步持久化 每次发生数据变更会被立即记录到磁盘 性能较差但数据完整性比较好
每秒同步:appendfsync everysec 异步操作,每秒记录 如果一秒内宕机,有数据丢失
不同步:appendfsync no 从不同步
相同数据集的数据而言aof文件要远大于rdb文件,恢复速度慢于rdb
AOF(Append Only File)
官网建议
RDB持久化方式能够在指定的时间间隔能对你的数据进行快照存储
RDB的数据不实时,同时使用两者时服务器重启也只会找AOF文件。那要不要只使用AOF呢?作者建议不要,因为RDB更适合用于备份数据库(AOF在不断变化不好备份),快速重启,而且不会有AOF可能潜在的bug,留着作为一个万一的手段。
同时开启两种持久化方式
性能建议
总结(Which one)
redis的持久化
可以一次执行多个命令,本质是一组命令的集合。一个事务中的所有命令都会序列化,按顺序地串行化执行而不会被其它命令插入,不许加塞
官网
一个队列中,一次性、顺序性、排他性的执行一系列命令
能干嘛
常用命令
case1:正常执行
Case2:放弃事务
Case3:全体连坐
Case4:冤头债主
悲观锁
乐观锁
CAS
悲观锁/乐观锁/CAS(Check And Set)
初始化信用卡可用余额和欠额
无加塞篡改,先监控再开启multi,保证两笔金额变动在同一个事务内
监控了key,如果key被修改了,后面一个事务的执行失效
有加塞篡改
unwatch
一旦执行了exec之前加的监控锁都会被取消掉了
Watch指令,类似乐观锁,事务提交时,如果Key的值已被别的客户端改变,比如某个list已被别的客户端push/pop过了,整个事务队列都不会被执行
通过WATCH命令在事务执行之前监控了多个Keys,倘若在WATCH之后有任何Key的值发生了变化,EXEC命令执行的事务都将被放弃,同时返回Nullmulti-bulk应答以通知调用者事务执行失败
小结
Case5:watch监控
怎么玩
开启:以MULTI开始一个事务
入队:将多个命令入队到事务中,接到这些命令并不会立即执行,而是放到等待执行的事务队列里面
执行:由EXEC命令触发事务
3阶段
单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。
没有隔离级别的概念:队列中的命令没有提交之前都不会实际的被执行,因为事务提交前任何指令都不会被实际执行,也就不存在”事务内的查询要看到事务里的更新,在事务外查询不能看到”这个让人万分头痛的问题
不保证原子性:redis同一个事务中如果有一条命令执行失败,其后的命令仍然会被执行,没有回滚
3特性
Redis的事务
进程间的一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。
订阅/发布消息图
命令
案列
Redis的发布订阅
行话:也就是我们所说的主从复制,主机数据更新后根据配置和策略,自动同步到备机的master/slaver机制,Master以写为主,Slave以读为主
读写分离
容灾恢复
配从(库)不配主(库)
每次与master断开之后,都需要重新连接,除非你配置进redis.conf文件
info replication
从库配置:slaveof 主库IP 主库端口
拷贝多个redis.conf文件
开启daemonize yes
pid文件名字
指定端口
log文件名字
dump.rdb名字
修改配置文件细节操作
Init
一个Master两个Slave
主机日志
备机日志
info replication
日志查看
主从问题演示
一主二仆
中途变更转向:会清除之前的数据,重新建立拷贝最新的
slaveof 新主库IP 新主库端口
薪火相传
使当前数据库停止与其他数据库的同步,转成主数据库
SLAVEOF no one
反客为主
常用3招
slave启动成功连接到master后会发送一个sync命令
全量复制:而slave服务在接收到数据库文件数据后,将其存盘并加载到内存中。
复制原理
反客为主的自动版,能够后台监控主机是否故障,如果故障了根据投票数自动将从库转换为主库
调整结构,6379带着80、81
自定义的/myredis目录下新建sentinel.conf文件,名字绝不能错
sentinel monitor 被监控数据库名字(自己起名字) 127.0.0.1 6379 1
上面最后一个数字1,表示主机挂掉后salve投票看让谁接替成为主机,得票数多少后成为主机
redis-sentinel /myredis/sentinel.conf
上述目录依照各自的实际情况配置,可能目录不同
启动哨兵
正常主从演示
原有的master挂了
投票新选
问题:如果之前的master重启回来,会不会双master冲突?
怎么玩(使用步骤)
一组sentinel能同时监控多个Master
哨兵模式(sentinel)
复制延时
复制的缺点
Redis的复制(Master/Slave)
tar -zxvf jdk-7u67-linux-i586.tar.gz
vi /etc/profile
重启一次Centos
编码验证
安装JDK
安装eclipse
commons-pool-1.6.jar
jedis-2.1.0.jar
Jedis所需要的jar包
测试连通性
一个key
五大数据类型
5+1
日常
加锁
事务提交
主写
从读
主从复制
Jedis常用操作
获取Jedis实例需要从JedisPool中获取
用完Jedis实例需要返还给JedisPool
如果Jedis在使用过程中出错,则也需要还给JedisPool
JedisPoolUtil
jedisPool.getResource();
Demo5
案例见代码
配置总结all
JedisPool
Redis的Java客户端Jedis
NoSql2016.1V1.3讲师:尚硅谷周阳
0 条评论
回复 删除
下一页