Redis学习笔记


Redis学习笔记

理论基础知识

NoSQL数据库

NoSQL(Not Only SQL,不仅仅可以使用关系型数据库)数据库,又名非关系型数据库。它们的宣传口号:不是什么样的场景都必须使用关系型数据库,一些特定的场景使用NoSQL数据库更好。

常见NoSQL数据库:

  1. memcached :键值对,内存型数据库,所有数据都在内存中。
  2. Redis:和Memcached类似,还具备持久化能力。
  3. HBase:以列作为存储。
  4. MongoDB:以Document做存储。

Redis简介

Redis是用c语言编写的以Key-Value形式进行存储的NoSQL数据库管理系统·。

平时操作的数据都在内存中,效率特高,读的效率110000次/s,写81000次/s,所以多把Redis当做缓存工具使用(在一些框架中还把Redis当做临时数据存储工具)。缓存工具:把数据库中数据缓存到Redis中,由于Redis读写性能较好,访问Redis中数据,而不是频繁访问数据库中数据。

Redis以slot(槽)作为数据存储单元,每个槽中可以存储N多个键值对。Redis中固定具有16384个槽。理论上可以实现一个槽是一个Redis。每个向Redis存储数据的key都会进行crc16算法得出一个值后对16384取余就是这个key存放的solt位置。

​ 虽然槽的大小是不固定的,但是Redis一个键值对最大大小为512M(String 类型Value)同时通过Redis Sentinel(哨兵)提供高可用,通过Redis Cluster(集群)提供自动分区。

分条整理

具备持久化功能的内存型NoSQL数据库

  1. 持久化:永久存储到硬盘

  2. 内存型:启动了Redis,所有操作都再内存上进行操作

    优点:读写速率高

  3. NoSQL

    • 不用写SQL的数据库
    • Not Only SQL,不仅仅只有关系型数据库

    最开始的目的:代替关系型数据库

    最终效果:关系型数据库和NoSQL数据库并存,相互补充

  4. Redis存储数据的格式:Key:Value

    可以将Redis理解为一个Map,只是这个Map数据具有持久化能力

    数据存储原理:

    • 存数据:
      1. 对key进行Hash算法(Crc16算法),得到一个数字
      2. 对数字与16384取余,得到数字(称为:槽slot,一个槽只是一个逻辑单位,里面可以存储任意多个键值对)
      3. 存储到对应的槽中
    • 取数据:
      1. 对key进行Hash算法(Crc16算法),得到一个数字
      2. 对数字与16384取余,得到数字
      3. 去对应的槽中取键值对
  5. Redis是绝大多数NoSQL数据库支持集群

    集群:多款相同的软件,共同维护一组数据

    集群可以解决关系型数据库,单机瓶颈

    情况一:安装多个Redis,每个Redis中存储一部分数据

  6. 16384:是Redis最大支持的槽数量,最小存储单元

    Redis集群,平分这些槽。

    若不能被整除,那么其中一个或两个Redis多一个槽

    理论上限:Redis集群中,最多支持16384个Redis

  7. redis中一个key-value最大大小为512MB

  8. redis是线程安全的

    在redis5之前是一个单线程软件

    在redis6后,支持多客户端操作,但是最终执行命令时,还是单线程执行。

基于Docker安装单机版redis

安装redis的方式也是有多种,这里只演示docker安装redis

  • 拉取镜像

    docker pull redis:6.2.6
  • 创建并启动容器

    docker run -d --name redis -p 6379:6379 --restart always redis:6.2.6 --requirepass "password"
    • redis的默认端口号:6379

    • 开机自启、错误重启、自启

      --restart always

      表示启动Docker时自动启动此容器。

    • 查看容器

      docker ps
      docker ps -a
      # 或者
      docker container ls
      docker container ls -a
  • 查看容器是否正常启动

    docker logs -f containerName
  • 客户端测试

    连接到容器:

    docker exec -it redis bash

    进入容器后。在任意目录在输入redis-cli 即可进入redis命令行

    也可以直接进入redis客户端工具:

    docker exec -it redis redis-cli

redis可视化软件推荐

基本命令

最基本的命令

  • 客户端连接服务器的命令

    redis-cli
  • 退出客户端命令行

    exit

知识补充:

关于docker exec -it redis bash中的bash,这是PATH中可以直接访问到的

我们可以使用下面命令来查看PATH的取值路径

echo $PATH

我这里的结果为:

/software/java/jdk/jdk-17.0.7/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

因为我配置过其它的环境变量,所以可能比大家的多出了几个路径

然后让我们查看路径下可用的命令

ls /usr/bin

然后,我们就看到了bash这个命令

所以我们也可以用下面这个命令来直接进入redis容器的redis-cli

docker exec -it redis redis-cli

redis-cli命令参数

  • 查看帮助

    redis-cli --help

    Linux中的大部分命令想要查看帮助都可以使用–help参数来查看

  • 比较全面的连接方式(然而并没有什么软用,还不如直接使用redis-cli)

    redis-cli -h localhost -p 6379
  • 常用参数列表:

    • -h redis服务器主机地址 默认127.0.0.1
    • -p redis服务器端口号 默认6379

测试redis服务器是否有效

下述所有命令,基于连接redis服务器后

  • ping命令

    ping [message]

    此为ping命令,没有任何参数,服务器返回PONG

    (吐槽一句,发明这个命令的人是中国人吗?总让我联想到乒乓球)

    ping命令可以提供任意字符串参数,输入参数是什么,服务器返回同样的字符串

    如果字符串中包含空格,需要使用双引号标记开始和结束

    示例如下:

    127.0.0.1:6379> ping
    PONG
    127.0.0.1:6379> ping aaa
    "aaa"
    127.0.0.1:6379> ping "hello world"
    "hello world"
  • echo回声命令,任意字符串参数,输入什么,服务器返回什么

    详细用法见上根ping的一样

    echo [message]

    不过林风测试后发现echo后面必须有参数,不然报错:

    127.0.0.1:6379> echo
    (error) ERR wrong number of arguments for 'echo' command
    127.0.0.1:6379> echo aaa
    "aaa"
    127.0.0.1:6379> echo "hello world"
    "hello world"

数据类型

redis是一个nosql数据库,是一个key-value数据库。只能保存键值对。

其中key只可以是字符串数据。redis底层存储数据到硬盘时,存储的是字节数组。

key字符串中可以包含空格,如果包含空格,key必须使用双引号来标记开始和结束。

value 的数据类型比较多。一般问redis可以保存什么类型的数据,都是问value的类型。

value的常用类型包括;

  • 字符串
  • hash
  • list(列表)
  • set(集合)
  • zset(有序集合)
  • stream(流)

所有的数据类型,键值对累计最大容量512M。

redis中的所有数据的读写访问命令,是针对不同类型的value或key提供的。

客户端管理命令

key管理命令

不考虑value类型的命令。

查看key

  • 基本用法

    keys [表达式]
  • 作用

    keys命令,返回和表达式匹配的所有key列表。没有键值对,显示为空即可

  • 参数

    表达式:

    • 表达式可包含*,代表0~n个字符

      例如:

      keys *

删除键值对

字符串管理命令

value是字符串类型

set保存键值对

redis中没有新增和更新区别。保存时:

  • key不存在,新增
  • key存在,覆盖value
  • 基本用法

    set key value
  • 作用

    新增或更新数据

  • 注意

    key和value中包含空格,使用双引号标记开始和结束

根据key查看value

  • 基本用法

    get key
  • 作用

    可以根据key来查看value的值

  • 注意

    若key不存在,则返回nil

    c中的nil类似于Java中的null

未完待续。。。。


文章作者: 林风
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 林风 !
  目录