首页 > 数据库 >Redis课程笔记

Redis课程笔记

时间:2023-02-08 22:58:39浏览次数:59  
标签:AOF 图示 Redis value 课程 笔记 key RDB

Redis

安装

前台启动

后台启动

  • 1)备份redis.conf
  • 2)修改配置:deamonize yes
  • 3)执行 redis-server 配置文件的目录

key键操作

select [dbindex]

  • 切换库

keys *

  • 查所有key

exists keyname

type keyname

  • key的数据类型

del keyname

  • 删除key的数据
  • 先在keyspace中删除,后续通过异步删除实际数据

expire keyname 秒数

  • 设置key的过期时间

ttl keyname

  • 查看多少秒后过期 -1不会过期 -2过期了

dbsize

  • 查看key的数量

flushdb

  • 清空db

flushall

  • 清全部库

五大数据类型

字符串

  • 常用命令

    • 二进制安全,一个value最大可以是512m

    • set key value 添加键值对

    • get key 查询value

    • append key value 将给定的value追加到原值的末尾

    • strlen key 获取value的长度

    • setnx key value 只有key不存在才设置key的值

    • incr key 将value存的数值加1;如果为空,新增值为1

    • decr key 将value存的数值减1

    • incrby/decr key 步长 将value存的数值增减指定的步长

    • mset key1 value1 key2 value2... 设置多个key-value

      • 有一个失败则全失败
    • mget key1 key2 key3

      • 有一个失败则全失败
    • msetnx k1 v1 k2 v2 ...

      • 有一个失败则全失败
    • getrange key 起始位置 终止位置 获取value在范围中的数据,等于Java的subString

    • setrange key 起始位置 value 从起始位置开始用value覆盖原来位置的值

    • setex key 过期时间 value 设置键值的同时设备过期时间

    • getset key value 设置新值的同时获得旧值

  • 数据结构
     

    • String的数据结构为简单动态字符串(Simple Dynamic String,缩写SDS)。是可以修改的字符串,内部结构实现上类似于Java的ArrayList,采用预分配冗余空间的方式来减少内存的频繁分配

列表 List

  • 简介

    • 单键多值
  • 常用命令

    • lpush/rpush k1 v1 k2 v2 kn vn 左边或者右边插入多个值

    • lpop/rpop key 从左边或右边吐出一个值

    • rpoplpush k1 k2 从k1列表右边吐出一个值放到k2列表左边

    • lrange key 起始位置 终止位置 按照索引下标获得元素(从左到右)

      • lrange key 0 -1 表示取所有
    • lindex key index 按照索引下标获得元素(从左到右)

    • llen key 获得列表的长度

    • linsert key before value newValue 在value的前面插入newValue

    • lrem key n value 从左开始删除n个value

      • 图示
    • lset key index value 将下标index的值替换为value

  • 数据结构

    • 快速链表quickList

集合 Set

  • 简介

    • 自动排重、无序集合;底层是一个value为null的hash表
  • 常用命令

    • sadd key v1 v2 添加多个值
    • smembers key 取出所有值
    • sismember key value 判断是否存在该值 有1 无0
    • scard key 查询元素个数
    • srem key v1 v2 v3 ... 删除多个值
    • spop key 随机取一个值
    • srandmember key n 随机获得n个值,不从集合删除
    • smove sourceKey DestKey value 把value从sourceKey挪到destKey
    • sinter k1 k2 返回两个集合的交集
    • sunion k1 k2 返回并集
    • sdiff k1 k2 返回差集(在k1中,不在k2中的)
  • 数据结构

    • 结构是dict字典,字典底层使用hash表实现,所有的value指向同一个对象

哈希 Hash

  • 简介

    • 键值对集合、等同于Java的Map,特别适合存储对象
  • 常用命令

    • hset key field value 给field赋值
    • hget key field 取field值
    • hmset key f1 v1 f2 v2 ... 批量设置值
    • hexists key field 查看field是否存在
    • hkeys key 列出所有field
    • hvals key 列出所有field的value
    • hsetnx key field value 设置值为value仅当field不存在的时候
    • hincrby key field increment 将field的值加increment
  • 数据结构

    • ziplist和hashtable。当field-value长度较短且个数较少时,使用ziplist,否则使用hashtable。

有序集合 Zset

  • 简介

    • 和set非常相似,不过zset每一个成员都关联一个评分score,score可以重复,评分被用来排序
  • 常用命令

    • zadd key score1 v1 score2 v2... 将多个元素加入到key中

    • zrange key 起始位置 终止位置 [withscores]

      • 获取区间的元素,加上WITHSCORES标志可以返回的时候带上分数
    • zrangebyscore key minmax [withscore] [limit offset count]

      • 获取score在min和max之间的元素(包括min和max),score递增排序
    • zrevrangebyscore key maxmin [withscore] [limit offset count]

      • 获取score在min和max之间的元素(包括min和max),score递减排序
    • zincrby key increment value 为元素加上增量

    • zrem key value 删除指定value的元素

    • zcount key min max 统计分数区间元素的个数

    • zrank key value 返回该值的排序,从0开始计数

  • 数据结构

    • 使用了hash和跳跃表

    • 跳跃表

      • 图示

配置文件

单位Unit

  • 开头定义了一些基本的度量单位,只支持bytes,不支持bit,大小写不敏感

加载其他配置 Includes

网络 Network

  • bind

    • 图示
  • protected-mode

  • port

  • tcp-backlog

    • 连接队列
  • timeout

    • 一个空闲的客户端维持多少秒会关闭,0表示关闭该功能,即永不关闭
  • tcp-keepalive

    • tcp心跳监测连接周期,默认300s

通用 General

  • deamonize yes

    • yes为开启后台运行
  • pidfile

    • 存放pid文件的位置,每个实例会产生一个不同的 pid文件
  • loglevel

    • 日志级别,共4个级别,默认notice
  • logfile

    • 输出日志的路径
  • database

安全 SECURITY

限制 Limits

  • maxclients

    • 设置redis可以同时和多少个client进行连接,默认10000。如果满了,redis会拒绝新请求,并回复"max number of clients reached"
  • maxmemory

    • 图示
  • maxmemory-policy

    • 图示
  • maxmemory-samples

    • 图示

发布与订阅

参考链接

Redis发布与订阅 - duanxz - 博客园 (cnblogs.com)

新数据类型

Bitmaps

  • 简介

  • 命令

    • setbit key offset 0/1 设置偏移量的值为0或1

      • 偏移量从0开始计数
    • getbit key offset 获取偏移量的值

    • bitcount key [起始字节 终止字节] 统计数据中bit=1的个数

      • 图示
    • bitop

      • 图示
  • Bitmaps和Set做对比

    • 月活量高用有优势

    • 缺点

HyperLogLog

  • 简介

    • 第一部分

    • 基数

  • 命令

    • pfadd key element [element...] 添加元素到HyperLogLog中
    • pfcount key [key...] 计算HLL的近似基数
    • pfmerge destKey sourceKey [sourceKey...] 将一个或者多个HLL的结果合并到另一个HLL中

Geospatial

  • 简介

    • 图示
  • 命令

    • geoadd key lon lat member [lon lat member] 添加地理位置信息(经度 纬度 名称)

      • 示例
    • geopos key member [member...] 获得地区的经纬度

    • geodist key member1 member2 [m|km|ft|mi] 获得两个地点之间的直线距离

      • 实例
    • georadius key lon lat radius m|km|ft|mi 以给定的经纬度为中心,radius为半径找范围内的元素

      • 实例

Jedis

Jedis操作

示例: Jedis验证码

  • 图示

事务操作

事务定义

  • 图示

Redis事务三特性

  • 单独的隔离操作

    • 事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断
  • 没有隔离级别的概念

    • 队列中的命令没有提交之前都不会实际被执行,因为事务提交前任何指令都不会被实际执行
  • 不保证原子性

    • 事务中如果有一条命令执行失败,其后的命令仍然会被执行,没有回滚

Multi、Exec、Discard、Watch

  • 图示

事务的错误处理

事务冲突的问题

  • 悲观锁

    • 图示
  • 乐观锁

    • 图示
  • watch key [key...] 在执行multi之前,先执行watch命令可以监视多个key,如果在事务执行之前某些被监视的key 被其他命令所改动,那么事务将被打断

秒杀案例

  • 图示

  • Apache Bench工具模拟并发

  • 超卖问题

    • 使用乐观锁解决超卖问题

    • 乐观锁造成库存遗留问题

      • 解决方案1:LUA脚本

        • 图示

        • LUA脚本在Redis中优势

          • 图示
  • 超时问题

    • 连接池解决超时问题,双重检查锁搞一个单例模式的连接池工具类

持久化操作

RDB(Redis Database)

Redis 默认开启RDB持久化方式,在指定的时间间隔内,执行指定次数的写操作,则将内存中的数据写入到磁盘中。
RDB 持久化适合大规模的数据恢复但它的数据一致性和完整性较差。
Redis 需要手动开启AOF持久化方式,默认是每秒将写操作日志追加到AOF文件中。

  • 简介

    • 在指定的时间间隔内将内存中的数据集快照写入磁盘,也就是行话讲的 Snapshot快照,它恢复时是将快照文件直接读到内存里

      • 持久化过程

        • 图示
  • 如何进行持久化

    • 图示

      • Fork

        • 图示
    • RDB配置规则

      • 图示
    • dump.rdb文件配置参数

      • 图示
    • 压缩配置参数

      • 图示
  • RDB的优势

    • 图示
  • RDB的劣势

    • 图示

    • 注意:由于Redis使用fork来复制一份当前进程,那么子进程就会占有和主进程一样的内存资源,比如说主进程8G内存,那么在备份的时候,必须保证有16G的内存,要不然会启用虚拟内存,性能非常的差

  • 如何停止

    • 动态停止RDB : redis-cli config set save ""

    save后给空值,表示禁用保存策略

AOF(Append Of File)

  • 简介

    • 图示
  • 持久化流程

    • 客户端的请求写命令会被append追加到AOF缓冲区内
    • AOF缓冲区根据AOF持久化策略[always,everysec,no]将操作sync同步到磁盘的AOF文件中
    • AOF文件大小超过重写策略或手动重写时,会对 AOF文件rewrite重写,压缩AOF文件容量
    • Redis服务重启时,会重新load 加载AOF文件中的写操作达到数据恢复的目的
  • AOF默认不开启

    • 可以在redis.conf 中配置文件名称,默认为appendonly.aof,AOF 文件的保存路径,同RDB的路径一致。
  • AOF和RDB同时开启,Redis怎么选择

    • AOF和RDB同时开启,系统默认取AOF的数据(数据不会存在丢失)
  • AOF启动、恢复、修复

    • AOF的备份机制和性能虽然和RDB不同,但是备份和恢复的操作同RDB一样,都是拷贝备份文件,需要恢复时再拷贝到Redis工作目录下,启动系统即加载

    • 正常恢复

      • 修改默认的appendonly no,改为yes
      • 将有数据的aof文件复制一份保存到对应目录
        (查看目录: config get dir).
      • 重启redis,然后重新加载
    • 异常恢复

      • 修改默认的appendonly no,改为yes
      • 如遇到AOF文件损坏,通过/usr/local/bin/redis-check-aof --fix appendonly.aof 进行恢复
      • 备份被写坏的AOF文件
      • 恢复:重启redis,然后重新加载
  • AOF同步频率设置

    • appendfsync always

      • 始终同步,每次 Redis 的写入都会立刻记入日志;性能较差但数据完整性比较好
    • appendfsync everysec

      • 每秒同步,每秒记入日志一次,如果宕机,本秒的数据可能丢失
    • appendfsync no

      • redis不主动进行同步,把同步时机交给操作系统
  • Rewrite 重写压缩

  • AOF优势

    • 图示
  • AOF劣势

    • 比起 RDB占用更多的磁盘空间
    • 恢复备份速度要慢。
    • 每次读写都同步的话,有一定的性能压力。
    • 存在个别 Bug,造成恢复不能

主从复制

简介

  • 主机数据更新后根据配置和策略,自动同步到备机的master/slaver的机制,Master以写为主,Slave以读为主
  • 参考链接

作用

  • 读写分离,性能扩展
  • 容灾快速恢复

配从不配主

  • 在从机上执行slaveof 主机ip 端口号

复制原理

薪火相传

反客为主

  • 手动执行 slaveof no one 将从机变主机

哨兵模式 Sentinel

  • 反客为主的自动版,能够后台监控主机是否故障,如果故障了根据投票数自动将从库转换为主库

  • 使用步骤

    • 调整为一主二仆模式,6379带着6380、6381

    • 自定义的/myredis目录下新建sentinel.conf 文件,名字绝不能错

      • 编辑哨兵配置文件,填写内容
        sentinel monitor mymaster 127.0.0.16379 1
        其中mymaster为监控对象起的服务器名称,1为至少有多少个哨兵同意迁移的数量。
    • 启动哨兵

复制延时

故障恢复

  • 偏移量是指获得原主机数据最全的,每个redis 实例启动后都会随机生成一个40位的runid

主从复制

  • 图示

集群

简介

  • 数据被分在各个master上。即使连接的不是主机,集群会自动切换主机存储。主机写,从机读。无中心化主从集群。无论从哪台主机写的数据,其他主机上都能读到数据。

集群搭建

  • Cluster配置修改

    • 图示
  • 合体

    • 图示
  • 分配原则

    • 尽量保证每个主数据库运行在不同的IP地址,每个从库和主库不在一个IP地址上。
  • 搭建集群参考

集群操作

  • 多个值存储按组计算插槽

    • 图示
  • 查询集群中的值

    • 图示

集群故障恢复

  • 图示

集群Jedis开发

  • 图示

集群的好处与坏处

  • 好处

    • 实现扩容
    • 分摊压力
    • 无中心配置相对简单
  • 坏处

    • 多键操作是不被支持的·
    • 多键的Redis事务是不被支持的。lua脚本不被支持
    • 由于集群方案出现较晚,很多公司已经采用了其他的集群方案,而代理或者客户端分片的方案想要迁移至redis cluster,需要整体迁移而不是逐步过渡,复杂度较大。

标签:AOF,图示,Redis,value,课程,笔记,key,RDB
From: https://www.cnblogs.com/bwqueen/p/17103619.html

相关文章

  • 树链剖分 学习笔记
    树链剖分学习笔记树链剖分(Treedecomposition),顾名思义,是一种将树剖分为若干条链,使得可以用数据结构维护树上信息的数据结构。树链剖分有多种意思,包括重链剖分、长链剖分......
  • FL论文笔记 Hierarchically Fair Federated Learning,Shapley计算贡献
    相关笔记:https://blog.csdn.net/wuxusanren/article/details/128651334相关综述论文:《ASurveyofIncentiveMechanismDesignforFederatedLearning》《联邦学习激励......
  • 一点seq2seq的笔记
    一点seq2seq的笔记Date:2023-02-08T21:33:00+08:00毕设,看了点神经网络的内容。RNN的输入是asequenceofvector,感觉RNN像在训练一个cell,喂给cell一个vector......
  • 计算机相关专业及本科课程整理
    problem本科的计算机课程好多傻乎乎的分不清有哪些具体的专业,以及要学什么这里做个整理solution首先专业门类限定在工学和理学,以工学为主工学当中,比较相关的有计算机类,电......
  • 《代码整洁之道》 读书笔记 一、整洁代码
    1.整洁代码1.1要有代码代码不再是问题;我们应当关注模型和需求。代码很快就能自动产出。这种言论是不正确的。因为代码呈现了需求的细节,在某些层面上,这些细节无法被忽......
  • 自我介绍&学习笔记
    这个作业属于哪个课程https://edu.cnblogs.com/campus/fzzcxy/2023learning这个作业要求在哪里https://edu.cnblogs.com/campus/fzzcxy/2023learning/homework/1......
  • 第三天笔记
    第三天笔记程序控制语句条件控制语句(根据不同的条件进入不同的代码块)循环控制语句(根据循环条件进行多次循环)循环控制语句流程定义初始值设置迭代条件......
  • API对象--Ingress(chrono《kubernetes入门实战课》笔记整理)
    【概念说明】Service的功能和运行机制,主要由kube-proxy控制的四层负载均衡,即根据IP、PORT来做负载均衡。而很多应用都是在7层做均衡更为合理,比如根据主机名、URI、请求......
  • OpenWHO课程 Introduction to COVID-19: methods for detection, prevention, respons
    1、课程内容IntroductiontoCOVID-19:methodsfordetection,prevention,responseandcontrolCOVID-19简介:检测、预防、应对和控制访问链接:​​​https://openwho.o......
  • RedisTemplate配置读取序列化
    配置项publicRedisTemplate<String,Object>redisTemplate(RedisConnectionFactoryfactory){RedisTemplate<String,Object>template=newRedi......