目录
基础知识
基于Center OS7安装Redis
- 下载安装包:wget http://download.redis.io/releases/redis-5.0.5.tar.gz
- 解压:tar –xvf 文件名.tar.gz
- 安装:进入redis-5.0.5文件夹 make install
环境配置
- 创建配置文件管理目录 mkdir conf
- 创建数据文件管理目录 mkdir data(存放日志)
Redis服务启动
- redis-server 默认启动
- redis-server –-port 6379 指定端口号启动
- redis-server conf/redis-6379.conf 指定配置文件启动
客户端连接
- redis-cli 默认连接
- redis-cli –port 6379 指定端口号连接
redis服务配置文件基本配置
- daemonize yes:以守护进程方式启动,使用本启动方式,redis将以服务的形式存在,日志将不再打印到命令窗口中(在后台启动,可以同时打开多个服务器)
- port 6***:指定端口号
- dir “/自定义目录/redis/data“:设定当前服务文件保存位置,
- logfile "6***.log“:设定日志文件名称
配置文件示例
目录结构
持久化
持久化:利用永久性存储介质将数据进行保存,在特定的时间将保存的数据进行恢复的工作机制称为持久化。
持久化过程分为两种:
- 将当前数据状态进行保存,快照形式,存储数据结果,存储格式简单,关注点在数据(RDB)
- 将数据的操作过程进行保存,日志形式,存储操作过程,存储格式复杂,关注点在数据的操作过程(AOF)
RDB
save:手动执行一次保存操作
save相关的配置
- dbfilename dump-端口号.rdb 设置本地数据库文件名
- rdbcompression yes 设置存储至本地数据库时压缩数据
- rdbchecksum yes 设置进行RDB文件格式校验
save指令执行会阻塞当前Redis服务器,直到当前RDB过程完成为止,有可能会造成长时间阻塞
bgsave:手动启动后台保存操作,但不是立即执行
bgsave相关配置:在save配置的基础上添加
- stop-writes-on-bgsave-error yes 后台存储过程中如果出现错误现象,停止保存操作
bgsave原理:不会阻塞主进程,它会生成一个新的子进程来完成保存操作
配置文件
自动存储save 配置:
save second changes second:监控时间范围 changes:监控key的变化量
例如:save 900 12 在900秒内 有12次修改数据 就会进行保存
做演示可以设置为:save 10 2
save、bgsave对比
方式 | save | bgsave |
读写 | 同步 | 异步 |
阻塞客户端指令 | 是 | 否 |
额外内存消耗 | 否 | 是 |
启动新进程 | 否 | 是 |
补充:关闭服务器时会自动执行bgsave (shutdown命令)
AOF
AOF:以独立日志的方式记录每次写命令,重启时再重新执行AOF文件中命令达到恢复数据的目的。与RDB相比可以简单描述为改记录数据为记录数据产生的过程。AOF的主要作用解决了数据持久化的实时性
AOF写数据的过程
写数据(set)->服务器开启子进程->将指令放入aof缓存区内->满足条件,将命令同步到aof文件中
AOF写数据的三种策略:将命令同步到aof的频率
- always(每次)
- everysec(每秒)(默认)
- no(系统控制):由操作系统控制每次同步到AOF文件的周期,整体过程不可控
配置文件
- appendonly yes 开启AOF持久化
- appendfsync always|everysec|no 设置AOF写数据策略
- appendfilename appendonly-端口号.aof 设置AOF持久化文件名
配置文件示例
AOF重写
作用
- 降低磁盘占用量,提高磁盘利用率
- 提高持久化效率,降低持久化写时间,提高IO性能
- 降低数据恢复用时,提高数据恢复效率
例如:set a 1 set a 8 set a 9 =>set a 9 (删除掉无效指令,同一数据的多条写命令将合并为一条命令)
bgrewriteaof 手动重写(在客户端执行)
自动配置(自行设置参数):
- auto-aof-rewrite-min-size size
- auto-aof-rewrite-percentage percent
自动重写触发比对参数( 运行指令info Persistence获取具体信息 )
- aof_current_size
- aof_base_size
触发条件
AOF重写流程(注意有一个aof重写缓冲区)
RDB、AOF的区别
持久化方式 | RDB | AOF |
占用存储空间 | 小(数据级) | 大(指令级) |
存储速度 | 慢 | 快 |
恢复速度 | 快 | 慢 |
数据安全性 | 会丢失数据 | 依据策略决定 |
资源消耗 | 重量级 | 轻量级 |
启动优先级 | 低 | 高 |
注:
- 对数据非常敏感,建议使用默认的AOF持久化方案
- 数据呈现阶段有效性,建议使用RDB持久化方案
Redis 事务
在Redis执行指令过程中,多条连续执行的指令被干扰,打断,插队;所以我们要使用事务
例子:
客户端1:①set a 11 ③get a 客户端2:②set a 12
序号表示执行顺序,客户端1想要得到“11”,但是得到了“12”
事务的基本操作
- 开启事务:multi
- 执行事务:exec
- 取消事务:discard 终止当前事务的定义,发生在multi之后,exec之前
加入事务的命令暂时进入到任务队列中,并没有立即执行,只有执行exec命令才开始执行
注意事项:
- 在事务过程中,命令格式输入错误,整个事务会直接销毁
- 在事务过程中,命令执行出现错误,运行错误的命令不会被执行,它会返回提示信息
- redis不会事务回滚
事务的工作流程(5种指令)
锁
监视锁
多个人监视同一个属性,这个属性一旦发生改变就会取消其事务
watch key1 [key2……]:对 key 添加监视锁,在执行exec前如果key发生了变化,终止事务执行
unwatch:取消监视
在exec之前,其他客户端已经将name修改了
分布式锁
避免多个用户同时操作一个数据
思想:先上锁,再执行指令
setnx lock-key value:使用 setnx 设置一个公共锁
del lock-key:释放锁
为锁添加时间限定 ,到时间自动放锁
- expire lock-key second
- pexpire lock-key milliseconds
10s后自动放锁
Redis 删除策略
redis的数据状态
- XX :具有时效性的数据
- -1 :永久有效的数据
- -2 :已经过期的数据 或 被删除的数据 或 未定义的数据
注意:过期数据并没有被立即删除
数据删除策略
定时删除
创建一个定时器,当key设置有过期时间,且过期时间到达时,由定时器任务立即执行对键的删除操作。
特点:节约内存、占用CPU 用处理器性能换取存储空间(时间换空间)
expires中 存储的是数据的地址值和对应的时效时间
惰性删除
数据到达过期时间,不做处理。等下次访问该数据时,如果未过期,返回数据;发现已过期,删除,返回不存在
特点:节约CPU性能、内存的压力很大,出现长期占用内存的数据;用存储空间换取处理器性能(空间换取时间)
定期删除
定时删除、惰性删除的折中方案
步骤:
Redis启动服务器初始化时,读取配置server.hz的值,默认为10
每秒钟执行server.hz次serverCron()会调用databasesCron方法->databasesCron()轮询每一个数据库并调用其-activeExpireCycle方法>activeExpireCycle()对数据库中的数据进行随机检测
特点:内存定期随机清理、每秒花费固定的CPU资源维护内存(随机抽查、重点抽查)
activeExpireCycle()方法:
- 在检测中,删除数据个>随机抽取数据总个数/4,继续循环检测
- 在检测中,删除数据个<=随机抽取数据总个数/4,进入到下一个数据库进行检测
注意事项:redis使用的是惰性删除和定期删除
逐出算法(8种)
当内存不足时,写入数据 的过程中会清除一些数据。清理数据的策略称为逐出算法。
检测易失数据(可能会过期的数据集server.db[i].expires)
- volatile-lru:挑选最近最少使用的数据淘汰(最早使用的)
- volatile-lfu:挑选最近使用次数最少的数据淘
- volatile-ttl:挑选将要过期的数据淘汰
- volatile-random:任意选择数据淘汰
检测全库数据(所有数据集server.db[i].dict )
- allkeys-lru:挑选最近最少使用的数据淘汰
- allkeys-lfu:挑选最近使用次数最少的数据淘汰
- allkeys-random:任意选择数据淘汰
放弃数据驱逐
- no-enviction(驱逐):禁止驱逐数据(redis4.0中默认策略),会引发错误OOM(Out Of Memory)
影响数据逐出的相关配置
- 最大可使用内存:maxmemory 占用物理内存的比例通常设置在50%以上
- 每次选取待删除数据的个数:maxmemory-samples
- 删除策略:maxmemory-policy
Redis核心配置(redis.conf)
服务端设定
- daemonize yes|no :设置服务器以守护进程的方式运行
- bind 127.0.0.1 :绑定主机地址
- port 6379 :设置服务器端口号
- databases 16 :设置数据库数量
日志配置
- loglevel debug|verbose|notice|warning :设置服务器以指定日志记录级别 (开发时期配置为verbose即可)
- logfile 端口号.log :日志记录文件名
客户端配置
- maxclients 0 :设置同一时间最大客户端连接数,默认无限制。当客户端连接到达上限,Redis会关闭新的连接
- timeout 300 :客户端闲置等待最大时长,达到最大值后关闭连接。如需关闭该功能,设置为 0
多服务器快捷配置
- include /path/server-端口号.conf :导入并加载指定配置文件信息
Redis高级数据类型
Bitmaps
基于string 存放bit值(存放数据的状态),存放的的信息 只有0或1,应用场景:存放大家的性别、存放大家是否为党员
- getbit key offset:获取指定key对应偏移量上的bit值
- setbit key offset value:设置指定key对应偏移量上的bit值,value只能是1或0
- bitop op destKey key1 [key2...]:对指定key按位进行交、并、非、异或操作,并将结果保存到destKey中
op: and-交 or-并 not-非 xor-异或
- bitcount key [start end]:统计指定key中1的数量
应用场景:
- 统计每天某部电影是否被点播:查看哪部电影的状态为1
- 统计每天有多少部电影被点播:计算一日内状态为1的个数
- 统计每年有多少部电影被点播:进行或运算,再统计状态为1的个数
- 统计年度没被点播的电影:进行或运算他,再统计状态为0的个数
描述:
2020/01/01 有2部电影被点播(0,7)
2020/01/02 有3部电影被点播 (0,7,8)
两天被点播的电影个数是3
HyperLogLog
它是用来做基数计算的,该计算方法为估算,消耗空间极小,每一个hyperloglog key占用了12k的内存用于标记基数,性能优于bitmaps
补充知识:
{1,1,1,2,2} 基数集:{1,2} 基数:2
常用方法:
- pfadd key element [element ...]:添加数据
- pfcount key [key ...]:统计数据
- pfmerge destkey sourcekey [sourcekey...]:合并数据
应用场景:与BitMapps相同,直接存放电影的id即可
描述:
2008/08/08 被点播了3部电影(1,2,7)
2008/08/09 被点播了3部电影(1,78,74)
两日共被点播电影的个数为5
GEO
存放坐标,并进行一系列运算
- geoadd key longitude latitude member [longitude latitude member ...]:添加坐标点
- geopos key member [member ...]:获取坐标点
- geodist key member1 member2 [unit]:计算坐标点距离
- georadius key longitude latitude radius m|km|ft|mi [withcoord] [withdist] [withhash] [count count]:根据坐标查找指定范围的点
- georadiusbymember key member radius m|km|ft|mi [withcoord] [withdist] [withhash] [count count]:根据点查找指定范围的点
- geohash key member [member ...]:获取哈希值
分析描述:
abcd 构成了一个正方形 e中点,f,h分别位于e的正上方和正下方 eh=111 ea=158
后面是使用指令查找指定范围内的点