redis高级


redis高级

1. redis持久化

redis的持久化的方式有两种,rdb和aof,对应的是快照和日志,前者侧重内容,后者侧重记录方式.

1.rdb持久化

rdb方式:做的操作的步骤 ,存的快照.

1.save命令 
 主动将快照保存
 工作原理:会阻塞所有进程,不对外提供服务.
2. bgsave
 后台将快照保存,不会阻塞.
 会生成子进程保存,不会使用主进程.

3.持久化相关配置文件
save seconds change
如 save 300 1;
表示300秒内1个发生了变化就持久化.
save配置后是bgsave命令

4. rdb的优缺点
优点:
* 快照方式保存,存的快
* 恢复快
缺点:
* 无法实时持久化
* 子进程消耗资源
* 各个版本rdb文件格式不同,无法兼容.

1.aof持久化

记录操作的记录,记录的日志.
1. aof开启
appendonly yes
2. aof策略
appendsync :
always 每条都记录
no 系统决定
everysec 每秒
3. aof重写
aof记录每一条指令,会造成冗余,因此会将若干条指令重写为结果指令记录.
bgwriteaof: 手动重写
4. 配置文件中开启重写
auto-aof-rewrite-min-size size
auto-aof-rewrit-percentage percentage

2. 事务

redis单线程操作也会有数据安全问题,这里的事务和mysql中并发造成的不同,是一种客户端主观上的的数据问题.

1.事务的基本操作

1. 开启事务
multi 
开启事务后 后面的命令都加到事务中
2 执行事务
exec
事务结束,同时执行事务.

事务内的命令会加到一个任务队列中,结束时一起执行.

3 取消事务
diccard 
终止当前事务,在multi和exec之间

2.事务的注意事项

1. 如果命令有语法错误 事务会取消
2. 如果命令没有语法错误,但不合规定(对数据类型用了另一种数据类型的指令),正确的执行,错误的不执行.
此种情况需要程序员回滚,redis没有设计回滚.

3.事务的锁

1.如何加锁
watch key [key2...] 
如果在执行exec前key发生了变化,终止事务.
unwatch 取消所有对key的监视.

2.分布式锁
问题 当多个客户端想要操作同一个数据时?如超卖问题

setnx  key value ;
这个指令如果没有key返回成功,如果已有key返回失败.

此为约定规范,需要在代码层面实现.

3. 分布式锁的死锁问题
锁是程序约定的,当一个程序加了锁后,突然挂了,此时没有解锁会有死锁问题.
我们可以给锁加一个时效,当约定时间过去后锁自动失效.
expire key seconds :设置过期秒数
pexpire key millisseconds:设置过期毫秒数
expireat key timsramp:设置过期时间戳
pexpireat key timsramp:设置过期时间戳 毫秒

3. 删除策略

ttl可以查看,数据的状态.
所谓删除策略是,当删除指令发出后,因为cpu占用等问题并不会马上执行删除,redis如何删即为策略.

1.何为过期数据

设置key时过期的数据

2.过期数据的存储结构

内部有一个存储过期时间和keys地址的数据结构. 叫做expires.

3.三种删除策略

有三种删除策略
1.定时删除 到点就删除,抢占cpu
    内部有个函数,一直不停循环expires.
2.惰性删除 到点不管,下次访问时检查是否过期,然后删除. 节约cpu,内存换cpu.
    访问时循环expires
3.定期删除 类似于gc.
    * 服务启动时读取server.hz,
    * 每秒执行server.hz十次serverCron()->databasesCron()->activeExpireCycle(). activeExpireCycle()每次执行250ms
    * activeExpireCycle() 对每个expires逐一检测.
    * 对每个expires检测时,随机挑选w个key检测.
    * 若发现删除key>W*25%,循环该过程.
    * key<W*25%,检查下一个.
    * activeExpireCycle()执行时间到期,会记录当前db,下次从此db开始.
    w配置文件中设置

4.逐出策略

    何为逐出策略:注意和删除策略分开,删除策略是删除expires的,逐出是内存不足时强制的,可能波及无辜,删除expires外的数据.  
    redis 在存入新数据时,会调用ferrMemoryifNeeded()检测内存是否充足,如果不充足,需要删除一些数据清理内存空间.  

maxmemory 默认全占有  

manmemory-samples    每次选取待删除数据的个数。

全表扫描占用时间,随机获取数据作为待检测删除数据. 
maxmemory-policy 达到最大内存后,对选出的数据删除的策略.
    * 检测可能会过期的:设置了过期时间的
    volatile-lru: 最近最少使用的(距离上次使用最远的)
    volatile-lfu: 次数最少的
    volatile-ttl: 将要过期的
    volatile-randow: 任意选择
    * 检测全库:不管是不是设置了过期时间
    allkeys-lru: 最近最少使用的(距离上次使用最远的)
    allkeys-lfu: 次数最少的
    allkeys-randow: 任意选择
    * 放弃驱逐
    no-enviction 会内存溢出

4. redis.conf详解

见配置文件

5. 高级数据类型

前面已经讲了五种基础数据类型.
高级数据类型只是为了解决单一的问题.

1.bitmaps

存储的都为1和0
1.bitmap的应用场景
2.基础操作
1.获取指定key对应偏移量上的bit值
getbit key offset
2. 设置指定key对应偏移量上的bit值,value只能是1或0
setbit key offset value
3. 交并或异或
* bitop and destkey key1 [key2]
* bitop or destkey key1 [key2]
* bitop not destkey key1 [key2]
* bitop xor destkey key1 [key2]
4. 统计指定key中1的量
bitcount key [statr end]

bitmap 应用于信息状态统计 如电影是否被看过

2.HyperLogLog

基数统计 
基数:数据集合去重后的结果集合
HyperLogLog做基数统计,运用了LogLog算法.  (不懂,了解吧)

1.添加数据
 pfadd key elemennt [ element ..]
2.统计数据
 pfcount key [key ..]
3.合并数据
 pfmegrge destkey sourcekey [key ..]

 HyperLogLog 应用于信息数量状态统计

3.GEO

如分享位置后计算地图上两个点的距离.
微信中查看附近的人
1.添加坐标点
geoadd key longitude latitude memeber [ 多个]
2.获取坐标点
 geopos key memeber [多个]
3. 计算坐标点距离
geodist key memeber1 member2

4.给一个坐标 求他附近某个范围的其他点
georadius key longitude latitude radius(范围) m|km|ft|mi(单位)
5.给一个点,求他附近某个范围的其他点
georadiusbymemeber key member radius(范围) m|km|ft|mi(单位)
6.获取指定点对应的hash值
geohash key member [多个]

Author: 向天歌
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint policy. If reproduced, please indicate source 向天歌 !
  TOC