Redis Introduction

Introduction

Redis, Kafka, Zookeeper, Docker, K8S

session数据放到缓存数据库(redis)中,可减少IO的读操作,能提高效率

水平切分、垂直切分、读写分离

普通电脑MySQL单表500万条记录以上会感觉变慢

小型机Oracle单表1亿条才变慢

以业务逻辑为优先改为以性能为优先

NoSQL不依赖业务逻辑方式存储,而以简单的key-vlaue模式存储。不遵循SQL标准、不支持ACID、远超SQL的性能。

Redis几乎覆盖了Memcached的绝大部分功能。Memcached支持Windows,Redis不支持。

Redis数据类型有key +, string、list、set、zset、hash、

Redis是开源的key-vlaue存储系统。push/pop、add/remove及交集并集差集丰富操作。

1、配合关系型数据库做高速缓存。存热点数据、做session共享
2、基于其持久化能力,利用其多样的数据结构存储特定的数据。pub/sub模式、set去重

make install PREFIX=/opt/module/redis 源码安装自定义安装目录

Redis为什么快?
1、基于内存
2、单线程
3、多路IO复用

Some Common Commands

keys * //查询当前库的所有键
exists //判断某个键是否存在
type //查看键的类型
del //删除某个键
expire //为键值设置过期时间
ttl //查看键的生命值,-1表示永生,-2表示已死
dbsize //查看当前数据库键的数量
flushdb //清空当前库

Five Primary Data Types

String

String类型是二进制安全的,意味着可以包含任何数据,比如jpg图片,最大512M。
get
set
append
strlen
setnx //set when not exist
incr 将键中存储的数字增1
decr
incrby / decrby 自定义增减的步长

Redis单命令的原子性主要得益于Redis的单线程

i++ 不是原子性操作

mset …
mget …
msetnx …
getrange …
setex
getset //返回旧值、设置新值

List单键多值,底层实际是个双向列表
lpush/rpush …
lpop/rpop
lrange
lindex
llen
linsert before
lrem

Set是集合,自动去重
sadd …
smembers
sismember
scard
srem …
spop //随机从集合弹出一个值
srandmember 随机从集合读取n个值
sinter 返回两个集合的交集
sunion 返回两个集合的并集
sdiff 返回两个集合的差集

Hash是一个键值对,是一个string类型的field的value的映射表,适合存储对象。
hset
hget
hmet …
hexists
hkeys
hvals

Zset是一个没有重复元素但有序的的集合,每个成员关联一个score用于排序。
zadd …
zrange [withscores] //读取
zrank

Configuration

bind 127.0.0.1 10.0.0.200
protected-mode no
port 6379
tcp-backlog 511
timeout 0
tcp-keepalive 300
daemonize yes
pidfile /var/run/redis_6379.pid

Redis Transactions

Queuing:
MULTI //开始组队
set k3 v3
get k3
EXEC //执行组队
DISCARD //丢弃组队

Redis中不存在回滚
Redis事务的主要作用就是串联多个命令防止别的命令插队

悲观锁(加锁)
乐观锁(用版本号)

行级锁
表级锁

WATCH [key]
三特性:单独的隔离操作、没有隔离级别的概念、不保证原子性。

Redis事务–秒杀案例。检查是否有库存,有则数量减1,用户加入成功用户。
sk:prodid:qt [string]
sk:prodid:usr [set]

LUA脚本类似redis事务,有一定的原子性,不会被其他命令插队。

Redis Persistence

two methods:
RDB (Redis DataBase)
AOF (Append Of File)

Redis.conf

dbfilename “dump.rdb”
dir ./
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
logfile “”

save vs bgsave
命令save:只管保存,其他不管,阻塞所有。一般不用。

rdb文件的备份:先用config get dir查询rdb文件的目录,将*.rdb文件复制备份。

AOF 以日志的形式来记录每个写操作。Redis重启的话就将该文件完整执行一遍。
appendonly yes
appendfilename “appendonly.aof”
appendfsync everysec

如果rdb和aof都开启,Redis默认取用aof数据。因为aof备份频率高。

官方推荐两个都启用。如果只是做纯内存缓存,可以都不用。

Master-slave Replication 至少3台

主机数据更新后根据配置和策略,自动同步到备机。Master以写为主,slave以读为主。

info replication //打印主从复制的相关信息
saveof //建立主从关系
slaveof no one //把从机变为主机

从机可以是另一台从机的主机,可以有效减轻master的写压力。

如一主两从三(奇数)哨兵

Sentinel 反客为主的自动版

sentinel.conf
sentinel monitor mymaster 10.0.0.100 6379 1

redis-sentinel sentinel.conf

新主登基、群仆俯首、旧主俯首
1.选择优先级靠前的;2.选择偏移量最大的;3.选择runid最小的。

Redis Cluster 分布式(与主从复制不是一个概念)至少6台

容量不够,如何扩容?
并发写,如何分摊?

启动N个redis节点,整个数据库分布存储在N个节点中,每个节点存1/N。
Redis通过分区(partition)来提供一定程度的可用性(availability)。

cluster-enabled yes
cluster-config-file nodes-6379.conf
cluster-node-timeout 15000(ms)

安装相关组件

合体:cd /opt/redis-3.2.5/src ./redis-trib.rb create --replicas 1 192.168.31.1:6379 192.168.31.1:6380 192.168.31.1:6381 192.168.31.1:6389 192.168.31.1:6390 192.168.31.1:6391

slot 一个集群包含16384(16*1024)个hash slot。使用CRC16(key)/16384来计算key放到哪个slot。
cluster nodes //查看slot分布
redis-cli -c //connect as a cluster client
不能使用mset,可以通过{}来定义组的概念,从而使key中{}内内容相同的键值对放到一个slot中去。
cluster keyslot //计算key所在的slot编号
cluster countkeysinslot
cluster getkeysinslot

故障恢复
如果主节点下线,从节点能自动升级吗?
虽然没有哨兵,但是也可以。
如果所有某一槽段的主从节点都宕掉,redis服务是否还能继续?
设置了cluster-require-full-coverage,则全宕。

Redis集群无中心,配置相对简单。

Redis的四种模式,单机、主从、哨兵、集群

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值