网站建设平台推广,对网站提出的优化建议,企业公司网站模版,永久免费制作网页简介#xff1a; 是一个高性能的 key-value数据库。 存在内存中 与其他 key-value 缓存产品有以下三个特点#xff1a; Redis支持数据的持久化#xff0c;可以将内存中的数据保持在磁盘中#xff0c;重启的时候可以再次加载进行使用。 Redis不仅仅支持简单的key-value类…简介 是一个高性能的 key-value数据库。 存在内存中 与其他 key-value 缓存产品有以下三个特点 Redis支持数据的持久化可以将内存中的数据保持在磁盘中重启的时候可以再次加载进行使用。 Redis不仅仅支持简单的key-value类型的数据同时还提供listsetzsethash等数据结构的存储。 Redis不仅仅支持简单的key-value类型的数据同时还提供listsetzsethash等数据结构的存储。
Redis优势 高性能 丰富的数据类型 原子性 丰富的特性
redis能干嘛 与传统数据库MySQL关系 Redis是key-value数据库(NoSQL)的一种MySQL是关系型数据库 Redis数据操作主要在内存而MySQL主要存储在磁盘 Redis在某一场景使用中要明显优于MySQL比如计数器排行榜方面 Redis通常用于一些特定场景需要与MySQL一起配合使用
注意两者并不是相互替代和竞争关系而是共用和配合 日常使用Linux装redis使用Linux进行开发 Linux环境安装redis必须先具备gcc编译环境 什么是gcc是Linux下的一个编译程序是c程序的编译工具。 yum -y install gcc gcc-c autoconf pcre pcre-devel make automake
yum -y install wget httpd-tools vim 在window上下载了redis后使用xfile将其放到linux的 /opt 目录下 进入到 /opt 目录使用 tar-zxvf 你的redis压缩包 cd 到 解压后的 redis 目录 使用 make make install 安装 会默认安装到 usr/local/bin 修改 redis7.conf 文件 让 redis 在后台启动 daemonize no 改为 daemonize yes protected-mode yes 改为 protected-mode no 允许其他机器访问 注释 bind 127.0.0.1 -::1 设置redis访问密码 打开注释 requirepass 你的密码 运行redis服务器 redis-server /myredis/redis7.conf 出现如下报错 67147:C 28 Oct 2023 20:46:34.584 # WARNING Memory overcommit must be enabled! Without it, a background save or replication may fail under low memory condition. Being disabled, it can also cause failures without low memory condition, see https://githu 解决方法 进入到 /etc/sysctl.conf 文件 添加 vm.overcommit_memory1 使用命令 vm.overcommit_memory1 使配置文件生效 检查端口6379是否被占用 ps -ef|grep redis|grep -v grep 启用redis redis-cli -a 123456 测试 redis服务器关闭方法 直接在端口号处 SHUTDOWN, 然后quit 远程关闭 单实例 redis-cli -a 123456 shutdown 多实例 redis-cli -a 123456 -p 希望关闭的端口号 shutdown
redis10大数据类型 redis字符串(String 同时设置/获取多个键值 mset mget msetnx(可以理解为事务整体成功则全成功失败一个则全部失败) 获取指定区间范围内的值 getrange setrange 数值增减一定要是数字 递增数字INCR key 增加指定的整数INCRBY Key increment(比如INCRBY key1 5) 递减数值 DECR key 减少指定的整数 DECR key decrement 获取字符串长度和内容追加 STRLEN key APPEND key value 分布式锁 setnx key value setex(set with expire)键秒值/setnx(set if not exist) getset(先get再set) redis列表(List) 是一个双端链表的结构容量是2的32次方-1大概40多个亿主要功能有pop/push等一般用在栈消息队列等 lpush/rpush/lrange lpop/rpop 按照索引下标获得元素(从上到下) lindex 获取列表中元素个数 llen 删除N个值等于v1的元素 lrem key 数字N给定值v1 截取指定范围的值后再赋值给key ltrim key 开始index 结束1index rpoploush 源列表 目的列表 (将源列表的末尾值pop然后将该值添加到目的列表的头) lset key index value linsert key before/after 已有值 插入的新值 redis哈希表(Hash) KV模式不变但是v是一个新的键值对 MapString, MapString, object hset/hget/hmset/hmget/hgetall/hdel hlen 获取某个key内的全部数量 hexists key 在key里面某个值的key hkeys/hvals hincrby/hincrbyfloat hsetnx redis集合(Set) 无序无重复 底层是哈希表实现 单值多value且无重复 SADD key member[member ...] 添加元素 SMEMBERS key 遍历集合中所有元素 SISMEMBER key member 判断元素是否在集合中 SREM key member[member ...] 删除元素 scard 获取集合里面的元素 SRANDMEMBER key [数字] 从集合中随机展现设置的数字个数元素元素不删除 SPOP key[数字] 弹出栈 SMOVE key1 key2 在key1已存在的某个值 将key1里已存在某个值付给key2 集合运算 差集 A-B属于A但不属于B的元素构成的集合 SDIFF keyA [keyB] 集合的并集运算 A ∪ B属于 A或者属于B的元素构成的集合SUNION keyA keyB 集合的交集运算 A ∩ BAB共有部分 SINTER key[key ...] SINTERCARD numkeys key[key ...] [LIMIT limit] (不返回结果集而只返回结果的基数。返回由所有给定集合的交集产生的集合的基数) redis有序集合(ZSet) 在set基础上每个value值前加一个score分数值 添加元素ZADD key score member [score member ...] 按照元素分数从小到大的顺序返回索引从start到stop之间所有元素ZRANGE key start stop[WITHSCORES] 按照元素分数从大到小的顺序返回索引从start到stop之间所有元素ZRERANGE key start stop[WITHSCORES] 获取指定分数范围的元素ZRANGEBYSCORES key min max [WITHSCORES] [LIMIT offset count] withscores ( 表示不包含 limit 作用是返回限制 ZSCORE key member 获取元素的分数 ZCARD key 获取集合中元素的数量 zrem key 某score下对应的value值作用是删除元素 ZINCRBY key increment member 增加讴歌元素的分数increment为增加分数值 ZCOUNT key min max 获得指定分数范围内的元素个数 ZMPOP 从键名列表中的第一个非空集排序集中弹出一个或者多个元素他们是成员分数对 ZRANK key values值获取下标 zrerank key values值 逆序获得下标值 redis地理空间(GEO) GEOADD 多个 经度、纬度、位置名称添加到指定的key中 出现中文乱码需要quit 在登录界面追加 --raw redis-cli -a 123456 --raw GEOPOS 从键里面返回所有给定位置元素的位置(经度和纬度) GEOHASH 返回坐标的geohash表示 GEODIST 两个位置间的距离 GEORADIUS 以半径为中心查询xxx GEORADIUSBYMEMBER redis基数统计(HyperLogLog) 统计某个某个网站UVUVUnique Visitor,独立访客一般理解为客户端ip 进行去重考虑) 去重复统计功能的基数估计算法-HyperLogLog PFADD key element[element ...] 添加指定元素 PFCOUNT key[key ...] 返回给定 HyperLogLog的基数估算值 PFMERGE destkey sourcekey [sourcekey ...] 合并多个HyperLogLog redis位图(bitmap) 是由0和1状态表现的二进制位的bit数组 用String 类型作为底层数据结构实现的一种统计二值状态的数据类型位图本质是数组 setbit key offset value: 解释 setbit 键 偏移位 只能0 或1 btmap偏移量是从0开始的 getbit key strlen 统计字节数占用多少1bit 扩容 bitcount 全部索引里面1占多少 bitop redis位域(bitfield) 将redis字符串看作是 一个由二进制位组成的数组 并且能对变长位宽和任意没有字节对齐的指定整型位域进行寻址和修改。 作用 位域修改 溢出控制 基本命令 BITFIELD key [GET type offset] BITFIELD key [SET type offset value] BITFIELD key [INCRBY type offset increment] 溢出控制 OVERFLOW [WRAR|SAT|FAI redis流(Stream) 就是redis版本的mq消息中间件 四个特殊符号 - 最小和最大可能出现的id $表示只消费新的消息当前流中最大的id可用于将要来到的消息 用于 XREADGROUP命令表示迄今还没有发送给组中使用者的信息会更新消费组的最后ID *用于XADD命令中让系统自动生成id 相关指令 XADD添加消息到队列末尾 消息id必须大于上个id 默认使用星号表示自动生成规矩 * 用于XADD命令中让系统自动生成id XRANGE用于获取消息列表可以指定范围忽略删除的消息 start 表示开始值-代表最小值 end 表示结束值代表最大值 count 表示最多获取多少个值 XREVRANGE XDEL XLEN 用于获取Stream队列的消息长度 XTRIM 用于对stream的长度进行截取如超长会进行截取 MAXLEN 允许最大长度对流进行修剪限制长度 MINID 允许的最小id从某个id值开始比该id值小将会被抛弃 XREAD 用于获取消息阻塞/非阻塞只会返回大于指定id的消息 非阻塞 阻塞 XGROUP CREATE 用于创建消费者组 XREADGROUP GROUP 表示从第一条尚未被消费的消息开始读取 消费组groupA内的消费组consumer1从mystream消息队列中读取所有消息 但是不同消费组的消费者可以消费同一条消息 XPENDING 查询每个消费组内所有消费者[已读取但尚未确认] 的消息 XACK 像消息队列确认消息已经处理完成 redis 键位(key) keys *查看当前库所有的key exists key判断某个key是否存在 type key查看你的key是什么类型 del key删除指定的key数据 注意 命令不区分大小写而是key区分大小写 帮助命令 help 类型 flushdb清除当前数据库 flushall通杀全部数据库 注意 命令不区分大小写而是key区分大小写 帮助命令 help 类型 Redis持久化 持化双雄 RDB (Redis DataBase) 如何恢复 将备份文件(dump.rdb)移动到 redis 安装目录并启动服务即可 备份成功后故意用flushdb清空redis 看看是否可以恢复数据 结论执行flushshell/flushdb命令也会产生dump.rdb文件但里面是空的无意义 物理恢复一定服务和备份分机隔离 手动Redis提供了两个命令来生产RDB文件分别是save和bgsave save在主程序中执行会阻塞当前redis服务器知道持久化工作完成执行save命令期间Redis不能处理其他命令线上禁止使用。 rdb修复文件 redis-check-rdb 如何禁用快照 动态所有停止RDB保存规则的方法 redis-cli config set save 配置文件修改 总结 AOF(Append Only File) aof是什么 默认情况下redis是没有开启AOF的开启AOF功能需要设置配置: appendonly yes aof保存文件是appendonly.aof 工作流程 三种写回策略 Always同步写回每个命令执行完立刻同步地将日志写回磁盘 everysec每秒写回每个命令执行完只是先把日志写到AOF文件的内存缓冲区每隔一秒把缓冲区内容写入磁盘 no操作系统控制的写回每个写回命令执行完只是先把日志写回到AOF文件的内存缓冲区由操作系统决定何时将缓冲区内容写回磁盘 混合持化 纯缓存模式 同时关闭RDB和AOF save 禁用rdb我们仍然可以使用命令 save,bgsave生成rdb文件 appendonly no 禁用aof我们仍然可以使用命令 bgrewiteaof 生成aof文件
Redis事务 是什么 可以1次执行多个命令本质是一组命令集合一个事务中的所有命令都会序列化按顺序的串行化执行而不会被其他命令插入不允许加塞 能干嘛 一个队列中一次性、顺序性、排他性的执行一系列命令 和传统数据库比较 使用 常用命令: 正常执行(MULTI, EXEC) 放弃事务(MULTI, DISCARD) 全体连坐 冤有头债有主类似于runtime error redis不是完全的事务一致性而且redis没有回滚 watch监控 Redis使用Watch来提供乐观锁定类似于CAScheck and set 悲观锁 乐观锁 CAS watch 总结 开启以MULTI开启一个事务 入队将多个命令入队到事务中接到这些命令并不会立即执行而是放到等待执行的事务队列里 执行由EXEC命令触发事务
Redis管道 是什么批处理命令变种优化措施类似于Redis的原生批命令(mget和mset) 小总结 Pipeline与原生批量命令对比 原生批量命令是原子性(mset等)pipeline是非原子性 原生批量命令一次只能执行一种命令pipeline支持批量执行不同命令 原生批命令是服务端实现而pipeline需要服务端和客户端共同完成 Pipeline与事务对比
Redis复制 是什么 主从复制master以写为主Slave以读为主 当master数据发生变化的时候自动将更新的数据异步同步到其他slave数据库
能干嘛 读写分离 容灾恢复 数据备份 水平扩容支撑高并发 Redis哨兵 哨兵的作用 监控redis运行状态包括master和slave 当master宕机后自动将slave切换成新的master 能干嘛 主从监控监控主从redis库运行是否正常 消息通知哨兵可以将故障转移的结果发送给客户端 故障转移如果Master异常则会进行主从切换将其中一个Slave作为新的Master 配置中心客户端通过连接哨兵来获取当前Redis服务的主节点地址 哨兵一般是集群存在多数判断master宕机才进行选举 怎么使用 配从库不配主库 权限细节 master如果配置了 requirepass参数需要密码登录 slave 就要配置 masterauth 来设置校验密码否则的话master会拒绝slave的访问请求 基本操作命令 info replication 可以查看复制节点的主从关系和配置信息 replicaof 主库IP 主库端口 一般写入到redis.conf配置文件内 slaveof 主库IP 主库端口 slaveof no one 使当前数据库停止与其他数据库的同步转成主数据库 缺点 复制延时信号衰减 master挂了从机会等待 ODown客观下线 当主节点被判断为客观下线后集群选出一个哨兵领导来做故障迁移 由领导哨兵开始推动故障切换流程并选出一个新master 新主登基 某个Slave被选为新master 群臣俯首 旧主拜服 Redis集群 定义由于数据量过大单个master复制集团难以承担因此需要对多个复制集进行集群形成水平扩展每个复制集只负责存储整个数据集的一部分这就是Redis的集群其作用是提供在多个Redis节点间共享数据的程序集。 集群可以支持多个Master Springboot集成Redis 总体概述jedis-lettuce-RedisTemplate三者的联系 集成Jedis 是什么 步骤 建module 改POM 写YML 主启动 业务类 集成lettuce 能干嘛 Redis集群支持多个Master每个Master又可以挂载多个Slave 读写分离 支持数据的高可用 支持海量数据的读写存储操作 由于Cluster自带Sentinel的故障转移机制内置了高可用的支持无需再去使用哨兵功能 客户端与Redis的节点链接不再需要连接集群中所有节点只需要任意连接集群中的一个可用节点即可 槽位slot负责分配到各个物理服务节点由对应的集群来负责维护节点、插槽和数据之间的关系 集群算法-分片-槽位slot redis集群的槽位slot redis集群的分片 优势 方便扩容、缩容和数据查找 slot槽位映射一般业界有三种解决方案 哈希取余分区 优点 缺点 一致性哈希算法分区 是什么分布式缓存数据 变动和映射问题某个机器宕机了分母数量改变了自然取余数不ok了 能干嘛提出一致性Hash解决方案。目的是当服务器个数发生变化时尽量减少影响客户端到服务器的映射关系 三大步骤 算法构建一致性哈希环 服务器IP节点映射 key落到服务器的落键规则 一致性哈希算法容错性 一致性哈算算法的扩展性 缺点Hash环的数据倾斜问题 哈希槽分区 为什么redis集群的最大槽数是16384个 Redis集群 不保证强一致性这意味着在特定条件下Redis集群可能会丢掉一些被系统收到的写入请求命令 集群环境案例步骤