redis整理笔记

可以当作目录使用,可以以此做更深入了解

redis整理笔记

redis特点

  1. redis是开源的,BSD许可,key-value存储系统
  2. 内存型数据库
  3. 多种数据类型
  4. 支持持有化
  5. 支持多语言
  6. 高可用、分布式
  7. 功能丰富(发布订阅、事务、lua脚本)
  8. 单线程

和memcache区别

  1. redis可以做内存数据库存储(storage),memcached是用来做内存缓存(cache),主要是因为redis有持久化功能
  2. redis有多种数据结构包括字符串,hash,list,集合,有序集合,memcached只有字符串
  3. 超过100k数据,memcached性能更改,memcached最大value为1M,redis为512M
  4. redis可以做模糊查询,交集并集操作

命令

启动(redis-server)、连接(redis-cli)、检测aof日志工具(redis-check-aof)、检测rbd日志工具(redis-check-dump)、性能检测(redis-benchmark)

可支持10wQPS,应用于缓存系统、消息队列、排行榜、社交系统、实时系统等场景

redis数据结构

一、字符串(string)

延申数据类型,本质是字符串

  1. Bitmap(位图),通过很小内存实现高效存储,可用于ip过滤等
  2. HyperLogLog,超小内存(12k)实现唯一值技术,是一种概率算法,有一定误差(不到1%)
    api
  3. KEYS,可以模糊查询(和memcached区别),?,[],*
  4. randomkey,随机取key(抽奖场景)
  5. type (key),key类型
  6. exists key是否存在
  7. del key 删除
  8. rename key newkey 重命名
  9. renamenx key newkey (nx不存在),如果不存在则重命名
  10. move name db(redis默认开启16个服务器,默认进入0号服务器),移动到其他服务器
  11. set 默认有效期-1(永久有效)
  12. ttl 查询有效期(s)pttl(毫秒)
  13. expire key int(s) 设置生命周期(s)pexpire(ms)

api

  1. set key value [ex 秒| px 毫秒] [nx]/xx
    set key value ex 10 nx
  2. mset 设置多个值
    set a avalue b bvalue
  3. get key
  4. mget k1 k2
  5. incr key 整型自增1; decr key 整型自减1;incr key k 自增k;decr key k 自减k
  6. getset key newvalue 设置newvalue,返回旧值value
  7. append key value 旧值追加value
  8. strlen key 字符串长度
  9. getrange key start end [start,end]包括开始结束
  10. setbit,getbit,最大232位,232/8字节(一个字节占8位),一个字节为1bite,(ASC码中一个英文占一个字节,中文占两个字节;Unicode中中英文都占两个字节;UTF8中英文占一个字节,中文占三个字节),如果用来存英文可以存a32/8/210 k的字符,等于232/8/210/2^10KB,等于0.5G,等于512M,所以redis的value可以存521M字符
list链表

链表结构,前一个元素存有后一个元素的地址
特点:有序,左右都可插入弹出,数据可重复
api

  1. lpush,rpush左右插入链表 lpush k1 k2...
  2. lpop,rpop左右产出链表
  3. lrange key start end 获取链表索引内数据(切片)
  4. lrem key count value 删除count数量的value值,count正负表示从左到右还是从右向左
  5. ltrim key start end 切片截取
  6. lindex key 切片获取
  7. llen 链表长度
  8. linsert key before|after value newvalue 中间插入
  9. brpop,blpop,等待队列中有值弹出,阻塞
set集合

特点:无序,唯一性st
使用场景

  1. 抽奖 spop srandmember
  2. 文章like、赞、踩
  3. 用户标签集合
  4. 用户共同关注

api

  1. sadd key value1 value2 添加集合元素
  2. srem key value1 value2
  3. scard key 计算集合大小
  4. sismember key value 是否存在
  5. srandmember key count 随机挑count个元素
  6. spop key 随机弹出一个元素
  7. smembers key 获取所有集合元素(阻塞)
  8. sinter k1 k2 交集
  9. sdiff k1 k2 获取不同value
  10. sunion k1 k2 取并集
  11. sinter|sdiff|sunion+store destkey 将操作后的集合,存到destkey
zset有序集合

特点:唯一、有序(sroce标记顺序)
api

  1. zadd key score1 value1 score2 value2
  2. zrem key value1 value2
  3. zscore key value 返回元素score
  4. zincrby key increScore value +-元素score
  5. zcard key 返回元素总数
  6. zrank key value 查询value排名(0名开始)
  7. zrevrank,和zrank相反
  8. zrange key start end
  9. zrevrange
hash

特点:是一个mapMap结构
key为字符串,value分两部分,一部分时field唯一,一部分是value
比如


image.png

api

  1. hset key field value设置hash key对应的field的value
  2. hget key filed 获取hash key对应的field的value
  3. hdel key field:删除hash key对应的field的value
  4. hexists key field:判断hash key是否有field
  5. hlen key:获取hash key field的数量
  6. hmget key field1 field2 ... fieldN:批量获取hash key的一批field对应的值
  7. hmset key field1 value field2 value2...fieldN valueN:批量设置hash key的一批field value
  8. hvals key:返回hash key对应所有field的value
  9. hkeys key:返回hash key对应的所有field

redis事务

redis事务是其原子性的体现
与MySQL事务的区别

  1. 开启方式,start transaction(mysql),muitl(redis)
  2. 语句,普通sql(mysql,一些语句会立即提交事务,比如建表语句),普通命令
  3. 失败,rollback回滚,discard取消(不可直接执行),已经执行的语句rollback回滚,影响会消失,命令取消会,其影响不会消失
  4. 成功,commit提交,exec

muitl会面的命令后放在队列里,如果语法错误,所有命令不执行,如果操作语句有问题直接跳过(discard),事务里的之前执行的语句不受影响

redis事务中,默认是乐观锁(更新时判断),watch key 监视key,当key有变时,事务不执行,unwatch(取消监视)

发布与订阅

消息推送
发布命令:
publish 频道名称 发布内容
publish new 'one new'

订阅命令:
subscribe 频道名称
subscribe new
psubscribe new*(通配符匹配,订阅多个)

pubsub管理发布订阅
发布订阅模式没有消息堆积的功能,即订阅者无法获取历史消息

持久化

RDB快照(内存快照)
工作原理:
每隔N分钟或者N次些操作(可配置)后,从内存中jump数据,形成RDB文件,压缩(方式可配置)后放在指定配置文件里
每次启动redis会恢复RDB数据,
可能会丢数据
配置:
save 900 1 // 900内,有1条写入,则产生快照
save 300 1000 // 如果300秒内有1000次写入,则产生快照
save 60 10000 // 如果60秒内有10000次写入,则产生快照
(从下往上生效,如果3个选项都屏蔽,则rdb禁用)
rdbcompression yes // 导出的rdb文件是否压缩
dbfilename dump.rdb //导出来的rdb文件名
dir ./ //rdb的放置路径
RDB的三种触发方式: 1. save(同步) 2. bgsave (异步) 3. 自动
RDB是redis主从复制中主要的复制媒介,
redis本身通过RDB形式的持久化方式进行复制文件的传输

AOF
工作原理:操作命令日志追加,可以和RDB同时存在
配置:
appendonly no # 是否打开 aof日志功能
appendfsync always # 每1个命令,都立即同步到aof. 安全,速度慢
appendfsync everysec # 折中方案,每秒写1次(丢一秒数据)
appendfsync no # 写入工作交给操作系统,由操作系统判断缓冲区大小,统一写入到aof.
no-appendfsync-on-rewrite yes: # 正在导出rdb快照的过程中,要不要停止同步aof(命令会放在内存,RDB完继续)auto-aof-rewrite-percentage 100 #aof文件大小比起上次重写时的大小,增长率100%时,重写
auto-aof-rewrite-min-size 64mb #aof文件,至少超过64M时,重写

RDB和AOF文件都是二进制,RDB恢复比AOF快,RDB和AOF可以都用,当都有时对剑用AOF恢复

redis主从复制

优点

  1. 主从备份,防止机器宕机,数据丢失
  2. 读写分离,减轻机器负担
  3. 任务分离,比如计算任务和备份任务
    方式
  4. slave1-->master<--slave2,master宕机,要切换一个子节点为master,另一个子节点从新指向master
  5. master<--slave1<--slave2,master宕机,只需切换slave1为master节点即可
  6. 切换通过slaveof配置
    主从复制(每次从服务器启动都要执行一遍复制,不要一下启动多个从服务器)
  7. slave启动,从配置中发现master,并连接
  8. master将RDBjump给slave
  9. master将jump过程中缓冲的AOF给slave
  10. 保持replicationFeedSlaves进程,有数据变更,同步给slave


    image.png

    配置
    master

  11. 关闭RDB(交给slave)
  12. 可以开启aof
    slave
  13. slaveof
  14. 是否只读
  15. 配置密码,如果master有
  16. 一台产生RDB
    可以用RDB或者AOF实现不同服务器redis复制
    停止redis进程,RDB文件才是完整的

慢日志

内存
used_memory:859192 数据结构的空间
used_memory_rss:7634944 实占空间
mem_fragmentation_ratio:8.89 前2者的比例,1.N为佳,如果此值过大,说明redis的内存的碎片化严重,可以导出再导入一次.

慢日志
config get/set slowlog-log-slower-than
config get/set slowlog-max-len
slowlog get N 获取慢日志

哨兵机制(sentinel)

流程

  1. sentinel不断和master通信,获取master的salve信息,监听master和salve的状态
  2. 如果某个salve失效,通知master去除该salve
  3. 如果master失效,根据salve优先级,选取一个salve做master,其他salve指向新的master
    可以起多个sentinel实例,当N个实例都认为某个节点失效,才真正失效
    配置
    port 26379 # 端口
    sentinel monitor mymaster 127.0.0.1 6379 2 ,
    给主机起的名字(不重即可),
    当2个sentinel实例都认为master失效时,正式失效
    sentinel down-after-milliseconds mymaster 30000 //多少毫秒后连接不到master认为断开
    sentinel can-failover mymaster yes //是否允许sentinel修改slave->master. 如为no,则只能监控,无权修改
    sentinel parallel-syncs mymaster 1 // 一次性修改几个slave指向新的new master.
    sentinel client-reconfig-script mymaster /var/redis/reconfig.sh //在重新配置new master,new slave过程,可以触发的脚本

key设计原则

  1. 表名:主键:值
  2. 模块前缀(很多都是树形数据结构)
  3. 分库的时候可以只对前缀分库,可以保证同一个模块或者同一个用户的数据在同一台机器

你可能感兴趣的:(redis整理笔记)