Redis

Remote DIctionary Server 是key-value非关系型数据库,通常运行在内存中。
redis采用单线程模型(I/O多路复用机制),每一条到达服务端的命令不会立刻执行,而是进入一个队列,逐个执行。因此不会有两条命令被同时执行,不需考虑并发安全性

常见的redis和数据库联动方式

使用场景

  1. 对于执行耗时久,经常需要调用,但结果不频繁变动的SQL,适合将运结果放入缓存,后续请求直接从缓存中获取,迅速响应。
  2. 处理高并发,利用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中执行savebgsave指令,可以手动触发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内容,同时避免了两者的弊端。

更多备份
  1. 写crontab定时调度脚本,每小时都copy一份rdb或aof的备份到一个目录中去,仅仅保留最近48小时的备份。
  2. 每天都保留一份当日的数据备份到一个目录中去,可以保留最近1个月的备份。
  3. 每天晚上将当前机器上的备份复制一份到其他机器上,以防机器损坏。
关闭持久化

如果只是当作缓存,可以将配置文件中的持久化规则改为空字符串save ""appendonly no,删除原本的.rdb.aof文件,并重启redis

save ""
# save 3600 1
# save 300 100
# save 60 10000

appendonly no

安装

windows
  1. 下载Redis-x64-3.2.100.zip
  2. 通过cmd指定到该redis目录。使用命令:redis-server.exe 启动服务
    在另一命令行中使用redis-cli.exe查看是否连接成功
  3. redis-server.exe --service-install redis.windows.conf把redis设置为一个windows服务
  4. 使用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,顺序为

  1. A读取value,本地操作+1
  2. B读取value,本地操作+1
  3. A存入value+1
  4. B存入value+1,最终value没能+2

可以通过乐观锁(不适用于分片集群)、分布式锁、添加时间戳、或使用队列解决


图形化界面

RedisDesktopManager,git上直接下载exe文件即可
远程连接可通过SSH通道配置

你可能感兴趣的:(Redis)