Redis

一、安装及相关知识介绍

1. 安装

  1. redis官网 下载6.2.6

    1
    wget https://download.redis.io/releases/redis-6.2.6.tar.gz	
  2. 安装 gcc 编译器

    1
    2
    3
    4
    yum install gcc

    # 测试gcc环境
    gcc --version
  3. redis解压缩到 安装位置

    1
    tar -zxvf redis-6.2.6.tar.gz /opt/tools/redis
  4. 编译

    1
    2
    3
    cd /opt/tools/redis/redis-6.2.6

    make
  5. 如果没有安装好c语言编译环境,make会报错 –Jemalloc/jemalloc.h:没有那个文件

    解决:运行

    1
    make distclean

    在redis-6.2.6目录下再次执行make命令

  6. 可以跳过 make test 执行 make install 安装到 /usr/local/bin

  7. 安装目录 /use/local/bin

    默认安装目录说明
    redis-benchmark:性能测试工具,可以在自己本子运行,看看自己本子性能如何redis-check-aof:修复有问题的AOF文件,rdb和aof后面讲
    redis-check-dump:修复有问题的dump.rdb文件
    redis-sentinel : Redis集群使用
    redis-server : Redis服务器启动命令,redis-cli :客户端,操作入口

  8. 启动

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    # 前台启动
    redis-server

    # 后台启动
    vi /opt/tools/redis/redis-6.2.6/redis.conf
    # 找到daemonize将no改为yes
    # 保存并退出
    # 启动
    redis-server /opt/tools/redis/redis-6.2.6/redis.conf
    # 查看启动情况
    ps -ef | grep redis

    # ps可省略
    # 使用客户端连接redis
    redis-cli
    # 使用ping命令测试会出现PONG表示成功
    ping
  9. 关闭redis服务

    1. 直接关闭

      1
      redis-cli shutdown
    2. 找到进程,杀死进程

      1
      2
      ps -ef | grep redis
      kill 进程号
    3. 多实例关闭

      1
      redis-cli -p 6379 shutdown

2. redis相关知识介绍

  1. 6379端口由来

    Alessia Merz Merz对应的九键输入

  2. 默认16个数据库,类似数组下标从0开始,初始默认0号库

    使用命令 select 来切换数据库

  3. 统一密码管理,所有库同样的密码

  4. dbsize 查看当前数据库的 key 的数量

    flushdb 清空当前库

    flushall 通杀全部库

  5. Redis 是单线程+多路 IO 复用技术

    多路复用是指使用一个线程来检查多个文件描述符( Socket )的就绪状态,比如调用select和poll函数,传入多个文件描述符,如果有一个文件描述符就绪,则返回,否则阻塞直到超时。得到就绪状态后进行真正的操作可以在同一个线程里执行,也可以后动线程执行(比如使用线程池)
    串行vs多线程+锁 (memcached ) vs单线程+多路Io复用(Redis)
    (与Memcache三点不同:支持多数据类型,支持持久化,单线程+多路IO复用)

二、Redis常用数据类型

获取Redis常见数据类型操作命令

1. Redis键(Key)

  1. keys * 查看当前库所有key(匹配:keys*1)
  2. exists key 判断某个 key 是否存在
  3. type key 查看你的 key 是什么类型
  4. del key 删除指定的 key 数据
  5. unlink key 根据 value 选择非阻塞删除
    仅将 keys 从 keyspace元数据中删除,真正的删除会在后续异步操作。
  6. expire key 10 10秒钟:为给定的key 设置过期时间
  7. ttl key 查看还有多少秒过期,-1表示永不过期,-2表示已过期
  8. select 命令切换数据库
  9. dbsize 查看当前数据库的 key 的数量 flushdb 清空当前库

2. Redis字符串(String)

1. 介绍

  String是Redis最基本的类型,你可以理解成与Memcached一模一样的类型,一个key对应一个value。
  String类型是二进制安全的。意味着Redis的string可以包含任何数据。比如jpg图片或者序列化的对象。
  String类型是Redis最基本的数据类型,一个Redis中字符串value最多可以是512M

2. 命令

  1. set 添加键值对
  2. get 查询对应键值
  3. append 将给定的 追加到原值的末尾
  4. strlen 获得值的长度。
  5. setnx 只有在 key 不存在时设置 key 的值
  6. incr 将key中储存的数字值增 1 只能对数字值操作,如果为空,新增值为 1
  7. decr 将kev中储存的数字值减 1 只能对数值进行操作,如果为空,新增值为-1
  8. incrdy / decrby <步长> 将 key 中存储的数字值增减。自定义步长

3. 原子性

  所谓原子操作是指不会被线程调度机制打断的操作

  这种操作一旦开始,就一直运行到结束,中间不会有任何context switch(切换到另一个线程)。

  1. 在单线程中,能够在单条指令中完成的操作都可以认为是”原子操作”,因为中断只能发生于指令之间。
  2. 在多线程中,不能被其它进程(线程)打断的操作就叫原子操作。Redis单命令的原子性主要得益于Redis的单线程。
  3. mset 同时设置—个或多个key-value对。
  4. mget 同时获取一个或多个value
  5. msetnx 同时设置一个或多个key-value对,当且仅当所有给定key都不存在。
    原子性,有一个失败则都失败
  6. getrange <起始位置> <结束位置> 获得值的范围,类似java中的substring,前包,后包
  7. setrange <起始位置>
    用覆写所储存的字符串值,从<起始位置>开始(索引从0开始)。
  8. setex <过期时间>
    设置键值的同时,设置过期时间,单位秒。
  9. getset
    以新换旧,设置了新值同时获得旧值。

4. 数据结构

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

3. Redis列表(List)

1. 介绍

  单键多值

  Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。
  它的底层实际是个双向链表,对两端的操作性能很高,通过索引下标的操作中间的节点性能会较差。

2.命令

  1. lpush/push …. 从左边/右边插入一个或多个值。
  2. lpop/rpop 从左边/右边吐出一个值。值在键在,值光键亡
  3. rpoplpush 从列表右边吐出一个值,插到列表左边。
  4. lrange 按照索引下标获得元素(从左到右)
  5. lrange mylist 0 -1 0左边第一个,-1右边第一个,(0-1表示获取所有)
  6. lindex 按照索引下标获得元素(从左到右)
  7. llen 获得列表长度v
  8. linsert before 在的后面插入插入值。
  9. lrem 从左边删除n个value(从左到右)
  10. lset 将列表key下标为index的值替换成value

3. 数据结构

  List的数据结构为快速链表quickList。
  首先在列表元素较少的情况下会使用一块连续的内存存储,这个结构是 ziplist,也即是压缩列表。
  它将所有的元素紧挨着一起存储,分配的是一块连续的内存。
  当数据量比较多的时候才会改成 quicklist。
  因为普通的链表需要的附加指针空间太大,会比较浪费空间。比如这个列表里存的只是int类型的数据,结构上还需要两个额外的指针 prev 和 next 。
image-20220208152249841

  Redis将链表和ziplist结合起来组成了quicklist。也就是将多个ziplist使用双向指针串起来使用。这样既满足了快速的插入删除性能,又不会出现太大的空间冗余。

4. Redis集合(Set)

1. 介绍

  Redis set对外提供的功能与list类似是一个列表的功能,特殊之处在于set是可以自动排重的,当你需要存储一个列表数据,又不希望出现重复数据时,set是一个很好的选择,并且set提供了判断某个成员是否在一个set集合内的重要接口,这个也是 list所不能提供的。

  Redis的 set是string类型的无序集合。它底层其实是一个value为null的 hash表,所以添加,删除,查找的复杂度都是O(1).
  一个算法,随着数据的增加,执行时间的长短,如果是O(1),数据增加,查找数据的时间不变。

2. 命令

  1. sadd …..
    将一个或多个member元素加入到集合key中,已经存在的member元素将被忽略
  2. smembers 取出该集合的所有值。
  3. sismember 判断集合是否为含有该值,有1,没有0
  4. scard 返回该集合的元素个数。
  5. srem …. 删除集合中的某个元素。
  6. spop 随机从该集合中吐出一个值。
    srandmember 随机从该集合中取出n个值。不会从集合中删除。

5. Redis哈希(Hash)

6. Redis有序集合Zset