[缓存加速]
缓存加速技术通过减少对原始数据源的访问次数来提高性能,主要应用于减少网络延迟、提高数据访问速度、减轻服务器负载等方面。不同类型的缓存技术包括内存缓存、磁盘缓存、网络缓存等,各自适用于不同的应用场景和需求。以下是对缓存加速技术的详细探讨:
缓存加速的基本概念和原理
- 时间局部性原理:被引用过一次的数据在未来会被多次引用。
- 空间换时间:通过开辟一块高速数据读取区域来加速数据获取性能。
- 性能和成本的考虑:在提高性能的同时,也要考虑成本和资源的使用效率。
不同类型的缓存技术及其应用场景
- 内存缓存:用于存储频繁访问的数据,减少对磁盘或网络的访问。
- 磁盘缓存:通过将最近访问的数据存储在RAM中,提高磁盘的读写性能。
- 网络缓存:如代理服务器和CDN,存储热门内容的副本,减少网络流量和提高访问速度。
- Web浏览器缓存:存储网页和资源的副本,加快网页加载速度。
特定应用场景的缓存策略
- 数据库访问:使用[Cache-Aside Pattern](https://www.baidu.com/s?wd=Cache-Aside Pattern&usm=2&ie=utf-8&rsv_pq=e72bf99b0052a8ea&oq=缓存加速&rsv_t=b3dfcbIsisJzyKbcC6zhS8AFQqnfi1ekyJsbD11AKntGJjOxC0P8SOkOvW8&sa=re_dqa_generate),首先从缓存中获取数据,若缓存中命中则直接返回,否则从数据库获取并更新到缓存中。
- Web应用性能提升:通过缩短数据与用户的网络距离、提高内容服务器的速度等方式来提升性能。
缓存管理和维护的重要性
- 监控缓存性能:定期检查缓存的命中率、失效率等指标,评估缓存效果。
- 调整缓存策略:根据应用的变化和数据访问模式调整缓存配置,如调整缓存大小、设置合适的过期时间等。
- 处理缓存失效:建立适当的失效处理机制,如当缓存中的数据过期或被删除时,确保能够从原始数据源重新获取数据并更新到缓存中。
非关系型数据库产生的背景
- High performance——对数据库高并发读写需求
- Huge storage——对海量数据高效存储与访问需求
- High Scalability && High Availability——对数据库高可扩展性与高可用性需求
Redis简介
- Redis基于内存运行并支持持久化
- 采用key-value(键值对)的存储形式
- 优点
- 具有极高数据读写速度
- 丰富数据类型
- 数据的持久化
- 原子性
- 数据备份
Redis的安装
-
安装
[root@localhost ~]# systemctl stop firewalld [root@localhost ~]# setenforce 0 [root@localhost ~]# yum -y install gcc* zlib-devel [root@localhost ~]# tar xvzf redis-4.0.9.tar.gz [root@localhost ~]# cd redis-4.0.9/ [root@localhost redis-4.0.9]# make [root@localhost redis-4.0.9]# make PREFIX=/usr/local/redis install [root@localhost ~]# ln -s /usr/local/redis/bin/* /usr/local/bin/ [root@localhost redis-4.0.9]# cd /root/redis-4.0.9/utils/ [root@localhost utils]# ./install_server.sh
备注:
- Config file : /etc/redis/6379.conf //配置文件路径
- Log file : /var/log/redis_6379.log //日志文件路径
- Data dir : /var/lib/redis/6379 //数据文件路径
- Executable : /usr/local/redis/bin/redis-server //可执行文件路径
- Cli Executable : /usr/local/redis/bin/redis-cli //客户端命令行工具
-
查看进程
[root@localhost utils]# netstat -anpt | grep redis
-
服务控制
[root@localhost ~]#/etc/init.d/redis_6379 stop [root@localhost ~]#/etc/init.d/redis_6379 start [root@localhost ~]#/etc/init.d/redis_6379 restart [root@localhost ~]#/etc/init.d/redis_6379 status
-
配置参数的修改
[root@localhost ~]#vim /etc/redis/6379.conf bind 127.0.0.1 192.168.10.101 //监听的主机地址 port 6379 //端口 daemonize yes //启用守护进程 pidfile /var/run/redis_6379.pid //指定 PID 文件 loglevel notice //日志级别 logfile /var/log/redis_6379.log //指定日志文件 [root@localhost~]#/etc/init.d/redis_6379 restart [root@localhost utils]# netstat -anpt | grep redis
Redis命令工具
- redis-server:用于启动 Redis 的工具;
- redis-benchmark:用于检测 Redis 在本机的运行效率;
- redis-check-aof:修复 AOF 持久化文件;
- redis-check-rdb:修复 RDB 持久化文件;
- redis-cli:Redis 命令行工具。
-
redis-cli 命令行工具
(1)连接本机redis
[root@localhost ~]# redis-cli 127.0.0.1:6379>
(2)测试redis服务是否启动
127.0.0.1:6379> ping PONG
(3)远程连接
[root@localhost ~]#redis-cli -h 192.168.10.101 -p 6379
-
获取帮助
- help @:获取中的命令列表;
- help :获取某个命令的帮助;
- help :获取可能帮助的主题列表。
备注:
- help :获取可能帮助的主题列表。输入help后,按下tab键
(1)查看所有与 List 数据类型的相关命令
127.0.0.1:6379>help @list
(2)查看 set 命令的命令帮助
127.0.0.1:6379>help set
-
redis-benchmark 测试工具
redis-benchmark 是官方自带的 Redis 性能测试工具,可以有效的测试 Redis 服务的性能
- -h:指定服务器主机名;
- -p:指定服务器端口;
- -s:指定服务器 socket;
- -c:指定并发连接数;
- -n:指定请求数;
- -d:以字节的形式指定 SET/GET 值的数据大小;
- -k:1=keep alive 0=reconnect;
- -r:SET/GET/INCR 使用随机 key, SADD 使用随机值;
- -P:通过管道传输请求;
- -q:强制退出 redis。仅显示 query/sec 值;
- –csv:以 CSV 格式输出;
- -l:生成循环,永久执行测试;
- -t:仅运行以逗号分隔的测试命令列表;
- -I:Idle 模式。仅打开 N 个 idle 连接并等待。
(1)测试请求性能
[root@localhost ~]#redis-benchmark -h 192.168.10.101 -p 6379 -c 100 -n 100000
备注:
-
-h:指定服务器主机名;
-
-p:指定服务器端口;
-
-c:指定并发连接数;
-
-n:指定请求数;
向 IP 地址为 192.168.10.101、端口为6379 的 Redis 服务器发送 100 个并发连接与100000 个请求测试性能
(2)测试存取性能
[root@localhost ~]#redis-benchmark -h 192.168.10.101 -p 6379 -q -d 100
备注:
- -h:指定服务器主机名;
- -p:指定服务器端口;
- -d:以字节的形式指定 SET/GET 值的数据大小;
- -q:强制退出 redis。仅显示 query/sec 值;
- PING_INLINE:每秒完成多少次PING操作
- GET:每秒完成多少次GET key vlaue
- SET:每秒完成多少次SET key vlaue
- INCR:每秒完成多少次原子计数
- MSET:每秒多个key vlaue请求次数
(3)set 与 lpush 操作性能
[root@localhost ~]# redis-benchmark -t set,lpush -n 100000 -q
备注:
-
-n:指定请求数;
-
-q:强制退出 redis。仅显示 query/sec 值;
-
-t:仅运行以逗号分隔的测试命令列表;
SET: 121951.22 requests per second LPUSH: 127226.46 requests per second
备注:
测试本机上 Redis 服务在进行 set 与 lpush 操作时的性能。
Lpush 命令将一个或多个值插入到列表头部
Redis数据库常用命令
-
set:存放数据,基本的命令格式为 set key value。
-
get:获取数据,基本的命令格式为 get key。
set teacher zhanglong get teacher
-
Key相关命令
在 Redis 数据库中,与 key 相关的命令主要包含以下几种。
(1)添加键值对
使用 keys 命令可以取符合规则的键值列表,通常情况可以结合*、?等选项来使用。
127.0.0.1:6379>**set k1 1** OK 127.0.0.1:6379>**set k2 2** OK 127.0.0.1:6379>**set k3 3** OK 127.0.0.1:6379>**set v1 4** OK 127.0.0.1:6379>**set v5 5** OK
(2)查看当前数据库中所有键
127.0.0.1:6379>**KEYS \*** 1) "teacher" 2) "k1" 3) "k2" 4) "k3" 5) "v1" 6) "v5" 127.0.0.1:6379>**set v22 5** OK
(3)查看当前数据库中以 v 开头的数据
127.0.0.1:6379>**KEYS v\*** 1) "v1" 2) "v5" 3) "v22"
(4)查看当前数据库中以 v 开头后面包含任意一位的数据
127.0.0.1:6379>**KEYS v?** 1) "v1" 2) "v5"
(5)查看当前数据库中以 v 开头 v 开头后面包含任意两位的数据
127.0.0.1:6379>**KEYS v??** 1) "v22"
-
exists
exists 命令可以判断键值是否存在
127.0.0.1:6379>**exists teacher** (integer) 1
结果为1,表示 teacher 键是存在
127.0.0.1:6379>**exists tea** (integer) 0
结果为0,表示 tea 键不存在
-
del
del 命令可以删除当前数据库的指定 key
127.0.0.1:6379>**keys \*** 1) "teacher" 2) "v1" 3) "v22" 4) "k3" 5) "k1" 6) "k2" 7) "v5" 127.0.0.1:6379> **del v5** (integer) 1 127.0.0.1:6379>**get v5** (nil)
-
type
使用 type 命令可以获取 key 对应的 value 值类型
127.0.0.1:6379>**type k1** string
备注:
redis支持的数据类型
- String:最简单的类型,就是普通的set和get,作key value缓存。
- Hash:类似map的一种结构,一般就是可以将结构化的数据,比如一个对象给缓存在redis里
- List:List是有序列表,可以通过list存储一些列表型的数据结构,类似粉丝列表、文章的评论列表之类的东西
- Set:Set是无序集合,自动去重。
- Sorted Set:Sorted Set是排序的set,去重但可以排序,写进去的时候给一个分数,自动根据分数排序。
-
rename
rename 命令是对已有 key 进行重命名
在实际使用过程中,建议先用 exists 命令查看目标 key 是否存在,然后再决定是否执行 rename 命令,以避免覆盖重要数据
127.0.0.1:6379>keys v* 1) "v1" 2) "v22" 127.0.0.1:6379>rename v22 v2 OK 127.0.0.1:6379>keys v* 1) "v1" 2) "v2" 127.0.0.1:6379>get v1 "4" 127.0.0.1:6379>get v2 "5" 127.0.0.1:6379>rename v1 v2 OK 127.0.0.1:6379>get v1 (nil) 127.0.0.1:6379>get v2 "4"
-
renamenx
renamenx 命令的作用是对已有 key 进行重命名,并检测新名是否存在。
使用renamenx 命令进行重命名时,如果目标 key 存在则不进行重命名。
127.0.0.1:6379>keys * 1) "teacher" 2) "k3" 3) "k1" 4) "k2" 5) "v2" 127.0.0.1:6379>get teacher "zhanglong" 127.0.0.1:6379>get v2 "4" 127.0.0.1:6379>renamenx v2 teacher (integer) 0 127.0.0.1:6379>keys * 1) "teacher" 2) "k3" 3) "k1" 4) "k2" 5) "v2" 127.0.0.1:6379>get teacher "zhanglong" 127.0.0.1:6379>get v2 "4
-
dbsize
dbsize 命令的作用是查看当前数据库中 key 的数目。
127.0.0.1:6379> dbsize (integer) 5
多数据库常用命令
-
多数据库切换
Redis 在没有任何改动的情况下默认包含 16 个数据库,数据库名称是用数字 0-15 来依次命名的
(1)切换至序号为 10 的数据库
127.0.0.1:6379>**select 10** OK
(2)切换至序号为 15 的数据库
127.0.0.1:6379[10]>**select 15** OK
(3)切换至序号为 0 的数据库
127.0.0.1:6379[15]>**select 0**
-
多数据库间移动数据
Redis 的多数据库在一定程度上是相对独立的,例如在数据库 0 上面存放 k1 的数据,在其它 1-15 的数据库上是无法查看到的。
127.0.0.1:6379>**set k1 100** OK 127.0.0.1:6379>**get k1** "100" 127.0.0.1:6379>**select 1** OK 127.0.0.1:6379[1]>**get k1** (nil) 127.0.0.1:6379[1]>**select 0** //切换至目标数据库 0 OK 127.0.0.1:6379>**get k1** //查看目标数据是否存在 "100" 127.0.0.1:6379>**move k1 1** //将数据库 0 中 k1 移动到数据库 1 中 (integer) 1 127.0.0.1:6379>**select 1** //切换至目标数据库 1 OK 127.0.0.1:6379[1]>**get k1** //查看被移动数据 "100" 127.0.0.1:6379[1]> **select 0** OK 127.0.0.1:6379> **get k1** //在数据库 0 中无法查看到 k1 的值 (nil)
-
清楚数据库内数据
清空当前数据库数据,使用 FLUSHDB
命令实现;清空所有数据库的数据,使用 FLUSHALL 命令实现
Redis持久化
-
持久化概述
- Redis是运行在内存中,内存中的数据断电丢失
- 为了能重用Redis数据,防止系统故障,需要将Redis中数据写入到磁盘中,即持久化
-
持久化分类
- RDB方式:创建快照的方式获取某一时刻Redis中所有数据的副本
- AOF方式:将执行的命令写到文件的末尾,以日志的方式来记录数据的变化
-
两者选择标准
- 牺牲一些性能,换取更高的缓存一致性(AOF)
- 写操作频繁的时候,不启用备份来换取更高的性能,待手动运行 save 的时候,再做备份(RDB)
-
优缺点
- 适合大规模的数据恢复
- 如果业务对数据完整性和一致性要求不高,RDB是很好的选择
- 数据的完整性和一致性不高
- 备份是使用内存
-
AOF持久化
- Redis默认不开启
- 弥补RDB的不足(数据的不一致性)
- 采用日志的形式来记录每个写操作,并追加到文件中
- Redis重启会根据日志文件的内容将写指令从前到后执行一次以完成数据恢复工作
-
性能管理
-
查看内存信息
info memory
-
used_memory:1210776 #已经内存使用的大小,以字节为单位
-
used_memory_human:1.15M # 带单位展示,以M为单位
-
used_memory_rss:7802880 # 从操作系统角度看redis内存占用多少
-
used_memory_rss_human:7.44M # 带单位展示
-
maxmemory:1073741824 # 最大内存大小
-
maxmemory_human:1.00G # 带单位展示
-
-
回收策略
-
maxmemory-policy:回收策略
-
volatile-lru:它允许 Redis 从整个数据集中挑选最近最少使用的 key 进行删除
-
volatile-ttl:按照key的过期时间进行淘汰
-
volatile-random:从已设置过期时间的数据集合中随机挑选数据淘汰;
-
allkeys-lru:使用 LRU 算法从所有数据集合中淘汰数据;
-
allkeys-random:从数据集合中任意选择数据淘汰;
-
noeviction:禁止淘汰数据(默认值)
-
Redis设置密码
-
设置方法
-
方法一:通过配置文件redis.conf设置密码
- 找到requirepass关键字,后面就是跟的密码,默认情况下是注释掉的,即默认不需要密码!
-
方法二:通过命名设置密码
-
使用redis-cli连接上Redis,执行如下命令
config set requirepass 123456
执行完毕,无需重启,退出客户端,重新登录即可
-
-
-
连接方法
-
连接时输入密码
redis-cli -a 123456
-
先连接再输入密码
redis-cli 127.0.0.1:6379>auth 123456
-
-
关闭方法
redis-cli -a 123456 shutdown
-
区别
- 修改配置文件设置的密码永久生效;使用命令设置的密码临时生效,重启后失效
- 修改配置文件设置的密码,需要重启生效;使用命令设置的密码,退出后再登录生效,重启后失效
- 命令的优先级高于配置文件的优先级