可以当作目录使用,可以以此做更深入了解
redis整理笔记
redis特点
- redis是开源的,BSD许可,key-value存储系统
- 内存型数据库
- 多种数据类型
- 支持持有化
- 支持多语言
- 高可用、分布式
- 功能丰富(发布订阅、事务、lua脚本)
- 单线程
和memcache区别
- redis可以做内存数据库存储(storage),memcached是用来做内存缓存(cache),主要是因为redis有持久化功能
- redis有多种数据结构包括字符串,hash,list,集合,有序集合,memcached只有字符串
- 超过100k数据,memcached性能更改,memcached最大value为1M,redis为512M
- redis可以做模糊查询,交集并集操作
命令
启动(redis-server)、连接(redis-cli)、检测aof日志工具(redis-check-aof)、检测rbd日志工具(redis-check-dump)、性能检测(redis-benchmark)
可支持10wQPS,应用于缓存系统、消息队列、排行榜、社交系统、实时系统等场景
redis数据结构
一、字符串(string)
延申数据类型,本质是字符串
- Bitmap(位图),通过很小内存实现高效存储,可用于ip过滤等
- HyperLogLog,超小内存(12k)实现唯一值技术,是一种概率算法,有一定误差(不到1%)
api- KEYS,可以模糊查询(和memcached区别),?,[],*
- randomkey,随机取key(抽奖场景)
- type (key),key类型
- exists key是否存在
- del key 删除
- rename key newkey 重命名
- renamenx key newkey (nx不存在),如果不存在则重命名
- move name db(redis默认开启16个服务器,默认进入0号服务器),移动到其他服务器
- set 默认有效期-1(永久有效)
- ttl 查询有效期(s)pttl(毫秒)
- expire key int(s) 设置生命周期(s)pexpire(ms)
api
- set key value [ex 秒| px 毫秒] [nx]/xx
set key value ex 10 nx- mset 设置多个值
set a avalue b bvalue- get key
- mget k1 k2
- incr key 整型自增1; decr key 整型自减1;incr key k 自增k;decr key k 自减k
- getset key newvalue 设置newvalue,返回旧值value
- append key value 旧值追加value
- strlen key 字符串长度
- getrange key start end [start,end]包括开始结束
- 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
- lpush,rpush左右插入链表 lpush k1 k2...
- lpop,rpop左右产出链表
- lrange key start end 获取链表索引内数据(切片)
- lrem key count value 删除count数量的value值,count正负表示从左到右还是从右向左
- ltrim key start end 切片截取
- lindex key 切片获取
- llen 链表长度
- linsert key before|after value newvalue 中间插入
- brpop,blpop,等待队列中有值弹出,阻塞
set集合
特点:无序,唯一性st
使用场景
- 抽奖 spop srandmember
- 文章like、赞、踩
- 用户标签集合
- 用户共同关注
api
- sadd key value1 value2 添加集合元素
- srem key value1 value2
- scard key 计算集合大小
- sismember key value 是否存在
- srandmember key count 随机挑count个元素
- spop key 随机弹出一个元素
- smembers key 获取所有集合元素(阻塞)
- sinter k1 k2 交集
- sdiff k1 k2 获取不同value
- sunion k1 k2 取并集
- sinter|sdiff|sunion+store destkey 将操作后的集合,存到destkey
zset有序集合
特点:唯一、有序(sroce标记顺序)
api
- zadd key score1 value1 score2 value2
- zrem key value1 value2
- zscore key value 返回元素score
- zincrby key increScore value +-元素score
- zcard key 返回元素总数
- zrank key value 查询value排名(0名开始)
- zrevrank,和zrank相反
- zrange key start end
- zrevrange
hash
特点:是一个mapMap结构
key为字符串,value分两部分,一部分时field唯一,一部分是value
比如
api
- hset key field value设置hash key对应的field的value
- hget key filed 获取hash key对应的field的value
- hdel key field:删除hash key对应的field的value
- hexists key field:判断hash key是否有field
- hlen key:获取hash key field的数量
- hmget key field1 field2 ... fieldN:批量获取hash key的一批field对应的值
- hmset key field1 value field2 value2...fieldN valueN:批量设置hash key的一批field value
- hvals key:返回hash key对应所有field的value
- hkeys key:返回hash key对应的所有field
redis事务
redis事务是其原子性的体现
与MySQL事务的区别
- 开启方式,start transaction(mysql),muitl(redis)
- 语句,普通sql(mysql,一些语句会立即提交事务,比如建表语句),普通命令
- 失败,rollback回滚,discard取消(不可直接执行),已经执行的语句rollback回滚,影响会消失,命令取消会,其影响不会消失
- 成功,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主从复制
优点
- 主从备份,防止机器宕机,数据丢失
- 读写分离,减轻机器负担
- 任务分离,比如计算任务和备份任务
方式- slave1-->master<--slave2,master宕机,要切换一个子节点为master,另一个子节点从新指向master
- master<--slave1<--slave2,master宕机,只需切换slave1为master节点即可
- 切换通过slaveof配置
主从复制(每次从服务器启动都要执行一遍复制,不要一下启动多个从服务器)- slave启动,从配置中发现master,并连接
- master将RDBjump给slave
- master将jump过程中缓冲的AOF给slave
保持replicationFeedSlaves进程,有数据变更,同步给slave
配置
master- 关闭RDB(交给slave)
- 可以开启aof
slave- slaveof
- 是否只读
- 配置密码,如果master有
- 一台产生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)
流程
- sentinel不断和master通信,获取master的salve信息,监听master和salve的状态
- 如果某个salve失效,通知master去除该salve
- 如果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设计原则
- 表名:主键:值
- 模块前缀(很多都是树形数据结构)
- 分库的时候可以只对前缀分库,可以保证同一个模块或者同一个用户的数据在同一台机器