当前位置: 首页 > news >正文

NoSQL之Redis配置与优化

[缓存加速]

‌缓存加速技术通过减少对原始数据源的访问次数来提高性能,主要应用于减少‌网络延迟、提高数据访问速度、减轻服务器负载等方面。不同类型的缓存技术包括‌内存缓存、‌磁盘缓存、‌网络缓存等,各自适用于不同的应用场景和需求。以下是对缓存加速技术的详细探讨:

缓存加速的基本概念和原理

  • 时间局部性原理:被引用过一次的数据在未来会被多次引用。
  • ‌空间换时间:通过开辟一块高速数据读取区域来加速数据获取性能。
  • 性能和成本的考虑:在提高性能的同时,也要考虑成本和资源的使用效率。

不同类型的缓存技术及其应用场景

  1. 内存缓存:用于存储频繁访问的数据,减少对磁盘或网络的访问。
  2. 磁盘缓存:通过将最近访问的数据存储在‌RAM中,提高磁盘的读写性能。
  3. 网络缓存:如代理服务器和‌CDN,存储热门内容的副本,减少网络流量和提高访问速度。
  4. ‌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的安装

  1. 安装
    [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 //客户端命令行工具
  2. 查看进程
    [root@localhost utils]# netstat -anpt | grep redis
    
  3. 服务控制
    [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 
    
  4. 配置参数的修改
    [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 命令行工具。
  1. redis-cli 命令行工具

    (1)连接本机redis

    [root@localhost ~]# redis-cli127.0.0.1:6379> 
    

    (2)测试redis服务是否启动

    127.0.0.1:6379> pingPONG
    

    (3)远程连接

    [root@localhost ~]#redis-cli -h 192.168.10.101 -p 6379
    
  2. 获取帮助
    • help @:获取中的命令列表;
    • help :获取某个命令的帮助;
    • help :获取可能帮助的主题列表。

    备注:

    • help :获取可能帮助的主题列表。输入help后,按下tab键

    (1)查看所有与 List 数据类型的相关命令

    127.0.0.1:6379>help @list 
    

    (2)查看 set 命令的命令帮助

    127.0.0.1:6379>help set
    
  3. 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
    
  1. Key相关命令

    在 Redis 数据库中,与 key 相关的命令主要包含以下几种。

    (1)添加键值对

    使用 keys 命令可以取符合规则的键值列表,通常情况可以结合*、?等选项来使用。

    127.0.0.1:6379>**set k1 1** OK127.0.0.1:6379>**set k2 2** OK127.0.0.1:6379>**set k3 3** OK127.0.0.1:6379>**set v1 4** OK127.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"
    
  2. exists

    exists 命令可以判断键值是否存在

    127.0.0.1:6379>**exists teacher** (integer) 1 
    

    结果为1,表示 teacher 键是存在

    127.0.0.1:6379>**exists tea** (integer) 0 
    

    结果为0,表示 tea 键不存在

  3. 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) 
    
  4. 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,去重但可以排序,写进去的时候给一个分数,自动根据分数排序。
  5. 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" 
  6. 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
  7. dbsize

    dbsize 命令的作用是查看当前数据库中 key 的数目。

    127.0.0.1:6379> dbsize 
    (integer) 5
    

多数据库常用命令

  1. 多数据库切换

    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**
    
  2. 多数据库间移动数据

    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)
    
  3. 清楚数据库内数据

    清空当前数据库数据,使用 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
        

        执行完毕,无需重启,退出客户端,重新登录即可

  • 连接方法

    1. 连接时输入密码

      redis-cli -a 123456
      
    2. 先连接再输入密码

      redis-cli 127.0.0.1:6379>auth 123456
      
  • 关闭方法

    redis-cli -a 123456 shutdown
    
  • 区别

    • 修改配置文件设置的密码永久生效;使用命令设置的密码临时生效,重启后失效
    • 修改配置文件设置的密码,需要重启生效;使用命令设置的密码,退出后再登录生效,重启后失效
    • 命令的优先级高于配置文件的优先级

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 36集网剧《天降神医朱丹溪》电影《百草园里杏花香》在义乌启动
  • Java 并发编程:ReentrantLock 锁与 AQS
  • 【机器人学】6-5.六自由度机器人运动学参数辨识-逆运动学迭代解【附MATLAB代码】
  • 响应式Web设计的发展与特点
  • 【rz sz】Centos/Linux 如何快捷的上传下载文件到系统当中?
  • 白骑士的Matlab教学基础篇 1.4 函数与脚本
  • LeetCode Hot100 LRU缓存
  • Npm使用教程(详细讲解)
  • 算法打卡 Day19(二叉树)-平衡二叉树 + 二叉树的所有路径 + 左叶子之和 + 完全二叉树的节点个数
  • 【学习笔记】:Maven初级
  • 2024rk(案例三)
  • 【debian系统arm架构安装docker】且换源后依旧不行就离线导入镜像
  • c++修仙小游戏预告
  • 自动驾驶的一些大白话讲解
  • 分享一个学习数据结构的网站(美国就金山大学)
  • 【140天】尚学堂高淇Java300集视频精华笔记(86-87)
  • 【399天】跃迁之路——程序员高效学习方法论探索系列(实验阶段156-2018.03.11)...
  • docker python 配置
  • Essential Studio for ASP.NET Web Forms 2017 v2,新增自定义树形网格工具栏
  • opencv python Meanshift 和 Camshift
  • Redash本地开发环境搭建
  • Vue2.0 实现互斥
  • windows下mongoDB的环境配置
  • 不用申请服务号就可以开发微信支付/支付宝/QQ钱包支付!附:直接可用的代码+demo...
  • 彻底搞懂浏览器Event-loop
  • 从地狱到天堂,Node 回调向 async/await 转变
  • 大快搜索数据爬虫技术实例安装教学篇
  • 基于Android乐音识别(2)
  • 基于Vue2全家桶的移动端AppDEMO实现
  • 前端面试题总结
  • 嵌入式文件系统
  • 算法系列——算法入门之递归分而治之思想的实现
  • 微信小程序--------语音识别(前端自己也能玩)
  • 移动端解决方案学习记录
  • 《TCP IP 详解卷1:协议》阅读笔记 - 第六章
  • 阿里云ACE认证学习知识点梳理
  • 基于django的视频点播网站开发-step3-注册登录功能 ...
  • ​ ​Redis(五)主从复制:主从模式介绍、配置、拓扑(一主一从结构、一主多从结构、树形主从结构)、原理(复制过程、​​​​​​​数据同步psync)、总结
  • ​​​【收录 Hello 算法】9.4 小结
  • ​​快速排序(四)——挖坑法,前后指针法与非递归
  • ‌移动管家手机智能控制汽车系统
  • # 利刃出鞘_Tomcat 核心原理解析(八)-- Tomcat 集群
  • ######## golang各章节终篇索引 ########
  • (2)(2.4) TerraRanger Tower/Tower EVO(360度)
  • (3)STL算法之搜索
  • (五)MySQL的备份及恢复
  • .NET Core MongoDB数据仓储和工作单元模式封装
  • .NET Core 中插件式开发实现
  • .NET 动态调用WebService + WSE + UsernameToken
  • .NET 通过系统影子账户实现权限维持
  • .net/c# memcached 获取所有缓存键(keys)
  • .NET开发不可不知、不可不用的辅助类(一)
  • .NET企业级应用架构设计系列之应用服务器
  • @PreAuthorize与@Secured注解的区别是什么?
  • @Transactional 竟也能解决分布式事务?