From a74ba9b09b6d36f714fa0a1ee4d129cfd9f16b33 Mon Sep 17 00:00:00 2001 From: wxin <15253413025@163.com> Date: Fri, 14 Mar 2025 11:42:40 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E6=96=87=E4=BB=B6=E8=87=B3?= =?UTF-8?q?=20/?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- redis数据库缓存技术.md | 672 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 672 insertions(+) create mode 100644 redis数据库缓存技术.md diff --git a/redis数据库缓存技术.md b/redis数据库缓存技术.md new file mode 100644 index 0000000..8571434 --- /dev/null +++ b/redis数据库缓存技术.md @@ -0,0 +1,672 @@ +

Redis 数据库缓存技术

+ +------ + +## 一:缓存服务器简介 + +### 1. 简介 + +​ 许多Web应用都将数据保存到 RDBMS(关系数据库管理系统)中,应用服务器从中读取数据并在浏览器中显示。但随着数据量的增大、访问的集中,就会出现RDBMS的负担加重、数据库响应恶化、 网站显示延迟等重大影响。Memcached/redis是高性能的分布式内存缓存服务器,通过缓存数据库查询结果,减少数据库访问次数,以提高动态Web等应用的速度、 提高可扩展性。 + +### 2. NoSQL 产品 + +产品: + +- redis +- mongodb +- memcached + +名词解释:非关系型数据库 + +以键值对的方式存储数据---(Key-Value)的形式 + +### 3. NoSQL 的优点 + +- 高可扩展性 +- 分布式计算 +- 低成本 +- 架构的灵活性,半结构化数据 +- 没有复杂的关系 + +### 4. NoSQL 的缺点 + +- 没有标准化 +- 有限的查询功能 +- 不直观的程序 + +### 5. 作用 + +​ 加快访问速度 ,缓解数据库压力 + +注意: + +​ 非关系型数据库严格上不是一种数据库,应该是一种数据结构化存储方法的集合,可以是文档或者键值对等。 + +## 二:Redis 基础 + +### 1. 简介 + +​ redis是一个开源的、使用C语言编写的、支持网络交互的、可基于内存也可持久化的Key-Value数据库。 + +### 2. 帮助 + +- 官方网站:https://redis.io +- 官方各版本下载地址:http://download.redis.io/releases/ +- Redis 中文命令参考:http://redisdoc.com +- 中文网站1:http://redis.cn +- 中文网站2:http://www.redis.net.cn + +### 3. 特点 + +- 丰富的数据结构 list,set,hash等数据结构的存储 +- 支持持久化 +- 支持事务 “一个完整的动作,要么全部执行,要么什么也没有做” +- 支持主从支持高可用,支持分布式分片集群 + +## 三:Redis 部署 + +### 1. yum 安装 + +安装yum仓库 + +```bash +[root@test ~]# wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo +[root@test ~]# wget -O /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo +``` + +安装redis: + +```bash +[root@redis ~]# yum -y install redis +``` + +启动和开机启动: + +```bash +[root@redis ~]# systemctl start redis +[root@redis ~]# systemctl enable redis +``` + +设置redis.conf,允许远程登录 + +```bash +[root@redis ~]# vim /etc/redis.conf +bind 127.0.0.1 改为 bind 0.0.0.0 (可选) +``` + +登录: + +```bash +[root@redis ~]# systemctl restart redis +[root@redis ~]# redis-cli +127.0.0.1:6379> ping +PONG +127.0.0.1:6379> set name zhangsan +OK +127.0.0.1:6379> get name +"zhangsan" +127.0.0.1:6379> +``` + +### 2. 编译安装 + +下载源码包 + +```bash +[root@redis ~]# wget https://download.redis.io/redis-stable.tar.gz +[root@redis ~]# tar xf redis-stable.tar.gz -C /usr/local/ +``` + +安装编译所需软件 + +```bash +[root@redis ~]# yum -y install gcc-c++ autoconf automake make +``` + +编译 + +```bash +[root@redis redis-stable]# cd /usr/local/redis-stable/ +[root@redis redis-stable]# make +``` + +安装 + +```bash +[root@redis redis-stable]# make install +``` + +启动 + +```bash +[root@redis src]# cd src/ +[root@redis src]# ./redis-server & +[root@redis src]# ./redis-cli +127.0.0.1:6379> set name lisi +OK +127.0.0.1:6379> get name +"lisi" +127.0.0.1:6379> +``` + +## 四:Redis 使用 + +### 1. redis 相关工具 + +```shell +./redis-benchmark #用于进行redis性能测试的工具 +./redis-check-rdb #用于修复出问题的dump.rdb文件 +./redis-cli #redis的客户端 +./redis-server #redis的服务端 +./redis-check-aof #用于修复出问题的AOF文件 +./redis-sentinel #用于集群管理 +``` + +### 2. redis 配置文件部分 + +```shell +1、是否后台运行 +daemonize no/yes +2、默认端口 +port 6379 +3、AOF 日志开关是否打开 +appendonly no/yes +4、日志文件位置 +logfile /var/log/redis.log +5、RDB 持久化数据文件 +dbfilename dump.rdb +6、指定IP进行监听 +bind 10.0.0.51 ip2 ip3 ip4 +7、禁止protected-mode +protected-mode yes/no (保护模式,是否只允许本地访问) +8、增加requirepass {password} +requirepass root9、在redis-cli中使用 +``` + +### 3. 数据持续化 + +​ 开启持久化功能后,重启redis后,数据会自动通过持久化文件恢复 + +​ redis提供了两种持久化的方式,分别是RDB(Redis DataBase)和AOF(Append Only File仅追加文件) + +方式一:RDB + +​ RDB(Redis DataBase):是在不同的时间点,将redis存储的数据生成快照并存储到磁盘等介质上 + +特点: + +- 周期性 +- 不影响数据写入 ;RDB会启动子进程,备份所有数据。当前进程,继续提供数据的读写。当备份完成,才替换老的备份文件 +- 高效;一次性还原所有数据 +- 完整性较差 #故障点到上一次备份,之间的数据无法恢复 + +方式二:AOF + +​ AOF(Append Only File)则是换了一个角度来实现持久化,那就是将redis执行过的所有写指令记录下来,在下次redis重新启动时,只要把这些写指令从前到后再重复执行一遍,就可以实现数据恢复了 + +特点: + +- 实时性 +- 完整性较好 +- 体积大;记录数据的指令,删除数据的指令都会被记录下来 + +注意: + +​ RDB和AOF两种方式可以同时使用,如果redis重启的,优先采用AOF方式进行数据恢复,这是因为AOF方式的数据恢复完整度更高。 + +​ 如果你没有数据持久化的需求,也完全可以关闭RDB和AOF方式,这样的话,redis将变成一个纯内存数据库,就像memcache一样。 + +如何选择: + +- 缓存:不用开启任何持久方式、 +- 双开:因RDB数据不实时,但同时使用两者时服务器只会找AOF文件,所以RDB留作万一的手段 +- 对于我们应该选择RDB还是AOF,官方的建议是两个同时使用。这样可以提供更可靠的持久化方案 +- 写入速度快 ------------AOF +- 写入速度慢 ------------RDB + +### 4. 持久化配置 + +RDB默认开启 + +```bash +[root@redis-master ~]# vim /etc/redis.conf +#dbfilename:持久化数据存储在本地的文件 +dbfilename dump.rdb +#dir:持久化数据存储在本地的路径 +dir /data/application/redis/data +##snapshot触发的时机,save +##如下为900秒后,至少有一个变更操作,才会snapshot +##对于此值的设置,需要谨慎,评估系统的变更操作密集程度 +##可以通过“save “””来关闭snapshot功能 +#save时间,以下分别表示更改了1个key时间隔900s进行持久化存储;更改了10个key300s进行存储;更改10000个key60s进行存储。 +save 900 1 +save 300 10 +save 60 10000 +##当snapshot时出现错误无法继续时,是否阻塞客户端“变更操作”,“错误”可能因为磁盘已满/磁盘故障/OS级别异常等 +stop-writes-on-bgsave-error yes +##是否启用rdb文件压缩,默认为“yes”,压缩往往意味着“额外的cpu消耗”,同时也意味这较小的文件尺寸以及较短的网络传输时间 +rdbcompression yes +``` + +客户端使用命令进行持久化save存储 + +```bash +[root@redis-slave ~]# redis-cli -h 192.168.159.131 -p 6379 save +OK +``` + +AOF 持久化配置 + +```shell +appendonly yes/no 是否打开aof日志功能 +appendfsync always 每1个命令,都立即同步到aof +appendfsync everysec 每秒写1次 +appendfsync no 写入工作交给操作系统,由操作系统判断缓冲区大小,统一写入到aof. +高级参数: +no-appendfsync-on-rewrite yes/no 正在导出rdb快照的过程中,要不要停止同步 aof +auto-aof-rewrite-percentage 100 aof文件大小比起上次重写时的大小,增长率100%时重写,缺点:业务开始的时候,会重复重写多次。 +auto-aof-rewrite-min-size 64mb aof文件,至少超过64M时,重写 +``` + +RDB 到 AOF 切换 + +- 为最新的 dump.rdb 文件创建一个备份。 + +- 将备份放到一个安全的地方。 + +- 执行以下两条命令: + + ```bash + [root@redis-master ~]# redis-cli config set appendonly yes + OK + [root@redis-master ~]# redis-cli config set save "" + OK + ``` + +- 确保写命令会被正确地追加到 AOF 文件的末尾 + +注意: + +​ 执行的第一条命令开启了 AOF 功能: Redis 会阻塞直到初始 AOF 文件创建完成为止, 之后 Redis 会继续处理命令请求, 并开始将写入命令追加到 AOF 文件末尾 + +​ 执行的第二条命令用于关闭 RDB 功能。 这一步是可选的, 如果你愿意的话, 也可以同时使用 RDB 和 AOF 这两种持久化功能 + +​ 别忘了在 redis.conf 中打开 AOF 功能! 否则的话, 服务器重启之后, 之前通过 CONFIG SET 设置的配置不会生效, 程序会按原来的配置来启动服务器 + +### 5. 数据恢复 + +​ 将数据拷贝到另外一台新的服务器 + +​ 先将新机器的redis停止,将数据拷贝到新机器定义的目录下,并覆盖原有的数据 + +```bash +[root@redis-master ~]# systemctl start redis +[root@redis-master ~]# redis-cli +127.0.0.1:6379> get name +"zhangsan" +``` + +## 五:Redis 数据类型 + +### 1. 基本数据类型 + +| **类型** | **说明** | +| -------------------- | ------------------------------------------------------------ | +| String 字符串 | Redis 字符串数据类型的相关命令用于管理 redis 字符串值 | +| Hash 哈希 | Redis hash 是一个string类型的field和value的映射表,hash特别适合用于存储对象。Redis 中每个 hash 可以存储 (2的32次方)2^32 - 1 键值对(40多亿)。 | +| List 列表 | Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边) 一个列表最多可以包含 2^32 - 1 个元素 (4294967295, 每个列表超过40亿个元素)。 | +| Set 集合 | Redis 的 Set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。 | +| Sorted set 有序集合 | Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。 | + +### 2. Redis 命令介绍 + +```bash +127.0.0.1:6379> help +redis-cli 3.2.12 +To get help about Redis commands type: + "help @" to get a list of commands in + "help " for help on + "help " to get a list of possible help topics + "quit" to exit + +To set redis-cli perferences: + ":set hints" enable online hints + ":set nohints" disable online hints +Set your preferences in ~/.redisclirc +``` + +根据输出可以看到 help 命令有三种用法 + +```bash +"help @" to get a list of commands in +"help " for help on +"help " to get a list of possible help topics +``` + +**help @ 查看命令组的帮助** + +help [@generic](https://my.oschina.net/generic) 查看通用组的命令包括del,dump…等等通用命令 + +help [@string](https://my.oschina.net/u/146445) 查看字符串组命令。还可以查看其他组的命令如help [@list](https://my.oschina.net/u/587374), help [@set](https://my.oschina.net/rosetta), help @sorted_set,help @hash 等等 + +​ 查看所有的分组可以通过help 提示 + +```shell +127.0.0.1:6379> help @generic + + DEL key [key ...] + summary: Delete a key + since: 1.0.0 + + DUMP key + summary: Return a serialized version of the value stored at the specified key. + since: 2.6.0 + + EXISTS key [key ...] + summary: Determine if a key exists + since: 1.0.0 + + EXPIRE key seconds + summary: Set a key's time to live in seconds + since: 1.0.0 + + EXPIREAT key timestamp + summary: Set the expiration for a key as a UNIX timestamp + since: 1.2.0 + + KEYS pattern + summary: Find all keys matching the given pattern + since: 1.0.0 + + MIGRATE host port key| destination-db timeout [COPY] [REPLACE] [KEYS key] + summary: Atomically transfer a key from a Redis instance to another one. + since: 2.6.0 + + MOVE key db + summary: Move a key to another database + since: 1.0.0 + + OBJECT subcommand [arguments [arguments ...]] + summary: Inspect the internals of Redis objects + since: 2.2.3 + + PERSIST key + summary: Remove the expiration from a key + since: 2.2.0 + + PEXPIRE key milliseconds + summary: Set a key's time to live in milliseconds + since: 2.6.0 + + PEXPIREAT key milliseconds-timestamp + summary: Set the expiration for a key as a UNIX timestamp specified in milliseconds + since: 2.6.0 + + PTTL key + summary: Get the time to live for a key in milliseconds + since: 2.6.0 + + RANDOMKEY - + summary: Return a random key from the keyspace + since: 1.0.0 + + RENAME key newkey + summary: Rename a key + since: 1.0.0 + + RENAMENX key newkey + summary: Rename a key, only if the new key does not exist + since: 1.0.0 + + RESTORE key ttl serialized-value [REPLACE] + summary: Create a key using the provided serialized value, previously obtained using DUMP. + since: 2.6.0 + + SCAN cursor [MATCH pattern] [COUNT count] + summary: Incrementally iterate the keys space + since: 2.8.0 + + SORT key [BY pattern] [LIMIT offset count] [GET pattern [GET pattern ...]] [ASC|DESC] [ALPHA] [STORE destination] + summary: Sort the elements in a list, set or sorted set + since: 1.0.0 + + TTL key + summary: Get the time to live for a key + since: 1.0.0 + + TYPE key + summary: Determine the type stored at key + since: 1.0.0 + + WAIT numslaves timeout + summary: Wait for the synchronous replication of all the write commands sent in the context of the current connection + since: 3.0.0 + + PSYNC arg arg arg + summary: Help not available + since: not known + + LATENCY arg arg ...options... + summary: Help not available + since: not known + + TOUCH key arg ...options... + summary: Help not available + since: not known + + GEORADIUSBYMEMBER_RO key arg arg arg arg ...options... + summary: Help not available + since: not known + + REPLCONF arg ...options... + summary: Help not available + since: not known + + PFDEBUG arg arg arg ...options... + summary: Help not available + since: not known + + ASKING arg + summary: Help not available + since: not known + + RESTORE-ASKING key arg arg arg ...options... + summary: Help not available + since: not known + + HOST: arg ...options... + summary: Help not available + since: not known + + GEORADIUS_RO key arg arg arg arg arg ...options... + summary: Help not available + since: not known + + POST arg ...options... + summary: Help not available + since: not known + + SUBSTR key arg arg arg + summary: Help not available + since: not known + + PFSELFTEST arg + summary: Help not available + since: not known +``` + +**help 查看具体命令的用法** + +​ help 具体命令可以查看命令的用法描述,命令从那个版本开始,命令属于哪个组等信息。如 help get + +```bash +127.0.0.1:6379> help get + + GET key + summary: Get the value of a key + since: 1.0.0 + group: string +``` + +**help help后面参数提示补全** + +​ help 之后按tab按键可提示参数。在命令行下 tab按键相信是用的最多的一个按键 + +​ help 空格之后一直按tab,可按顺序查看到所有可能的组和命令。也可输入需要查询的@组或命令的前缀再按tab补全 + +### 3. Redis 全局 Key 操作 + +| **命令** | **含义** | +| --------------- | --------------------------- | +| KEYS * | 查看KEY支持通配符 | +| DEL | 删除给定的一个或多个key | +| EXISTS | 检查是否存在 | +| RENAME | 变更KEY名 | +| SORT | 键值排序,有非数字时报错 | +| TYPE | 返回键所存储值的类型 | +| DUMP RESTORE | 序例化与反序列化 | +| EXPIRE\ PEXPIRE | 以秒\毫秒设定生存时间 | +| TTL\ PTTL | 以秒\毫秒为单位返回生存时间 | +| PERSIST | 取消生时间设置 | +| RANDOMKEY | 返回数据库中的任意键 | + +**1. del 命令** + +del 命令用来 删除指定的一个或多个 key + +删除一个 key + +```shell +127.0.0.1:6379> set test 1234 +OK +127.0.0.1:6379> del test +(integer) 1 +``` + +删除多个 key + +```bash +127.0.0.1:6379> mset test1 111 test2 222 +OK +127.0.0.1:6379> del test1 test2 +(integer) 2 +``` + +**2. exists 命令** + +exists 命令用来查询 key 是否存在 + +```shell +127.0.0.1:6379> mset test1 1111 test2 2222 +OK +127.0.0.1:6379> exists test1 +(integer) 1 +``` + +**3. expire 命令** + +expire 命令用来 设置 key 的过期秒数 + +```shell +127.0.0.1:6379> get test1 +"1111" +``` + +与 expire 命令相关的命令有三个,分别是: + +expireat 命令用来 设置一个 UNIX 时间戳的过期时间, (从1970年1月1日0时0分0秒到你设置过期的秒数) + +```shell +127.0.0.1:6379> expireat test2 1592965943 +(integer) 1 +``` + +pexpire 命令用来 设置 key 的有效时间以毫秒为单位 + +```shell +127.0.0.1:6379> set test3 333 +OK +127.0.0.1:6379> expire test3 100 +(integer) 1 +127.0.0.1:6379> ttl test3 +(integer) 84 +127.0.0.1:6379> pttl test3 +(integer) 77260 +``` + +pexpireat 命令用来 设置 key 的到期 UNIX 时间戳以毫秒为单位 + +```shell +127.0.0.1:6379> pexpireat test3 1592965943000 +(integer) 1 +127.0.0.1:6379> ttl test3 +(integer) -2 +``` + +**4. keys 命令** + +keys 命令用来 查找所有匹配给定的模式的键 + +```shell +127.0.0.1:6379> keys * +1) "test3" +2) "test2" +3) "test1" +``` + +在 Redis 中是支持模糊查询的,它有 3 个通配符,分别是:*、 ? 和 [] + +- *:通配任意多个字符 +- ?:通配单个字符 +- []:通配括号内的某 1 个字符 + +[] 的用法如下: + +```shell +127.0.0.1:6379> keys *[s]* +1) "test3" +2) "test2" +3) "test1" +127.0.0.1:6379> keys *[1]* +1) "test1" +``` + +? 的用法如下: + +```shell +127.0.0.1:6379> set a bbb +OK +127.0.0.1:6379> keys ? +1) "a" +``` + +**5. ttl 命令** + +ttl 命令用来 获取 key 的有效时间(单位:秒) + +```shell +127.0.0.1:6379> ttl test1 +(integer) -1 +127.0.0.1:6379> ttl test +(integer) -2 +``` + +上面的命令是,我们用 expire 对一个 key 设置一个过期时间,然后使用 ttl 观察它的剩余时间 + +ttl 一个 key,如果返回 -1,则说明该 key 不会过期 + +ttl 一个 key,如果返回 -2,则说明没有指定的 key + +与 ttl 相关的命令是 pttl 命令,它用来 获取 key 的有效毫秒数 + +### 4. 数据类型 + +​ string是redis最基本的类型,一个key对应一个value。一个键最大能存储 512MB + +​ Redis中的Hashes类型看成具有String Key和String Value的map容器;所以该类型非常适合于存储值对象的信息。如Username、Password和Age等。如果Hash中包含很少的字段,那么该类型的数据也将仅占用很少的磁盘空间。每一个Hash可以存储995701749 个键值对 + +​ List类型是按照插入顺序排序的字符串链表。和数据结构中的普通链表一样,我们可以在其头部(left)和尾部(right)添加新的元素 + +Set类型看作为没有排序的字符集合。Set可包含的最大元素数量是4294967295 + +​ Sorted-Sets中的每一个成员都会有一个分数(score)与之关联,Redis正是通过分数来为集合中的成员进行从小到大的排序。成员是唯一的,但是分数(score)却是可以重复的 \ No newline at end of file