• Redis总结


    简述

    NoSql概述

    not only sql,为了和关系型数据库区分,泛指非关系型数据库

    1. 列存储:Hbase
    2. Key-Value存储:Redis
    3. 文档存储:MongoDB
    4. 图存储:Neo4J
    5. 对象存储:MiniO
    6. xml存储

    Redis概述

    • 基于内存存储的键值对数据库。

    • 数据存在内存中,多种数据类型,键值对存储

    应用场景
    1. 有效期数据
    2. 数据缓存
    3. 共享数据

    Docker安装Redis

    1. 根目录下创建文件夹:mkdir -p /docker/redis/redis6379
    2. 上传配置文件:redis.conf,默认设置密码:******
    3. 执行命令创建并运行:docker run -d --name redis6379 -p 6379:6379 -v /docker/redis/redis6379/redis.conf:/etc/redis/redis.conf redis:6.2.1 redis-server /etc/redis/redis.conf
    4. 访问测试:执行命令[docker exec -it redis6379 bash, redis-cli, auth pasword]

    数据类型

    1. String 字符串

    2. List 集合,元素可重复,保证有序

    3. Set 集合,元素不可重复,⽆序

    4. Hash 集合,键值对,键唯一

    5. SortSet 集合,等价于Map

    6. Stream 集合,流、记录的事件发展流程

    7. Geo 集合,记录经纬度

    8. BitMap 数组,字节(0 or 1)

    9. HyperLogLog 算法,统计基数

    常用7种:string、list、set、hash、geo、bitmap、sortset

    String

    值是单个的,有效期

    操作

    命令含义
    set key value设置内容,若无为新增,有则为修改
    get key获取内容
    lncr key自增1
    decr key自减1
    incrby key val自增val值
    decrby key val自减val值
    getdel key获取并删除
    append key追加
    setex key seconds value设置内容和有效时间

    List 集合

    值的类型是List集合,可以存储多个元素,值是多个的,元素有序,可重复,保证添加顺序

    命令含义
    lpush key 元素…从左边(头部)添加元素
    rpush key 元素…从右边(尾部)添加元素
    lpop key获取并删除第一个数据
    rpop key获取并删除最后一个数据
    lrange key start end获取索引范围内的内容
    llen key获取元素个数

    Set 集合

    值的类型是Set集合,值是多个的,元素⽆序,不可重复

    命令含义
    sadd key value新增元素
    smemebers key获取所有元素
    srem key value删除指定元素
    scard key查询元素
    sismenmber key value验证元素是否存在
    siner key1 key2交集(共同拥有饭)
    sdiff key1 key2差集(一个中有,另一个中没有)
    sunion key1 key2并集(所有)

    Hash 集合

    值的类型是Hash,其实就是Java中Map集合Map,Field–Value,其中Field唯⼀,Value可以重复,键值对组成

    命令含义
    hset key field value新增元素
    hget key field获取指定字段值
    hgetall key获取所有元素
    hexists key field验证字段是否存在
    hkeys key获取所有fields
    hvals key获取所有的值
    hdel key field删除指定的字段

    SortSet类型

    值的类型是特殊的Map集合,等价于:Map,每个元素都⼀个对应的分数(Score),可以根据分数进⾏排序。

    分数可以是小数,可重复,元素类型任意,不可重复

    命令含义
    zadd key score value新增元素
    zcount key start分数 end分数获取指定分数内的元素数量
    zcard key获取元素个数
    zrange key startindex endindex获取指定索引内的元素
    zrevrange key startindex endindex获取指定索引内的元素,按分数降序排列
    zrem key value删除元素

    Geo 集合

    存储多个地点信息:1.经度(纵向) 2.纬度(横向) 3.地点名称

    命令含义
    geoadd key 经度 纬度 地点名称新增地理位置
    geopos key 地点名称获取地点对应的经纬度
    geodlist key 地点1 地点2 单位(M,KM…)计算两个地点间距离
    geiradius key 经度 纬度 半径 单位获取指定经纬度匹配半径内的地点信息

    BitMap 数组

    bit数组,0或1,默认是0

    命令含义
    setbit key index value设置指定索引的值,设置为1
    getbit key index获取指定索引的值
    bitcount key获取1的数量

    系统命令

    命令含义
    auth password验证密码
    ttl key查询剩余有效期
    del key删除key
    expire key 秒数设置key有效期
    Exists key验证key是否存在
    keys *匹配所有的key,支持模糊匹配
    scan index MATCH *代替keys *
    select 数据库索引切换数据库,默认16个库,索引从0开始

    Java操作Redis

    Jedis

    1. 依赖jar包

      <dependency>
          <groupId>redis.clientsgroupId>
          <artifactId>jedisartifactId>
      dependency>
      
      • 1
      • 2
      • 3
      • 4
    2. 代码

      // 连接
      Jedis jedis = new Jedis("host",port);
      jedis.auth("password");
      // 操作
      jedis.操作...
      
      • 1
      • 2
      • 3
      • 4
      • 5

    Redisson

    看门狗,适用于集群,内部实现分布式锁、布隆过滤器

    1. 依赖jar包

      <dependency>
          <groupId>org.redissongroupId>
          <artifactId>redissonartifactId>
          <version>3.16.4version>
      dependency>
      
      • 1
      • 2
      • 3
      • 4
      • 5
    2. 代码

      // 连接
      Config config = new Config();
      config.useSingleServer().setAddress("redis://host:6379").setPassword("password");
      RedissonClient client = Redisson.create(config);
      // 操作
      client.操作
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6

    Spring Data Redis

    属于Spring体系下的Spring Data框架(Spring针对数据源封装的很多⼩框架,操作不同的数据源)中的⼀种。

    1. 依赖jar

      <dependency>
          <groupId>org.springframework.bootgroupId>
          <artifactId>spring-boot-starter-data-redisartifactId>
      dependency>
      
      • 1
      • 2
      • 3
      • 4
    2. 实现配置

      spring:
      	redis:
      		hostL:host
      		port:6379
      		password:password
      
      • 1
      • 2
      • 3
      • 4
      • 5
    3. 代码

      @SpringBootTest
      public class DataRedisTest {
      	@Autowired
      	private StringRedisTemplate redisTemplate;
          
      	@Test
      	public void t1(){
              //String类型
              redisTemplate.boundValueOps("a").set("a");
              //Hash类型
              redisTemplate.boundHashOps("b").put("1","b");
              //List类型
              redisTemplate.boundListOps("c").leftPush("c");
              System.err.println(redisTemplate.boundListOps("d").leftPop(1));
              //Set类型
              redisTemplate.boundSetOps("e").add("a","b");
           }
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18

    Redis核心

    持久化

    作用:Redis数据存储在内存中,为了防止服务器宕机或关闭,导致内存数据丢失,持久化是把内存数据存储到硬盘上,当Redis重新启动时,加载硬盘的数据文件,可以保证内存数据不会因为宕机而丢失。

    持久化方案:1.RDB 2.AOF

    RDB

    语法格式:save 秒数 改变的数量

    • 默认的持久化机制
    • RDB持久化文件,速度较快
    • 存储文件为二进制文件,传输方便
    • 直接把内存数据存储到二进制文件中,dump.rdb
    AOF

    语法格式:appendfsync always(每执⾏⼀个写操作,⽴即持久化到AOF⽂件中,性能⽐较低);appendfsync everysec(每秒执⾏⼀次持久化)

    • 默认关闭
    • 存储操作命令,速度相对比较慢

    事务

    作用:处理多个命令,要么都提交,要么取消

    • 开始事务后,执行的所有命令,都加入到队列中,只要提交事务,才按照次序执行命令。若取消后,则不执行,同时销毁队列

    事务生效需要配置watch监听机制,开启事务前,先通过watch去监听一个或多个key,开启事务后,有其他客户端修改key后事务会自动取消

    作用命令
    开启事务multi
    提交事务exec
    回滚事务discard

    集群策略

    1.主从复制

    主从复制实现主库数据写入,自动同步数据到所有从库

    • 主库:可以写入,查询Master
    • 从库:可以查询只读库Slaver

    解决的问题

    1. 避免单点故障
    2. 可以抗并发量

    存在的问题

    1. 存储数据上限
    2. 主库宕机,Redis无法写入新数据
    2.哨兵机制

    哨兵机制为了解决主从复制中的主库宕机无法写入新数据的问题,一旦主库宕机,会从从库中选举一个作为主库,通过更改从库的连接

    解决问题

    • 解决主从复制中,主库意外宕机,无法写入新数据

    存在的问题

    • 存储数据上限
    3.去中心化集群

    Redis-Cluster(去中心化集群):实现多主多从,可以解决并发量和数据存储问题

    详述

    1. Redis集群是无中心的。
    2. Redis集群有一个ping-pang机制。
    3. 投票机制,Redis集群节点的数量必须是2n+ 1.
    4. Redis集群中默认分配了16384个hash槽,在存储数据时,就会将key进行crc16的算法,并且对16384取余,根据最终的结果,将key-value存放到指定Redis节点中,而且每一个Redis集群都在维护着相应的hash槽
    5. 为了保证数据的安全性,每一个集群的节点,至少要跟着一个从节点。
    6. 单独的针对Redis集群中的某一个节点搭建主从。
    7. 当Redis集群中,超过半数的节点若机之后,Redis集群就瘫痪了。

    过期策略

    Redis为key设置有效期,Redis的过期策略用来解决有效期结束的key

    • 定期删除:Redis会在100ms的间隔中定时,查看并随机删除指定数量的key
    • 惰性删除:每次查询时,先判定key是否过期,如果过期则删除

    淘汰机制

    解决Redis服务器内存不足时,新增数据的处理

    指定淘汰机制的⽅式:maxmemory-policy 具体策略,设置Redis的最⼤内存:maxmemory 字节⼤⼩

    操作解释
    volatile-lru在内存不⾜时,Redis会在设置过了⽣存时间的key中⼲掉⼀个最近最少使⽤的key
    allkeys-lru在内存不⾜时,Redis会在全部的key中⼲掉⼀个最近最少使⽤的key
    volatile-lfu在内存不⾜时,Redis会在设置过了⽣存时间的key中⼲掉⼀个最近最少频次使⽤的key
    allkeys-lfu在内存不⾜时,Redis会再全部的key中⼲掉⼀个最近最少频次使⽤的key
    volatile-random在内存不⾜时,Redis会再设置过了⽣存时间的key中随机⼲掉⼀个
    allkeys-random在内存不⾜时,Redis会再全部的key中随机⼲掉⼀个
    volatile-ttl在内存不⾜时,Redis会在设置过了⽣存时间的key中⼲掉⼀个剩余⽣存时间最少的key
    noeviction(默认)在内存不⾜时,直接报错
  • 相关阅读:
    promise defer的使用方法
    Windows下ogre编译安装
    华为OD机试 - 查找接口成功率最优时间段 - 回溯(Java 2023 B卷 100分)
    【我的Android进阶之旅】如何在Android中使用ARCore来增强人脸Augmented Faces?
    使用 .NET Reactor 混淆C#程序后,调用ToJson()出现Newtonsoft.Json.JsonSerializationException
    Document Solutions for Word(GcWord)6.2.5 Crack
    Pytorch中CrossEntropyLoss()详解
    一台Linux机器上最多能建立多少个TCP连接?
    分布(五)利用python绘制蜂群图
    【目标检测】-----YOLOV5网络结构详解
  • 原文地址:https://blog.csdn.net/qq_44691720/article/details/126860254