Redis

NoSQL,单线程

  • 方便扩展
  • 大数据量,高性能(1秒写8万,读11万)
  • 数据类型多样性(不需要事先设计表)

NoSQL类型:

  1. KV键值对数据库 redis
  2. 文档型数据库 mongoDB
  3. 列储存数据库 HBase 分布式文件系统
  4. 图关系数据库 (存关系)Neo4j InfoGrid

安装Redis

  1. 下载 redis (程序一般放在opt)
  2. 解压 tar -zxvf (配置文件 redis.conf)
  3. cd redis-XXX
  4. make 32bit (64位系统直接使用make即可)
  5. sudo make install
  6. redis.conf
    daemonize yes 守护进程
  7. redis-server XXX/redis.conf 启动指定配置的 redis
    ps -ef|grep redis 查看redis进程
    redis-cli -p 6379 (主机-h)
    ping
  8. redis-benchmark 压力测试工具

Redis命令

set
get
del
keys * 查看当前数据库所有key
type
shutdown 关闭链接
exit 退出
select 3 切换数据库(默认16个数据库,默认第0个)
dbsize 数据库大小
flashall flashdb 清空全部(当前)数据库
EXISTS 存在key返回1否则0
move 移动key到数据库
EXPIRE 设置过期秒数
ttl 查看key过期秒

Redis数据类型

  1. string
  2. list
    Lpush 列表插入头部
    Rpush 列表尾部插入
    Lpop 列表头部移除
    Rpop 列表尾部移除
    Lset 更新值
    Lrange list 0 -1 获取全部(0到-1)list值
    Lindex 通过下标获取值
    Llen
    Lrem 移除几个某值
    Ltrim 截取
    RpopLpush 从列名1移动到列名2
    Linsert before after 插入
  3. set 无需 不重复
    sadd
    SMEMBERS 查看所有元素
    SISMEMBER 是否存在元素
    scard 元素个数
    srem 移除
    SRANDMEMBER 随机取 (计算机伪随机)
    spop 随机移除
    smove 移动到另一个set
    SDIFF 差集
    SINTER 交集
    SUNION 并集
  4. Hash 值为Map集合
    hset
    hget
    hmset 键值1 键值2 ...
    hmget
    hgetall
    hdel
    hlen
    HEXISTS
    hkeys
    hvals
    HINCRBY 增加数
    HDEBRBY
    hsetnx 不存在的情况下创建
    变更的数据 类似用户信息
  5. ZSET 有序集合
    zadd key score value
    ZRANGE 从小到大排序
    ZRANGEBYSCORE key -inf +inf 带数 withscores
    ZREVANGE 从大到小排序
    zrem
    zcard 获取有序集合个数
    zcount 11 33 获取指定区间成员数量
  6. geospatial 地理位置
    类似ZSRET
    GEOADD key 116.40 39.9 beijing
    GEOPOS 返回经纬度
    GEODIST 用经纬度返回距离
    GEOHASH
    GEORADIUS 获取半径内的元素 withdist withcoord count
    GEORADIUSBYMEMBER
  7. Hyperloglog 基数 (不重复元素个数)
    用户数 有一定错误 12k存储空间
    PFADD
    PFCOUNT
  8. Bitmaps
    setbit key 位置 1
    getbit
    bitcount

Redis事务

  • 不保证原子性(要么同时成功要么同时失败)
    错误命令,都不运行
    运行错误,该命令报错
  • 一致性、顺序性、排他性
  • 开启事务 multi
  • 命令入队
  • 执行命令 exec
  • 放弃命令 discard

乐观锁

(悲观锁 任何操作都要加锁)

  • watch value 监控值与执行时是否相等
  • multi 命令入队 exec 执行前被修改为其他值则(nil)
  • ABA问题 版本、时间戳
  • 重入机制 unwatch后可重新加锁

Redis配置文件

  • unit单位 大小写不敏感
  • include 包含其他配置文件
  • 网络
    绑定网卡IP bind 127.0.0.1 bind 0.0.0.0
    protected-mode yes 保护模式
    port 6379
  • 通用
    daemonize yes 以守护进程方式运行
    pidfile /var/run/redis_6379.pid 指定pid文件(如果以守护进程方式运行)
    loglevel 日志级别
    logfile "" 日志位置文件名
    database 16 数据库数量
    always-show-logo yes
  • 快照
    持久化,规定时间内执行了多少次操作会持久化
    save 900 1 900秒内至少修改1个key
    stop-writes-on-bgsave-error yes 持久化出错是否继续工作
    rdbcompression yes 是否压缩rdb文件
    rdbchecksum yes 保存rdb文件进行校验
    dir ./ rdb文件报错目录
  • 复制
  • 安全
    requirepass 设置密码
  • 限制
    maxclients
    maxmemory
    maxmemory-policy 内存达到上限后的处理策略
  • APPEND ONLY模式
    appendonly no 默认是RDB
    appendfilename "appendonly.aof"
    appendfsync everysec 每秒同步 always 每次修改同步 no 由操作系统同步

Redis持久化

  1. RDB(默认)
    fork一个子进程,将内存快照数据写入二进制文件,临时RDB到正式RDB
    /usr/local/bin/dump.rdb (生产环境有时需要备份)
    /usr/local/bin放入dump.rdb启动数据库可恢复数据
    save 同步持久化
    bgsave 异步持久化
  2. AOF
    写日志记录,fork子进程重写
    AppendOnly yes 开启 重启redis后生效
    appendonly.aof 文件记录所有操作
    redis-check-aof --fix 修复aof文件
    aof文件过大将fork一个进程重写
    no-appendfsync-on-rewrite no
    auto-aof-rewrite-percentage 200
    auto-aof-rewrite-min-size 64mb

Redis订阅发布

cli发布,订阅的cli接收(redis维护字典 链表)
PSUBSCRIBE pattern [pattern...] 订阅给定模式的频道
SUBSCRIBE channel 订阅
UNSUBSCRIBE channel 退订
PUBLISH channel message 发布

Redis主从复制


最低1主2从,读写分离 主写从读
环境配置,只配从库,默认都是master
命令:
info replication
SLAVEOF IP PORT
配置文件:replication,主机密码
全量复制:slave启动发送sync同步命令
增量复制:slave启动后master新增数据的同步

上图结构,Master关闭后,Slave1可通过命令
SLAVEOF no one 成为Master

  1. 数据冗余
  2. 故障恢复
  3. 负载均衡
  4. 高可用性(集群)基石

Redis哨兵模式

Master宕机,自动将一个Slave转为Master,旧Mater回归则成为Slave(Redis 2.8)



多哨兵模式

  • 哨兵发现Master宕机 主观下线
  • 投票选新Master
  • 故障转移failover
    切换Mater(发布订阅模式)客观下线
  1. 哨兵配置 Sentinel.conf
    sentinel monitor 名 host port 1
    1代表会投票
  2. 启动哨兵
    redis-sentinel 配置文件

哨兵缺点:在线扩容比较麻烦

缓存穿透、击穿和雪崩

  • 缓存穿透
    读请求数据,缓存Redis和MySQL都不存在情况下,一直发送请求
  1. 用户鉴权校验
  2. 新建短期key-null
  • 缓存击穿
    读请求数据,缓存Redis没有MySQL有,大量用户同时访问MySQL
  1. 热点数据不过期
  2. 分布式锁(同时只允许一个用户访问)
  • 缓存雪崩
    缓存中数据大批量过期,而请求压力巨大
  1. 热点数据不过期,数据预热
  2. 异地多活
  3. 限流降级
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,047评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,807评论 3 386
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,501评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,839评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,951评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,117评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,188评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,929评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,372评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,679评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,837评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,536评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,168评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,886评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,129评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,665评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,739评论 2 351

推荐阅读更多精彩内容