• 自学数据库-redis



    Redis 是一个高性能的非关系 键值对数据库,它因为运行在内存中,所以性能极高,也可以持久化到硬盘。缺点也很明显,即数据量不能大于硬件内存。

    Redis 是单线程+异步I/O(多路I/O复用)的,能够提供高速缓存、实时排行榜、消息队列、投票点赞等服务。

    现如今绝大多数的网站都使用 Redis 进行高速缓存。
    Redis中文网
    Redis官网
    Redis参考文档

    准备使用 Redis

    Redis 的安装

    Redis 官方推荐使用的是 linux 系统,所以只有源码,之后有些组织编译成了 windows 能直接使用的程序。所以系统如果是 linux 可以直接官网下载,如果是 windows 需要到 github 下一些组织编译后的程序。这里推荐 tporadowski 编译的redis

    linux 编译后和 windows 版是一样的。有一些关键文件:

    • redis-server.exe : 数据库服务程序
    • redis-cli.exe : 数据库使用客户端
    • redis-check-rdb : 检查并恢复 rdb 格式的数据库文件的异常
    • redis-check-aof : 检查并恢复 aof 格式的数据库文件的异常
    • redis-benchmark.exe : 可以进行基准测试
    • redis.windows.conf : windows 可用的配置文件
    • redis.windows-service.conf : windows 安装版可用的配置文件 (安装版直接运行服务是无配置模式)

    Redis 服务的运行

    使用 redis-server.exe 就可以运行数据库服务,如不指定配置或配置文件,则是无配置模式,所有配置信息都是默认的。所以一般会指定使用的配置文件。

    redis-server.exe redis.windows.conf
    
    • 1

    测试是否运行成功

    可以使用默认客户端进行测试,直接执行 redis-cli.exe 就可以以默认配置登录 redis ,此时输入个 ping ,服务会返回 pong ,这说明数据库运行正常,且连接成功

    Redis 的简单配置

    可以通过编辑 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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    使用简单配置进行登录

    做了简单配置后,可以使用这些配置进行登录

    redis-cli.exe -h 127.0.0.1 -p 6379
    
    • 1

    -h 指定了登录 IP ,-p 指定了登录端口

    登录上后 ping 会报错,因为没有验证。此时需要进行验证

    auth password
    
    • 1

    验证后会提示 OK,然后 ping 就能返回 pong 了,可以正常使用了。

    关闭数据库服务

    在客户端中数据 shutdown 可以关闭数据库服务,同时可以添加参数 save 报错数据库中的数据到硬盘

    作为 windows service 使用

    可以使用一些方法将 redis 服务作为 windows service 使用

    # 安装服务,并加载配置文件
    redis-server --service-install redis.windows.conf
    # 启动服务
    redis-server --serviec-start
    # 关闭服务
    redis-server --stop
    # 卸载服务
    redis-server --uninstall
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    需注意的是,windows 系统服务加载的配置文件默认是 redis.windows-service.conf,而不是 redis.windows.conf。如果修改过配置,则需要重启服务。

    可视化工具

    redis 可用的可视化工具有

    • Redis Desktop Manager 0.9.3
      需要安装使用,且 0.9.4 以上版本需要收费,支持中文
    • RedisStudio
      打开即可使用,英文版
    • treeNMS
      JAVA开发的,基于WEB方式对Redis管理,windows环境下载解压即可使用,有部署说明,支持中文。

    数据库操作

    切换数据库

    Redis 的数据库是以编号形式存在的,默认拥有16个数据库,初始默认使用0号数据库。可以使用 select 命令切换数据库

    select 8
    
    • 1

    保存数据(持久化)

    因为 Redis 数据是在内存中的,所有操作硬盘中的数据库文件的操作称之为持久化。redis 配置中有保存策略,即多少秒内有多少次数据改变则进行持久化。但是如果没触发保存策略时,redis 服务程序意外终止了(例如断电)则会造成数据丢失。可以使用命令手动进行持久化

    # 进行持久化保存,如果数据量大则会进行阻塞
    save
    # 后台持久化保存,会开启一个新线程进行持久化行为
    bgsave
    
    • 1
    • 2
    • 3
    • 4

    清空数据库

    使用 flushdbflushall 可以清空数据库。区别在于 flushall 操作会清除所有数据库里的数据,且会执行持久化操作,即从硬盘的数据库文件中删除数据;而 flushdb 只是清空当前数据库的数据,且是内存中的数据,不执行持久化操作,如果重启服务后又会加载数据库文件里的数据。

    数据操作

    因为 Redis 是基于 key-value 的数据库,所以存取也是使用键值对的形式。

    redis 的数据类型

    redis 常用的数据类型有字符串(string)哈希表(hash)列表(list)集合(set)有序集合(zset)

    可以使用 type 命令查看键的数据类型

    type key
    
    • 1

    需要注意的是,每种数据类型其实都是字符串的特殊存储形式,即存储元素都是字符串(或字符串型数值),所以并不能进行类型嵌套。例如哈希表中的某个值为列表,或列表的某个元素是集合。

    通用操作

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    字符串 string

    字符串是最简单最常用的数据类型,就是简单的字符串型键值对。

    设置键值对(添加、修改数据)

    可以使用 set 命令设置键值对,如果没有相应的键则进行添加,如果有相应的键则修改值。

    set key value
    
    • 1

    在设置键值对时,使用 ex 参数设置这个键值对的生存时间,超时则自动销毁,单位是秒。

    set key value ex 30
    
    • 1

    参数 px 作用同 ex ,只是单位是毫秒

    set key value px 300
    
    • 1

    只能新建 key ,不能修改现有 key 的值

    set key value nx
    
    • 1

    只能修改现有的 key 的值,不能新建 key

    set key value xx
    
    • 1

    在 key 原有的 value 后追加字符串数据,返回追加后 value 的长度

    append key value
    
    • 1

    同时 set 多个键值对。这两个操作是原子性操作,即要么全成功,要么全失败,不会出现一部分成功一部分失败的情况。成功返回1,失败返回0

    # 对于已经存在的 key 会覆盖 value
    mset key value [key value ...]
    # 只创建新的 key
    msetnx key value [key value ...]
    
    • 1
    • 2
    • 3
    • 4

    查询数据

    # 获取已经存在的键的值
    get key
    
    # 将 key 的值设为 value ,并返回修改前的 value
    getset key value
    
    # 获取 key 的 value 的长度,当 key 不存在返回0
    strlen key
    
    # 获取多个 key 的 value
    mget key [key ...]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    哈希表 hash

    如果要存储对象,使用字符串就不方便了,此时可以使用哈希表。

    添加、修改数据

    使用 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
    
    • 1
    • 2
    • 3
    • 4
    • 5

    删除数据

    # 删除 key 中的一个或多个 field,不存在的 field 将被忽略
    hdel key field [field ...]
    
    • 1
    • 2

    查询数据

    # 获取目标 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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    列表 list

    列表是一个有序可重复的元素集合,其概念类似于 python 的列表。

    添加数据

    使用 lpushrpush 来往列表中添加数据

    # 将一个或多个 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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    删除数据

    # 弹出(移除并返回) 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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    修改数据

    # 将列表 source 的尾元素弹出并插入到列表 destination 的头部,原子命令
    rpoplpush source destination
    
    # 将列表 key 下标为 index 的元素设置为 value
    # 当 index 超出范围或空列表(key不存在)时返回错误
    lset key index value
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    查询数据

    # 返回列表 key 中指定区间的元素,区间以偏移量 start 和 stop 指定,超出区间可能取不到值,但是不会出错
    # start 和 stop 是索引(下标),从 0 开始,可以使用负数下标,即最后一个元素为 -1
    # 取值使用左右闭合的原则,和 python 等左闭右开原则是不同的
    lrange key start stop
    
    # 返回列表 key 中下标为 index 的元素
    lindex key index
    
    # 返回列表 key 的长度
    llen key
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    集合 set

    集合是一个无序不重复的元素的集,其概念类似于 python 的集合。

    添加数据

    # 将若干个元素 member 添加到结合 key 中,已经存在的元素被忽略,返回被添加的元素数量(不含被忽略的元素)
    sadd key member [member ...]
    
    • 1
    • 2

    删除数据

    # 弹出 key 中的一个随机元素
    spop key
    
    # 移除 key 的成员 member ,如不存在则会忽略
    srem key member [member ...]
    
    • 1
    • 2
    • 3
    • 4
    • 5

    修改数据

    # 将成员 member 从集合 source 转移到 destination,如果 destination 中已经有了 member ,则只是从 source 中删除
    smove source destination member
    
    • 1
    • 2

    查询数据

    # 判断 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 ...]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    有序集合

    有序集合可以根据集合里的内容进行排序,即有序的集合。因为集合是有序的,所以所有成员均有一个**值(score)**以便进行排序

    添加数据

    # 添加若干成员 member 及其值 score 到有序集合 key 中
    # 如果已经有 member 则更新其 score 并更新其位置,score 可以是整数或双精浮点数
    zadd key score member [[score member] [score member] ...]
    
    • 1
    • 2
    • 3

    删除数据

    # 删除 key 的若干成员 member,不存在的被忽略
    zrem key member [member ...]
    
    # 移除 key 中指定排名区间内的所有成员
    zremrangebyrank key start stop
    # 移除 key 中 score 处于区间内的所有成员
    zremrangebyscore key min max
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    修改数据

    # 为有序集 key 的成员 member 的 score 加上增量 increment
    zincrby key increment member
    
    • 1
    • 2

    查询数据

    # 返回有序集合 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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    Redis 主从复制读写分离

    redis 支持主从功能,将数据库复制并分离成若干个数据库(一主多从,自动同步),主机负责写,从机负责读,能够大大的提升效率。也可以利用哨兵进行主从切换,做到主机宕机后从机替补。

    作为 master 的主机没有改动,修改 slave 从机的配置文件:

    # 设置向主机通信,需要启用
    replicaof master_ip master_port
    # 设置主机验证,需要启动
    masterauth master_password
    
    • 1
    • 2
    • 3
    • 4

    然后运行数据库服务即可。成功后可以使用命令查看具体信息

    info replication
    
    • 1

    主机可以使用这个命令看到从机数量和信息,从机可以看到主机状态等信息。

  • 相关阅读:
    使用Express+Node.js搭建网站
    一、认识微服务
    学生个人网页设计作品:基于HTML+CSS+JavaScript实现摄影艺术网站 DIV布局简单的摄影主题网站
    Java面试题之初入Java世界
    前端HTML相关知识
    LeetCode高频题:最长公共子序列,玩游戏A和游戏B,两兄弟加起来最多可以获得多少奖品
    Qt专栏3—Qt项目创建Hello World
    DevExpress WinForms甘特图组件 - 轻松集成项目管理功能到应用
    CodeTON Round 3 (Div. 1 + Div. 2, Rated, Prizes!)
    机器学习——强化学习状态值函数V和动作值函数Q的个人思考
  • 原文地址:https://blog.csdn.net/runsong911/article/details/126285631