Redis
Remote DIctionary Server 是key-value非关系型数据库,通常运行在内存中。
redis采用单线程模型(I/O多路复用机制),每一条到达服务端的命令不会立刻执行,而是进入一个队列,逐个执行。因此不会有两条命令被同时执行,不需考虑并发安全性
使用场景
- 对于执行耗时久,经常需要调用,但结果不频繁变动的SQL,适合将运结果放入缓存,后续请求直接从缓存中获取,迅速响应。
- 处理高并发,利用redis做缓冲,而不是直接访问数据库。
数据类型
- String: 最基本的key-value操作,支持常规的set/get操作。可用于计数等场景
- Hash: 存放对象数据,即value内容为多个key-value键值对。方便后续修改其中的某个字段
- List: 可以做简单的消息队列或分页的功能。可用于消息队列等场景。
- Set: 无序集合 堆放不重复值,可通过方法查看某值是否存在,或取交集、并集。可用于已收藏列表、已关注用户等场景。
- Zset(Sorted Set): 有序集合 根据权重参数score做排序。可用于成绩、排行榜等场景。
数据命名
命名通常以:
分割,如operate_limit:action_quotation_create:898
内存释放机制
redis数据默认永不过期,即TTL(Time To Live)为-1。
对过期数据,redis采用定期删除+惰性删除:
- 定期删除 每100ms随机抽查部分key,将其中过期的释放
- 惰性删除 每当试图获取某个key时,检查其是否过期
当内存占满时,新的写入会报错。此时可在redis.conf(redis.windows.conf)文件中修改内存淘汰机制。
持久化
redis的数据直接在内存中进出,所以速度很快。但为了防止进程中止时数据丢失,redis也有自己的持久化策略。
- 两种持久化方式独立执行,可同时开启并分别生成
.rdb
和.aof
文件。 - 修改配置文件后需通过
shutdown
+redis-server
重启生效。 - 持久化策略生成的备份文件,都在redis目录下。每当redis启动时,会检查是否存在备份文件,存在则进行数据恢复(都存在则优先使用
.aof
)
RDB(全量保存)
redis默认会定期将内存数据库快照保存在/redis/dump.rdb
二进制文件中。其默认策略如下(采用bgsave
):
# save "" -- 开启该项并注释以下内容可关闭RDB
save 900 1 -- 900秒内至少有一个改动
save 300 10 -- 300秒内至少有10个改动
save 60 10000 -- 60秒内至少有10000个改动
通过在redis-cli
中执行save
或bgsave
指令,可以手动触发RDB持久化。
- save 同步执行,阻塞其他redis任务
- bgsave 异步执行,不阻塞redis,但占用内存较多
特点:
- 每次RDB都会将整个内存中的数据全部写入文件,当数据量较大时,频繁触发性能影响大,但触发间隔太长又容易丢失数据。
- 因使用二进制文件,文件更小,且执行数据恢复时更快
AOF(Append-Only File 增量保存)
类似mysql的二进制日志binlog,redis每执行一次写入,都会将该命令追加到/redis/appendonly.aof
文件中(先写入os cache,然后通过fsync刷盘)
-
aof文件修复
如在appendonly.aof
文件生成时进程崩溃,可能导致文件损坏,此时redis-cli
指令启动redis会失败,可通过/usr/local/bin/redis-check-aof --fix appendonly.aof
修复文件 -
AOF重写
redis会定期自动压缩appendonly.aof
文件,这一过程绝对安全,不会导致数据丢失
可通过修改redis.conf
修改相关配置,修改后需要重启redis生效:
# 启用AOF设置
appendonly yes:启用AOF(为no则禁用)
# 刷盘频率设置
appendfsync always:每次执行写命令都会刷盘,性能差,但最安全。
appendfsync everysec:(默认值)每秒刷盘一次,兼顾性能和安全,最多丢失1秒数据。
appendfsync no:不自动刷盘,仅由用户手动触发刷盘。
# AOF重写频率设置
auto‐aof‐rewrite‐min‐size 64mb:aof文件至少达到了64m才会触发重写
auto‐aof‐rewrite‐percentage 100:距离上次重写增长了100%才会再次触发重写
混合持久化
如可以接受数分钟的数据丢失,则只用RDB即可。
如不可接受,通常不单独使用AOF,而建议混合持久化(Redis 4.0以上):
开启混合持久化,需要先开启appendonly yes
aof‐use‐rdb‐preamble yes
开启后,每当AOF重写时,会将之前的内容按RDB方式存储,即appendonly.aof
中同时包含了RDB与AOF内容,同时避免了两者的弊端。
更多备份
- 写crontab定时调度脚本,每小时都copy一份rdb或aof的备份到一个目录中去,仅仅保留最近48小时的备份。
- 每天都保留一份当日的数据备份到一个目录中去,可以保留最近1个月的备份。
- 每天晚上将当前机器上的备份复制一份到其他机器上,以防机器损坏。
关闭持久化
如果只是当作缓存,可以将配置文件中的持久化规则改为空字符串save ""
和appendonly no
,删除原本的.rdb
或.aof
文件,并重启redis
save ""
# save 3600 1
# save 300 100
# save 60 10000
appendonly no
安装
windows
- 下载Redis-x64-3.2.100.zip
- 通过cmd指定到该redis目录。使用命令:
redis-server.exe
启动服务
在另一命令行中使用redis-cli.exe
查看是否连接成功 -
redis-server.exe --service-install redis.windows.conf
把redis设置为一个windows服务 - 使用
redis-server --service-start
开启服务,或直接在任务管理器(服务)中找到redis
手动开启
redis默认占用6379端口,也可以手动指定端口开启多个redis服务
redis-server --service-install --service-name redisService1 --port 10001
redis-server --service-start --service-name redisService1
外部指令(系统命令行中使用)
windows常用指令
在redis目录下:
- 卸载服务:redis-server --service-uninstall
- 开启服务:redis-server --service-start
- 停止服务:redis-server --service-stop
- 重命名服务:redis-server --service-name name
linux常用命令
- 开启服务:redis-server
- 停止服务:进入redis-cli后执行shutdown
redis-cli
启动redis(即进入redis-cli命令行)
- windows本地redis:直接运行
redis-cli.exe
- 本地redis(默认端口号6379+无密码):
redis-cli
- 本地redis(指定端口号和密码):
redis-cli -p 【端口号】 -a 【密码】
需在redis.conf中启用密码 - 远程redis:
redis-cli -h 【服务器ip】 -p 【端口号】 -a 【密码】
需在redis.conf中启用远程访问和密码
常用指令
进入redis-cli后可输入指令
- config get dir 查看redis目录路径,持久化文件在该路径下
- ping 查看是否正常连接,正常则返回pong
- info 当前redis版本及配置信息
- 选择数据库
select 【编号(默认为1~16)】
-
keys *
查看所有key -
get 【key】
查看指定key -
set 【key】 【value】
设置指定key -
del 【key】
删除指定key(不存在则忽略) -
flushdb
清空当前数据库
-
常见问题
redis和数据库双写一致性问题
综合各种方式的弊端和解决方案,有以下两种方案
- 先删缓存,再更新数据库,需配合延时双删(延时后再次删除缓存)
- 先更新数据库,再删缓存(不一致概率极低)
缓存穿透和缓存雪崩
中小企业的并发量通常不用考虑该问题
- 缓存穿透
大量请求缓存中不存在的数据,导致所有的请求都转到数据库上,从而数据库连接异常。 - 缓存雪崩
缓存同一时间大面积的失效,导致新的请求都转到数据库上,从而数据库连接异常。
redis的并发竞争key
例如A、B两者同时要给该key的value+1,顺序为
- A读取value,本地操作+1
- B读取value,本地操作+1
- A存入value+1
- B存入value+1,最终value没能+2
可以通过乐观锁(不适用于分片集群)、分布式锁、添加时间戳、或使用队列解决
图形化界面
RedisDesktopManager,git上直接下载exe文件即可
远程连接可通过SSH通道配置