Redis 是单线程+异步I/O(多路I/O复用)的,能够提供高速缓存、实时排行榜、消息队列、投票点赞等服务。
现如今绝大多数的网站都使用 Redis 进行高速缓存。
Redis中文网
Redis官网
Redis参考文档
Redis 官方推荐使用的是 linux 系统,所以只有源码,之后有些组织编译成了 windows 能直接使用的程序。所以系统如果是 linux 可以直接官网下载,如果是 windows 需要到 github 下一些组织编译后的程序。这里推荐 tporadowski 编译的redis
linux 编译后和 windows 版是一样的。有一些关键文件:
使用 redis-server.exe 就可以运行数据库服务,如不指定配置或配置文件,则是无配置模式,所有配置信息都是默认的。所以一般会指定使用的配置文件。
redis-server.exe redis.windows.conf
可以使用默认客户端进行测试,直接执行 redis-cli.exe 就可以以默认配置登录 redis ,此时输入个 ping ,服务会返回 pong ,这说明数据库运行正常,且连接成功
可以通过编辑 redis.windows.conf 文件来进行简单的配置
bind 127.0.0.1 # 监听的 IP 地址,即必须以此地址进行登录
port 6379 # 监听的端口
requirepass password # 登录密码,默认没有,启用需添加
maxmemory # 设置最大缓存容量,默认没有,即不限制,启用需添加
dbfilename dump.rdb # 设置RDB保存文件,默认是 dump.rdb
databases 16 # 设置数据库数量,默认是16个,使用 2 的次方数量
logfile "" # 设置日志文件,默认空,即不写日志
# 设置数据保存条件,可以有多个保存条件,满足任意一个条件就会触发持久化保存。
# save 900 1 表示 900 秒内至少有 1 个键发生变化就进行持久化保存。
save 900 1
rdbcompression yes # 数据库文件是否进行压缩
rdbchecksum yes # 写入文件和读取文件时是否开启 RDB 文件检查,检查是否有无损坏,如果在启动是检查发现损坏,则停止启动。
dir ./ # 设置RDB文件目录,默认为当前目录
appendonly no # 是否开启 AOF 方式持久化保存,默认不开启
appendfilename "appendonly.aof" # # AOF 默认文件名
# AOF 持久化策略配置
# appendfsync always
appendfsync everysec
# appendfsync no
# AOF 文件重写的大小比例,默认值是 100,表示 100%,也就是只有当前 AOF 文件,比最后一次的 AOF 文件大一倍时,才会启动 AOF 文件重写。
auto-aof-rewrite-percentage 100
# 允许 AOF 重写的最小文件容量
auto-aof-rewrite-min-size 64mb
# 是否开启启动时加载 AOF 文件效验,默认值是 yes,表示尽可能的加载 AOF 文件,忽略错误部分信息,并启动 Redis 服务。
# 如果值为 no,则表示,停止启动 Redis,用户必须手动修复 AOF 文件才能正常启动 Redis 服务。
aof-load-truncated yes
做了简单配置后,可以使用这些配置进行登录
redis-cli.exe -h 127.0.0.1 -p 6379
-h 指定了登录 IP ,-p 指定了登录端口
登录上后 ping 会报错,因为没有验证。此时需要进行验证
auth password
验证后会提示 OK,然后 ping 就能返回 pong 了,可以正常使用了。
在客户端中数据 shutdown 可以关闭数据库服务,同时可以添加参数 save 报错数据库中的数据到硬盘
可以使用一些方法将 redis 服务作为 windows service 使用
# 安装服务,并加载配置文件
redis-server --service-install redis.windows.conf
# 启动服务
redis-server --serviec-start
# 关闭服务
redis-server --stop
# 卸载服务
redis-server --uninstall
需注意的是,windows 系统服务加载的配置文件默认是 redis.windows-service.conf,而不是 redis.windows.conf。如果修改过配置,则需要重启服务。
redis 可用的可视化工具有
Redis 的数据库是以编号形式存在的,默认拥有16个数据库,初始默认使用0号数据库。可以使用 select 命令切换数据库
select 8
因为 Redis 数据是在内存中的,所有操作硬盘中的数据库文件的操作称之为持久化。redis 配置中有保存策略,即多少秒内有多少次数据改变则进行持久化。但是如果没触发保存策略时,redis 服务程序意外终止了(例如断电)则会造成数据丢失。可以使用命令手动进行持久化
# 进行持久化保存,如果数据量大则会进行阻塞
save
# 后台持久化保存,会开启一个新线程进行持久化行为
bgsave
使用 flushdb 或 flushall 可以清空数据库。区别在于 flushall 操作会清除所有数据库里的数据,且会执行持久化操作,即从硬盘的数据库文件中删除数据;而 flushdb 只是清空当前数据库的数据,且是内存中的数据,不执行持久化操作,如果重启服务后又会加载数据库文件里的数据。
因为 Redis 是基于 key-value 的数据库,所以存取也是使用键值对的形式。
redis 常用的数据类型有字符串(string)、哈希表(hash)、列表(list)、集合(set)、有序集合(zset)。
可以使用 type 命令查看键的数据类型
type key
需要注意的是,每种数据类型其实都是字符串的特殊存储形式,即存储元素都是字符串(或字符串型数值),所以并不能进行类型嵌套。例如哈希表中的某个值为列表,或列表的某个元素是集合。
redis 是基于 key-value 的数据库,无论其数据类型如何,有些操作命令是通用的,例如对键的操作
# keys 命令可以列出所有符合条件的存在的 key
# 查询所有
keys *
# 使用通配符 ? * 进行匹配
keys n?me
keys n*e
# 匹配特定字符集中的字符
keys n[ace]me
# 判断 key 是否存在,如果存在返回1,否则返回0
exists key
# 更改 key 的名称,如果 key 和 newkey 相同或没有 key 则返回错误
# 如果 newkey 已经存在,则覆盖 newkey 的值
rename key newkey
# 移动数据到目标数据库 db 中
# 如果源数据库和目标数据库有相同的 key 或 key 不存在,则没有效果。成功返回1,失败返回0
move key db
# 删除数据,不存在的 key 会被忽略,返回被操作的数据的数量
del key [key...]
# 获取某个键的剩余生存时间,返回结果单位为秒,如果值为 -1 则是永久生存,如果值为 -2 则是 key 不存在
ttl key
# 查看当前数据库有多少 key
dbsize
字符串是最简单最常用的数据类型,就是简单的字符串型键值对。
可以使用 set 命令设置键值对,如果没有相应的键则进行添加,如果有相应的键则修改值。
set key value
在设置键值对时,使用 ex 参数设置这个键值对的生存时间,超时则自动销毁,单位是秒。
set key value ex 30
参数 px 作用同 ex ,只是单位是毫秒
set key value px 300
只能新建 key ,不能修改现有 key 的值
set key value nx
只能修改现有的 key 的值,不能新建 key
set key value xx
在 key 原有的 value 后追加字符串数据,返回追加后 value 的长度
append key value
同时 set 多个键值对。这两个操作是原子性操作,即要么全成功,要么全失败,不会出现一部分成功一部分失败的情况。成功返回1,失败返回0
# 对于已经存在的 key 会覆盖 value
mset key value [key value ...]
# 只创建新的 key
msetnx key value [key value ...]
# 获取已经存在的键的值
get key
# 将 key 的值设为 value ,并返回修改前的 value
getset key value
# 获取 key 的 value 的长度,当 key 不存在返回0
strlen key
# 获取多个 key 的 value
mget key [key ...]
如果要存储对象,使用字符串就不方便了,此时可以使用哈希表。
使用 hset 来添加、修改数据。哈希表里有个**域(field)**的概念,可以理解为 key 包含了若干个 key-value 中的第二个 key 。如果将 key 理解为一个对象,field 就是次对象中的成员名称。
hset key field value
# 一次设置 key 中的多个 field 和 value
hmset key field value [field value ...]
# 只创建新的 field,如果存在则放弃执行
hsetnx key field value
# 删除 key 中的一个或多个 field,不存在的 field 将被忽略
hdel key field [field ...]
# 获取目标 key 目标 field 的 value
hget key field
# 获取目标 key 的多个 field 的 value
hmget key field [field ...]
# 获取 key 中所有的 field 和 value
hgetall key
# 获取 key 中的所有 field
hkeys key
# 获取 key 中所有 field 的 value
hvals key
# 判断 key 中是否有 field
hexists key field
# 返回 key 中 field 的数量
hlen key
列表是一个有序可重复的元素集合,其概念类似于 python 的列表。
使用 lpush 和 rpush 来往列表中添加数据
# 将一个或多个 value 按照从左到右的顺序依次插入到 key 的头部
# 注意得到的结果和命令输入顺序是相反的,因为是依次插入头部
# 此命令为原子命令,返回执行完成后列表的长度
lpush key value [value ...]
# 将 value 插入到存在的 key 的头部,如果 key 不存在则不执行,返回执行完成后列表 key 的长度
lpushx key value
# 将一个或多个 value 按照从左到右的顺序依次插入到 key 的尾部
# 和 lpush 不同的除了插入地方不同外,结果顺序也是不同的
# 此命令为原子命令,返回执行完成后列表的长度
rpush key value [value ...]
# 类似于 lpushx,插入到存在的 key 的尾部
rpushx key value
# 将值 value 插入到 key 的值 pivot 之前或之后
# 当 pivot 不存在于 key,或 key 不存在或为空时,不执行操作
# 返回成功操作后列表的长度,不存在 pivot 返回 -1,不存在 key 或为空返回 0
linsert key before|after pivot value
# 弹出(移除并返回) key 的头元素
lpop key
# 弹出 key 的尾元素
rpop key
# 根据参数 count 的值,移除列表 key 中与参数 value 相等的元素,返回被移除元素的数量
# count 表示移除与 value 相等的元素,数量为 count 的绝对值个(count 为 0 则不限数量)。
# 当 count 为正数时从头向尾搜索,为负数时搜索方向相反。
lrem key count value
# 对列表 key 进行修剪,只保留 start 到 stop 区间内的元素,其他会被删除
# start 和 stop 是索引(下标),从 0 开始,可以使用负数下标,即最后一个元素为 -1
# 下标超出返回不会出错
ltrim key start stop
# 将列表 source 的尾元素弹出并插入到列表 destination 的头部,原子命令
rpoplpush source destination
# 将列表 key 下标为 index 的元素设置为 value
# 当 index 超出范围或空列表(key不存在)时返回错误
lset key index value
# 返回列表 key 中指定区间的元素,区间以偏移量 start 和 stop 指定,超出区间可能取不到值,但是不会出错
# start 和 stop 是索引(下标),从 0 开始,可以使用负数下标,即最后一个元素为 -1
# 取值使用左右闭合的原则,和 python 等左闭右开原则是不同的
lrange key start stop
# 返回列表 key 中下标为 index 的元素
lindex key index
# 返回列表 key 的长度
llen key
集合是一个无序不重复的元素的集,其概念类似于 python 的集合。
# 将若干个元素 member 添加到结合 key 中,已经存在的元素被忽略,返回被添加的元素数量(不含被忽略的元素)
sadd key member [member ...]
# 弹出 key 中的一个随机元素
spop key
# 移除 key 的成员 member ,如不存在则会忽略
srem key member [member ...]
# 将成员 member 从集合 source 转移到 destination,如果 destination 中已经有了 member ,则只是从 source 中删除
smove source destination member
# 判断 member 是否是 key 的成员
sismember key member
# 根据参数 count 获取集合 key 中的若干元素
# 没有 count 参数会随机返回 key 中的一个元素
# count 为正数或0,且小于集合基数,则返回一个包含 count 个元素的数组,且元素各不相同
# count 为正数,且大于等于集合基数,则返回整个集合
# count 为负数,返回一个长度为 count 的绝对值的数组,数组中的元素是 key 的随机元素,但是可能会重复出现多次
srandmember key [count]
# 获取 key 的基数(集合中元素的数量)
scard key
# 获取 key 的所有成员
smembers key
# 获取若干集合交集的所有成员(当只有一个集合则返回此集合所有成员)
sinter key [key ...]
# 获取若干集合并集的所有成员(当只有一个集合则返回此集合所有成员)
sunion key [key ...]
# 获取若干集合差集的所有成员(当只有一个集合则返回此集合所有成员)
sdiff key [key ...]
# 类似于 sinter,但是会将结果保存在集合 destination 中,如果已存在则覆盖
sinterstore destination key [key ...]
# 类似于 sunion,但是会将结果保存在集合 destination 中,如果已存在则覆盖
sunionstore destination key [key ...]
# 类似于 sdiff,但是会将结果保存在集合 destination 中,如果已存在则覆盖
sdiffstore destination key [key ...]
有序集合可以根据集合里的内容进行排序,即有序的集合。因为集合是有序的,所以所有成员均有一个**值(score)**以便进行排序
# 添加若干成员 member 及其值 score 到有序集合 key 中
# 如果已经有 member 则更新其 score 并更新其位置,score 可以是整数或双精浮点数
zadd key score member [[score member] [score member] ...]
# 删除 key 的若干成员 member,不存在的被忽略
zrem key member [member ...]
# 移除 key 中指定排名区间内的所有成员
zremrangebyrank key start stop
# 移除 key 中 score 处于区间内的所有成员
zremrangebyscore key min max
# 为有序集 key 的成员 member 的 score 加上增量 increment
zincrby key increment member
# 返回有序集合 key 中成员 member 的 score 值
zscore key member
# 返回有序集 key 的基数
zcard key
# 返回有序集 key 中,score 在 min 和 max 之间(可以相等)的成员数量
zcount key min max
# 返回有序集 key 中 score 递增的顺序下标在区间 start 到 stop 间的成员
# 如果带有选项 withscores,则除了成员外还返回其 score
zrange key start stop [WITHSCORES]
# 类似于 zrange 命令,只是排列顺序为递减顺序
zrevrange key start stop [WITHSCORES]
# 返回有序集 key 中 score 介于 min 和 max 之间(可以相等)的成员,并按照 score 递增排序
# 选项 limit 可以指定结果的偏移量 offset 和数量 count,类似于 sql 的分页
zrangebyscore key min max [WITHSCORES] [LIMIT offset count]
# 类似于 zrangebyscore 命令,只是排列顺序为递减
zrevrangebyscore key max min [WITHSCORES] [LIMIT offset count]
# 返回 key 的成员 member 的排名,按照 score 递增排列
zrank key member
# 返回 key 的成员 member 的排名,按照 score 递减排列
zrevrank key member
redis 支持主从功能,将数据库复制并分离成若干个数据库(一主多从,自动同步),主机负责写,从机负责读,能够大大的提升效率。也可以利用哨兵进行主从切换,做到主机宕机后从机替补。
作为 master 的主机没有改动,修改 slave 从机的配置文件:
# 设置向主机通信,需要启用
replicaof master_ip master_port
# 设置主机验证,需要启动
masterauth master_password
然后运行数据库服务即可。成功后可以使用命令查看具体信息
info replication
主机可以使用这个命令看到从机数量和信息,从机可以看到主机状态等信息。