redis 清除内存机制
1.惰性删除 调用key的时候检查是否过期,已过期删除并返回nil
2.定期删除
定期删除原理:随机抽样,删除的key大于抽样数量的1/4继续删 执行时间太长的话主动中断
3.最大内存检查 设置总内存最大限制,如果到限制后,触发主动淘汰机制
volatile-lru,volatile-ttl,volatile-random,从已设置过期时间中的key
allkeys-lru,allkeys-random,从全部key
lru最近最少使用 ttl即将过期的 random随机
no-enviction禁入大多写命令
位图运算
setbit key 索引 0|1 将位的某个位置改为0或1
bitcount key start end 统计key所对应的值中有几个1 start和end代表字节索引
应用场景,登录天数统计,签到天数统计,登录设1未登录为0
命令
1.string
set key value nx ex nx:不存在才设置 ex:expire过期时间(单位s)
strlen key 获取key存储值的长度
getrange key start stop 获取指定范围切片内容(包含起点和终点)
setrange key index value 从索引值开始,用value替换原内容;返回最新长度
mset key1 value1 key2 value2 批量添加
mget key1 key2 批量获取
incrby key 步长 将key增加指定步长
decrby key 步长 将key减少指定步长
incr key 将key增加1
decr key 将key减少1
expire key 秒 设置key过期时间
pexpire key 毫秒 设置key过期时间 毫秒
2.list
元素是字符串类型,两边快中间慢,最多2^32-1个元素,索引同python列表,元素可重复
lpush key value1 value2
rpush key value1 value2
rpoplpush src dst 从src尾部弹出一个元素加入到dst的头部;返回被弹出的元素
linsert key after|before value newvalue 在指定位置前后插入一个元素;执行成功返回列表长度
lrange key start stop
llen key
lpop key
rpop key
blpop key timeout 列表头部阻塞弹出,列表为空时阻塞
brpop key timeout 列表尾部阻塞弹出,列表为空时阻塞
lrem key count value 删除指定元素,count指定个数 大于0从左边,小于0从右边
ltrim key start stop 保留置顶范围内的元素,其他删除
lset key index newvalue 更新list指定索引的值
3.hash
由field和关联的value组成的键值对,都是字符串类型,最多2^32-1个键值对
无法对key内的值设置过期时间,只能对key设置
hset key field value
hsetnx key field value
hmset key field value field2 value2
hlen key
hexist key field
hget key field
hmget key field field
hgetall key
应用场景:1用户维度数据统计,关注数,粉丝数,喜欢商品数,发帖数
2缓存
python 字典:
d={}长度为8的数组
d['a'] = 'cs' -> hash('a')计算出位置 产生哈希冲突采用开放地址法(偏移量)
使用超过三分之二,扩容->rehash
删除key时,采用伪删除,方便查找时还原路径,保持查找探测链
redis hash:
哈希冲突->单链法(开放新的链表结构存储)
扩容->used/len 大于五扩容 大于1可能扩
扩容方式->第一个大于used*2的2的n次方
rehash方式->渐进式,逐步迁移,分散在调用数据时迁移到新表
4.set
无序,去重,元素是字符串类型,最多2^32-1个元素,与python集合一样
sadd key member1 member2
smembers key
srem key member1 member2
sismember key member
srandmember key count 随机抽取成员
spop key count 随机弹出成员
scard key 计算集合中元素个数
smove source destination member 把元素从原集合移动到目标集合
sdiff key1 key2 差集 key1
sdiffstore destination key1 key2 差集保存至另一个集合中
sinter key1 key2 交集
sinterstore destination key1 key2
sunion key1 key2 并集
sunionstore destination key1 key2
应用场景:共同好友(交集),抽奖(srandmember),防止元素重复,黑白名单,考试随机生成题目
5.zset
有序,去重,元素是字符串类型,每个元素都有一个浮点型的分值,按照分值从小到大排序
zadd key sorce member 先给分再给元素
zrange key start stop [withscores] 升序
zrevrange key start stop [withscores] 降序
zscore key member
zrank
zrevrank
zrangebyscore key min max [withscores][limit offset count]
zrem key member
zincrby key increment member
zremrangebyscore key min max 删除指定区间的元素
zcard key
zcount key min max
zunionstore destination numkeys key[weights 权重值][AGGREGATE SUM|MIN|MAX] 并集
zinterstore destination numkeys key[weights 权重值][AGGREGATE SUM|MIN|MAX] 交集
应用场景:员工薪水
事务acid
原子性:要么全部成功要么全部失败
一致性:执行前后都要数据完整性都要一致(redis事务的目标)
隔离性:事务和事务之间互不打扰
持久性:事务一旦提交,对数据库的改变应该是永久的
redis是弱事务型数据库,并不具备全部ACID
具备隔离性,不保证原子性和一致性,持久性也是redis的弱项
命令:
multi 开启事务 开启事务之后,redis开放一个存储空间存放命令
执行redis命令
exec执行事务
discard取消事务
特殊情况:
1语法错误,自动执行discard,事务失效
2语法无错误,但是类型操作错误,除执行错误语句其他全部成功执行
pipeline 流水线,结合redis思想开发的客户端技术
打包命令,一次发送
降低了客户端和服务端之间的网络通信
创建连接池redis.ConnectionPool,创建pipeline 输入命令 执行execute返回所有执行结果
python-> with r.pipeline(transaction=True) as pipe: pipe.multi() pipe.命令 pipe.execute
乐观锁watch
监听一个key,再开启一个事务,若被监听的key在这个事务执行前和过程中被修改,则该次事务执行失败
数据持久化RDB与AOF
将数据从掉电易失的内存中放到永久存储的设备上
redis提供两种方式,RDB默认开启
RDB:
1.保存真实数据
2.将服务器包含的所有数据库数据以二进制文件保存到硬盘中
3.默认路径,/var/lib/redis/dump.rdb
文件名和目录可在配置文件中修改,/etc/redis/redis.conf
dir /var/lib/redis rdb的存放路径
dbfilename dump.rdb 文件名
4.触发RDB- SAVE或GBSAVE命令
SAVE命令执行过程中,redis服务器将会阻塞,无法处理客户端的命令,直到save命令执行完毕
如果RDB文件存在,那么将会用新的替代旧的
BGSAVE->多线程 fork()子进程进行RDBsave
正常关闭redis服务的时候,会触发RDB
5.从配置文件中触发rdb持久化
save 900 1
save 300 10
表示如果距离上一次rdb文件创建已经过去300秒,并且服务器的所有修改次数不少于10次
save 60 10000
只要三个条件任意一个被满足,服务器就自动执行bgsave
每次创建RDB文件后,计数器就会清零重新计数
说明:
创建RDB文件需要将所有服务器的数据库资源都保存起来,这是一个非常消耗资源和时间的操作,
并且创建RDB文件不能过于频繁,否则影响服务器的性能。
每次RDB持久化总有时间间隔,间隔期间可能会丢失数据
AOF:
1.存储命令,而不是真实数据
2.默认不开启
开启方式(修改配置文件)
1./etc/redis/redis.conf
appendonly yes
appendfilename "appendonly.aof"
2.重启服务
sudo /etc/init.d/redis-server restart
3.执行原理
1.每当修改数据的命令被执行时
2.AOF文件中存储了执行过的命令,当服务器重启时,服务器只要重新执行一遍AOF文件中的命令,就能还原redis
3.用户可以根据需要对AOF持久化进行修改,让redis遭遇意外时不丢失任何数据,或只丢失一秒钟的数据
4.特殊说明
1.系统在写入命令时,不用直接将内容写入硬盘中,而是将内存放入一个内存缓冲区buffer中,等到缓冲区被存满
再将内容全部写入到硬盘中
2.由于上述原因,当AOF持久化遭遇停机丢失命令的数量取决于写磁盘的时间,越早将命令写入磁盘丢失的数据就越少
5.相关配置
/etc/redis/redis.conf
always
服务器每写一条命令就将命令写入到硬盘里
everysec
每一秒写入磁盘
no
不主动写入磁盘,由操作系统决定何时写入磁盘
6.AOF重写
AOF文件要大于RDB,产生很多冗余命令
为了让AOF文件控制在合理范围,避免胡乱增长,redis提供AOF重写功能,通过这个功能,服务器可以产生一个新的AOF文件
新的AOF文件记录的数据库数据和原来的AOF文件记录的数据库数据完全一样
新的AOF文件会使用尽量少的命令来记录数据库数据,因此新的AOF文件通常会小很多、
AOF重写期间,服务器不会被阻塞,可以正常给客户端发送的命令请求
触发AOF重写
1.客户端向服务端发送GBREWRITEAOF
2.通过修改配置文件让服务器自动触发BGREWRITEAOF命令
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
1.只有当AOF文件增量大于100%时才进行重写,也就是大于一倍的时候触发
第一次重写新增64M
第二次重写新增128M
第三次重写新增256M
主从复制:
redis高可用方案,主从复制+哨兵
1.一个Redis服务可以有多个该服务的复制品,master+slaves
2.主从数据同步
3.只有master能写,slaves只能读
作用:分担了高并发情况下读命令的压力,提高可用性
原理:从服务器执行执行客户端发送的读命令,客户端可以连接slaves执行读请求,降低master压力
主从搭建-在多台机器上运行
redis-server --port --slaveof ip port masterauth
>slaveof IP PORT 使服务器成为谁的从服务器
>slaveof no one 自封为王
使用配置文件:
每个redis服务器有个健全的配置文件.conf
哨兵:sentinel
1.Sentinel不断检查Master和Slaves的状态
2.每一个Sentinel可以监听任意多个Master和该Master下的Slaves
当确定master阵亡后,自动将切换工作完成
redis-sentinel .conf