【Redis】Nosql引入、Redis的数据类型和常用指令

Redis

内容管理


Redis数据库的简单介绍


昨天分享的是程序语言的基础知识,其中唯一需要记忆的就是高级程序语言编译的六大步骤,还有就是会将前缀、后缀、中缀码进行转换;这里我也要像流水线一样了,parallel进行,redis作为noSQL中最热门的数据库,当然也是必须要掌握的,MySQL后面也会深入分析一下【之前的数据库部分过于迅速的过了,数据库的设计远远不只是这么一点内容

【最近同时在进行很多事,Redis内容和Review的内容其实有交叉,但是博主决定将其放在两个不同的专栏中,Redis作为数据库,还是放在数据库的专栏中】

NoSQL

到现在为止,接触的技术栈已经很多了,比如

  • 解决功能性的问题【实现功能的基础】 : java 、Jsp、Tomcat、HTML、linux(这个后面会给大家分享一下,博主在开专栏之前就学过了)、JDBC
  • 解决扩展性问题: SSM、SpringBoot等框架,还有Vue等前端框架

依靠上面的技术,已经可以实现一个满足功能的web应用了,springboot+ vue开发一个web程序绰绰有余,但是问题来了 ---- 性能如何提升

之前的Dubbo+ zookeeper可以负载均衡,避免单一垂直架构带来的高访问量问题,那么还有其他的性能优化吗?

  • 解决性能的问题: NoSQL、java线程、hadoop、Nginx、MQ中间件

最开始的web应用就是单一架构,当后面互联网发展之后,访问量剧烈增加【高访问量】,给单台服务器带来了极大的压力(cpu和内存压力 ---- 之前说过cpu是核心,集数据运算和程序控制于一生),并且操作数据库也会带来巨大的IO压力

现代互联网应用特点

随着互联网的发展,现在的互联网应用的情况

1、 高访问量 【访问量大】

2、高并发 【同时做一件事情,比如秒杀】

3、高可用 【持续正常工作,就是之前类似计算机可靠性,当数据库宕,快速修复】

4、海量数据 【访问量大,产生了许多的数据】

RDBMS弊端

无法应对高并发 【磁盘IO瓶颈】

关系型数据库是IO密集的应用,也就是经常需要进行磁盘IO,会将数据及时存储到硬盘中持久化,但是Connect是重量级的,非常消耗时间,所以对于每秒上万次的读写请求,无法集中处理大量的高并发操作。

数据存储有限,横向扩展弱

关系型数据库的基本单位就是表,表中存储的记录数量有限,扩展能力弱,一张表最大二百多列,纵向的数据可承受能力有限,并且表的数据达到百万级别,读写速度下降,因为搜索需要时间, 对于海量的数据,必须使用主从复制,分库分表-----分表就需要考虑很多因素,难维护

硬件要求高

一般关系型数据库对于硬件设备要求较高,软件和硬件的成本花费大,并且大多数软件都是收费的。关系型数据库磁盘IO密集,如果磁盘的性能不好,那么数据库的使用体验就不好

不易提高性能【解决单一架构】

无法简单通过增加硬件、服务结点来提高系统的性能,数据整个都存储在一个数据库,对于多个服务器【分布式集群】,没有很好的解决办法复制数据

单一架构解决方案

既然单体架构存在的问题就是单台的服务器的CPU和内存的压力过大,那么就使用分布式架构负载均衡,使用nginx进行代理【vue和后端解决跨域问题,可以转发请求】,那么就可以使用服务器集群来操作

查看源图像

这样子操作单台服务器的压力就降低了许多

这里就产生了新的问题:

比如session共享问题: 最开始登录的时候nginx将请求转发到第一台服务器;这个时候该服务器就产生了session存放用户的相关信息,但是用户第二次登录可能分配到其他的服务器上,但是其他服务器一般没有该session,那么登录失败,如何解决?

  • 使用Cookie,这个很常用,就是发送一个sessionID,存储到客户端,每次访问都携带在请求头中,但是这种方式的问题 ----- 不安全
  • session复制 ---- 当用户访问的时候产生Session,同时将Session对象复制到其他的服务器中 ----- 【那就存在了大量的重复数据,空间浪费】
  • 存在文件服务器或者数据库中 ------ 这里每次访问都要访问数据库或文件(访问需要占用资源,会存在IO效率的问题)
  • 使用缓存式数据库【NoSQL】 ----- 之前分享存储系统的分级时,主存(内存)的速度比持久化存储要快的多,所以将session放在缓存中,最方便;redis将数据直接放在内存中,不会进行IO操作

解决IO压力: 减少IO操作
在这里插入图片描述

为了提高数据库的效率,可以将频繁使用的数据放在缓存数据库中,这样就不需要水平垂直切分来破环业务逻辑性

NoSQL的特点

RDBMS一业务逻辑为基础进行存储,磁盘IO密集,相比之下,因为互联网的发展,所以NoSQL也就出现解决高并发和高性能,高访问量等问题

大数据量,高性能

NoSQL数据库都具有很高的读写性能,大数据量下也表现出极大的优势,主要就是因为Nosql的无关系性,数据库的结构见到那。传统的RDBMS中,使用的查询缓存,但是更新数据后就失效了,需要重新进行IO,频繁读写的应用那么就会出现问题,而NoSQL最强大的就是缓存功能

数据模型灵活,没有Relation

Nosql是非关系型数据库,所谓关系就是数据之间的联系等【后面会在review中重点】,NoSQL不需要为数据建立字段,随时可以存储自定义的数据格式,对于关系型数据库,大数据量的表增删改字段就是emo ---- 所以这对于表设计提出了很大的挑战。但是市场变化,用户需求不断变化呢

高可用

Nosql在不影响性能,久可以实现高可用的架构。能偶解决RDBMS的扩展性差的问题,节省开发成本

低成本

因为磁盘IO少,所以对于硬件的要求较低,并且大多数Nosql软件都是开源的

无关系导致冗余

因为数据之间是没有关系的,RBMS中的外键能够很好联系两张表,减少数据的冗余,但是NoSQL没有关系,那么存储就会冗余

无标准

RDBMS是遵守统一的SQL规范,但是NoSQL后来发展的,没有统一的NoSQL标准

无约束、索引

NoSQL不支持约束,所以数据可以存任何类型的,没有限制,同样,也没有索引的概念【RDBMS使用索引来增加搜索效率】

无事务

RDMS大多都是支持事务的,事务的出现就是为了解决一致性,保证业务的正常执行;但是Nosql不支持事务,不能实现ACID 【atomic consistency …】

数据类型少

RDBMS比如MySQL是有很多数据类型的,比如数值、日期、二进制、大对象(文本),但是NoSQL只有一种类型,就是文本类型

NoSQL就是将除了存储之外的功能都放弃了,以此来提升性能; 比如不支持事务,这样就不需要加🔒,效率高;同样,不支持约束、这样就不需要进行验证,不需要建立底层索引树

NoSQL和RDBMS结合使用,性能要求高的需求就使用NoSQL进行实现,而性能要求不是很高,并且需要保证安全的,就还是使用MySQL

Redis

Redis是基于KV结构的作为Cache使用的NoSQL数据库; 也就是Redis是非关系数据库,存储的是KV键值对,最核心的功能就是缓存Cache;也就是说Redis就是做缓存功能的,减轻数据库的查询压力【数据库操作大部分都是查询】

Redis – remote dictionary server 远程字典服务【一个map】,其中value的类型可以是字符串、哈希map、列表list、集合sets、有序集合sorted sets

在这里插入图片描述

可以看到,使用Redis后,获取数据先从Reids中寻找,没有找到再进行磁盘IO,并且会将数据放到Redis中进行缓存以便下次使用【利用的是局部性原理】 — 之前高速Cache提到过

需要注意的是,redis是安装在linux系统中的,可能有的partner还没用过Linux,这里可以简单提一点点知识让来保证redis的使用

这里提一下linux的命令和一些常识; linux是一套开源的操作系统

img

博主使用的就是debian家族的,但是后面改为redHat的CentOS了,但是主要的操作没有什么区别呢

到官网下载源文件Download | Redis

下载之后将压缩包上传到Linux中【使用Xftp即可】,这个上传的文件一共只有2.36M,只是源文件,不能够直接运行,需要编译之后才能运行

  • 解压压缩包: tar zxvf redis-6.2.6.tar.gz -C /usr/local/ 将器解压到usr下面的local中
  • 之后进入cd /usr/local —> ll —> cd src/ —> ls 就可以发现redis的众多.c的源文件,C语言编写的,那么要想运行Reids,必须要有GCC环境,这里就是用YUM进行安装即可
安装YUM,并且使用YUM安装GCC
RPM --- redhat  package manager,可以安装、更新、卸载软件,包的格式XXX-1.2.3-11.i386.rpm   软件、版本号、运行的硬件平台、扩展名rpm

查询软件 --- query all     ---->  npm -qa | grep firefox
卸载       npm -e firefox
安装软件 install verbose显示   hash进度条   npm -ivh firefox.xxx

Yum是一个再CentOs中的一个包管理器,基于RPM管理,可以自动处理依赖关系【Java的maven】,一次安装所有的依赖,不需要重复操作
yum就是更加方便的安装软件,比如yum -y install firefox 【这里的-y就是所有都回答yes】
可以重新配置YUM源为国内源
yum install wget  【安装wget,从指定的URL下载文件】
在/etc/yum.repos.d下面备份文件  cp CentOS-Base.repo  CentOS-Base.repo.backup
wget http://mirrors.aliyun.com/repo/Centos-7.repo   下载阿里云的镜像
替换默认的文件    mv  CentOs-7.repo 
将缓存数据换掉 : yum clean all     yum makecache
然后就可以使用yum安装GCC
  • yum -y install gcc 安装GCC

  • 编译Redis文案金,【使用GCC编译器】 cd /usr/local/redis-3.2.9 [cd …] 执行make命令

  • make install  相当于把redis的相关命令放在环境变量中,这样就不用进入redis目录来使用命令

启动Redis 加上&

这里可以直接在src目录下,直接运行./…server即可,这种方式为前台启动,因为这里启动之后不能执行其他的命令,两次CTR+C之后就会退出应用

bin  etc  games  include  lib  lib64  libexec  redis-6.2.6  sbin  share  src
[root@localhost local]# cd redis-6.2.6/src/
[root@localhost src]# ./redis-server 
8496:C 25 Apr 2022 21:45:24.710 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
8496:C 25 Apr 2022 21:45:24.710 # Redis version=6.2.6, bits=64, commit=00000000, modified=0, pid=8496, just started
8496:C 25 Apr 2022 21:45:24.710 # Warning: no config file specified, using the default config. In order to specify a config file use ./redis-server /path/to/redis.conf
8496:M 25 Apr 2022 21:45:24.711 * Increased maximum number of open files to 10032 (it was originally set to 1024).
8496:M 25 Apr 2022 21:45:24.711 * monotonic clock: POSIX clock_gettime
                _._                                                  
           _.-``__ ''-._                                             
      _.-``    `.  `_.  ''-._           Redis 6.2.6 (00000000/0) 64 bit
  .-`` .-```.  ```\/    _.,_ ''-._                                  
 (    '      ,       .-`  | `,    )     Running in standalone mode
 |`-._`-...-` __...-.``-._|'` _.-'|     Port: 6379
 |    `-._   `._    /     _.-'    |     PID: 8496
  `-._    `-._  `-./  _.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |           https://redis.io       
  `-._    `-._`-.__.-'_.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |                                  
  `-._    `-._`-.__.-'_.-'    _.-'                                   
      `-._    `-.__.-'    _.-'                                       
          `-._        _.-'                                           
              `-.__.-'                                               

8496:M 25 Apr 2022 21:45:24.711 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
8496:M 25 Apr 2022 21:45:24.711 # Server initialized
8496:M 25 Apr 2022 21:45:24.711 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
8496:M 25 Apr 2022 21:45:24.712 * Loading RDB produced by version 6.2.6
8496:M 25 Apr 2022 21:45:24.712 * RDB age 65 seconds
8496:M 25 Apr 2022 21:45:24.712 * RDB memory usage when created 0.77 Mb
8496:M 25 Apr 2022 21:45:24.712 # Done loading RDB, keys loaded: 0, keys expired: 0.
8496:M 25 Apr 2022 21:45:24.712 * DB loaded from disk: 0.000 seconds
8496:M 25 Apr 2022 21:45:24.712 * Ready to accept connections
^C8496:signal-handler (1650894326) Received SIGINT scheduling shutdown...
8496:M 25 Apr 2022 21:45:26.724 # User requested shutdown...
8496:M 25 Apr 2022 21:45:26.724 * Saving the final RDB snapshot before exiting.
8496:M 25 Apr 2022 21:45:26.726 * DB saved on disk
8496:M 25 Apr 2022 21:45:26.726 # Redis is now ready to exit, bye bye...

这里是前台启动,窗口关闭Redis就关闭了,要想不关闭,那么就需要后台启动,启动的时候加上==&==即可

[root@localhost src]# ./redis-server &
[1] 8529
8529:C 25 Apr 2022 21:48:00.562 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
8529:C 25 Apr 2022 21:48:00.562 # Redis version=6.2.6, bits=64, commit=00000000, modified=0, pid=8529, just started
8529:C 25 Apr 2022 21:48:00.562 # Warning: no config file specified, using the default config. In order to specify a config file use ./redis-server /path/to/redis.conf
8529:M 25 Apr 2022 21:48:00.562 * Increased maximum number of open files to 10032 (it was originally set to 1024).
8529:M 25 Apr 2022 21:48:00.562 * monotonic clock: POSIX clock_gettime
                _._                                                  
           _.-``__ ''-._                                             
      _.-``    `.  `_.  ''-._           Redis 6.2.6 (00000000/0) 64 bit
  .-`` .-```.  ```\/    _.,_ ''-._                                  
 (    '      ,       .-`  | `,    )     Running in standalone mode
 |`-._`-...-` __...-.``-._|'` _.-'|     Port: 6379
 |    `-._   `._    /     _.-'    |     PID: 8529
  `-._    `-._  `-./  _.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |           https://redis.io       
  `-._    `-._`-.__.-'_.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |                                  
  `-._    `-._`-.__.-'_.-'    _.-'                                   
      `-._    `-.__.-'    _.-'                                       
          `-._        _.-'                                           
              `-.__.-'                                               

8529:M 25 Apr 2022 21:48:00.563 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
8529:M 25 Apr 2022 21:48:00.563 # Server initialized
8529:M 25 Apr 2022 21:48:00.563 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
8529:M 25 Apr 2022 21:48:00.563 * Loading RDB produced by version 6.2.6
8529:M 25 Apr 2022 21:48:00.563 * RDB age 154 seconds
8529:M 25 Apr 2022 21:48:00.563 * RDB memory usage when created 0.77 Mb
8529:M 25 Apr 2022 21:48:00.563 # Done loading RDB, keys loaded: 0, keys expired: 0.
[root@localhost src]# 8529:M 25 Apr 2022 21:48:00.563 * DB loaded from disk: 0.000 seconds
8529:M 25 Apr 2022 21:48:00.563 * Ready to accept connections
^C
[root@localhost src]# ps -ef | grep redis
root       8529   2708  0 21:48 pts/0    00:00:00 ./redis-server *:6379
root       8793   2708  0 21:48 pts/0    00:00:00 grep --color=auto redis

这里使用ps -ef查看进程redis,发现还在后台启动,没有关闭

  • 上面启动的是服务端server,下面就是启动客户端cli,还是直接运行./cli即可[可执行文件]
[root@localhost src]# ./redis-cli 
127.0.0.1:6379> set usr  CFENG  
OK
127.0.0.1:6379> get usr
"CFENG"

关闭redis server

打开Redis服务器使用两种方式,一种是前台启动的./redis-server,另外一种就是后台启动的加上&,而服务端的关闭也有两种方式,一种安全,一种强制的不安全

使用客户端关闭 ./redis-cli shutdown

这种方式关闭是安全的方式,因为首先就是先拒绝接收新的指令,并且会先执行完毕现在已有数据操作,然后再关闭

[root@localhost src]# ps -ef | grep redis
root       2952   2837  0 13:58 pts/0    00:00:01 ./redis-server *:6379
root       3552   2837  0 14:07 pts/0    00:00:00 grep --color=auto redis
[root@localhost src]# ./redis-cli shutdown
2952:M 26 Apr 2022 14:08:04.626 # User requested shutdown...
2952:M 26 Apr 2022 14:08:04.626 * Saving the final RDB snapshot before exiting.
2952:M 26 Apr 2022 14:08:04.627 * DB saved on disk
2952:M 26 Apr 2022 14:08:04.627 # Redis is now ready to exit, bye bye...
[1]+  完成                  ./redis-server
[root@localhost src]# ps -ef | grep redis
root       3567   2837  0 14:08 pts/0    00:00:00 grep --color=auto redis

可以看到shtdown指令成功关闭了Reids服务端,如果上面进行了比如set操作,那么会先执行该指令之后,成功完成操作,才会关闭server, 当然除了在开启客户端的同时发出shutdown指令之外,还可以在进入客户端之后再执行shutdown指令

kill [-9] pid

这个命令是强制杀死进程,不会考虑当前应用是否正在执行其他的操作,直接就会关闭应用

这里就是先使用ps -ef | grep redis找到redis的进程,然后kill PId即可

^C
[root@localhost src]# ps -ef | grep redis
root       3628   2837  0 14:11 pts/0    00:00:00 ./redis-server *:6379
root       3646   2837  0 14:11 pts/0    00:00:00 grep --color=auto redis
[root@localhost src]# kill -9 3628
[1]+  已杀死               ./redis-server
[root@localhost src]# ps -ef | grep redis
root       3660   2837  0 14:12 pts/0    00:00:00 grep --color=auto redis

Redis 客户端

redis的服务端就是redis-server,而客户端有多种方式,当然最常用的还是命令行的客户端cli

redis 命令行客户端

redis-cli redis command Line Interface 就是命令行客户端,可以使用客户端与服务端进行交互,可以用来执行redis的各种指令,连接客户端有两种常用的方式

  • 直接连接Redis 【默认ip就是127.0.0.1 端口就是6379】

    直接安装目录下面的src下面执行命令 ./redis-cli, 这个命令就是连接本机的6379端口

  • 指定IP和端口的连接 ./redis-cli -h 127.0.0.1 -p 6379

-h 就是主机的IP,可以指定任意的redis服务器, -p就是端口号,不同的端口表示不同的redis应用 【 mysql的执行命令 mysql -h locahost -u cfeng -p XXXX 也可指定主机】

redis 远程客户端

和mysql的workbench相同,redis也是有可视化界面的,Redis Desktop Manager ,就是可视化的客户端,C++编写响应迅速,性能很好,

https://redisdesktop.com/

但是远程方式想要访问redis服务端默认是拒绝的,因为默认情况下,redis服务端只有本机的才能访问,不能通过网络远程访问

  • 修改redis.conf文件
首先重要文件的修改,需要先进行备份   cp redis.conf bak_redis.conf
vim  redis.conf
    
1. 将bind ip 注释   ,不要绑定ip
2.  protected-mode yes  修改为no   这样才可以通过网络进行访问

conf文件很多行,所以需要先进行搜索,找到关键字,然后修改,/bind即可
    
[root@localhost redis-6.2.6]# ls
00-RELEASENOTES  BUGS     CONTRIBUTING  deps     Makefile   README.md   runtest          runtest-moduleapi  sentinel.conf  tests   utils
bak_redis.conf   CONDUCT  COPYING       INSTALL  MANIFESTO  redis.conf  runtest-cluster  runtest-sentinel   src            TLS.md
[root@localhost redis-6.2.6]# vim redis.conf 
  • 每次启动server的时候加载redis.conf
------#./redis-server ../redis.conf     
redis编程客户端

redis的java编程客户端,Reids官方推荐使用Jedis,这就是一个很小的java客户端,可以通过这个客户端来执行命令操作Redis客户端【其他的很多语言都有连接Redis的编程客户端】

Redis的基本操作命令

ping 查看server状态

这个指令和网络中的ping类似,都是查看状态,网络中就是查看的连接状态【这里就是查看的是server的状态】

如果redis返回的是PONG,那么redis服务是正常运行的

[root@localhost src]# ./redis-cli 
127.0.0.1:6379> ping
PONG

dbsize 查看当前数据库的key数目

使用dbsize可以直接返回当前数据库的key的数量【数字代表的就是数量】 ----- 默认访问的是第0个库

[root@localhost src]# ./redis-cli 
127.0.0.1:6379> dbsize
(integer) 1

redis默认使用16个库,编号从0到15,对数据库个数的修改,也要到redis.conf中进行修改,conf文件中就有一行为 databases 16 ---- 数据库初始的数量就是16个,默认使用的是0号数据库

select X 切换数据库

再Mysql中,使用的是USE XXX来切换的数据库,而再redis中,使用的是select X 来切换数据库

127.0.0.1:6379> select 1
OK
127.0.0.1:6379[1]> select 0
OK

flushdb 删除当前库的所有数据

这个命令比Mysql中的删除更快,直接flush就可以删除库中的所有的数据,但是其他的数据库中的数据不受影响

[root@localhost src]# ./redis-cli 
127.0.0.1:6379> select 1
OK
127.0.0.1:6379[1]> set stuname CFEGN
OK
127.0.0.1:6379[1]> set stuno 12
OK
127.0.0.1:6379[1]> set stuclass HC2001
OK
127.0.0.1:6379[1]> dbsize
(integer) 3
127.0.0.1:6379[1]> flushdb
OK
127.0.0.1:6379[1]> dbsize
(integer) 0
127.0.0.1:6379[1]> select 0
OK
127.0.0.1:6379> dbsize
(integer) 1

可以看到只是删除了当前数据库的数据,其他的库中的数据不受影响

exit/quit 退出当前客户端

虽然可以直接使用CTR + C退出客户端,但是redis也是提供了正常的退出客户端的操作,就是exit或者quit

[root@localhost src]# ./redis-cli 
127.0.0.1:6379> exit
[root@localhost src]# 

这个只是退出客户端,服务端还是在正常运行呢

redis是一个用作Cache的key-value的NoSQL,那么其指令就分别操作key或者value

Redis的key操作指令

在java中操作Map的key还是有很多方法,比如keySet、containsKey、get等方法,redis中也有很多指令来操作key

redis的数据放在Cache中,但是Redis为了保证数据安全,也有存储机制 ---- 定时将内存的数据存储到磁盘中进行持久化

[root@localhost src]# 3077:M 26 Apr 2022 16:52:24.063 * 1 changes in 3600 seconds. Saving...
3077:M 26 Apr 2022 16:52:24.064 * Background saving started by pid 3672
3672:C 26 Apr 2022 16:52:24.069 * DB saved on disk
3672:C 26 Apr 2022 16:52:24.070 * RDB: 2 MB of memory used by copy-on-write
3077:M 26 Apr 2022 16:52:24.165 * Background saving terminated with success

可以看到3672进程将数据进行save

keys XX 查找符合XX模式的key,XX可以使用通配符

这里就是查找出所有符合XX的key,类似于查找操作

  • *可以匹配0到多个字符,如果只使用,那么就会显示所有的key
  • ?可以匹配单个字符,比如 wo?d 就可以匹配到word 【之前的mysql中使用的like加上%来进行模糊查询】
[root@localhost src]# ./redis-cli
127.0.0.1:6379> set stuname Chuan
OK
127.0.0.1:6379> set stuno 89
OK
127.0.0.1:6379> set  stuclass HC2001
OK
127.0.0.1:6379> dbsize
(integer) 4
127.0.0.1:6379> keys *
1) "stuname"
2) "usr"
3) "stuclass"
4) "stuno"
127.0.0.1:6379> keys stu*
1) "stuname"
2) "stuclass"
3) "stuno"
127.0.0.1:6379> keys u?r
1) "usr"
127.0.0.1:6379> exit

redis还有联想机制,就是当使用key的时候会进行提示【低版本的redis是单线程的,所以少使用*进行匹配,因为会占用很多时间,单线程就和ES6类似了,就出现一个任务的队列,要一个一个执行完毕,会影响性能,但是高版本又称为多线程了,因为操作flushdb就可以选择syn 或者asyn等】

exists key1 key2 判断key是否存在

该命令可以判断key是否存在,返回的就是一个整数,当存在的时候返回1,不存在返回0,使用多个key,返回的就是key的数量【返回的都是key的数量】

返回的都是存在的数量,一个key就是返回1,多个 就是存在的数量【不知道那个key不存在】,key之间使用空格分隔

(integer) 4
127.0.0.1:6379> keys *
1) "stuclass"
2) "usr"
3) "stuname"
4) "stuno"
127.0.0.1:6379> exists stuclass usr
(integer) 2
127.0.0.1:6379> exists stucalss ust
(integer) 0

expire key seconds 设置key的生存时间

expire【到期】,expire设置的时间的单位为S,返回值为0或1,0代表设置失败,1代表设置成功

这样就可以不用手动清除key,可以设置存活时间,到期就自动删除

127.0.0.1:6379> expire usr 10
(integer) 1

ttl key 返回key剩余的生存时间

ttl time to live 生存的时间,返回的就是-1,-2或者数字

  • -1 代表没有设置生存时间,永不过期
  • -2 key不存在
  • 其他的数字 代表key剩余的存活时间

time to live 就是针对的上面的expire设置的生命周期

[root@localhost src]# ./redis-cli 
127.0.0.1:6379> dbsize
(integer) 4
127.0.0.1:6379> keys us?
1) "usr"
127.0.0.1:6379> exists CFENG
(integer) 0
127.0.0.1:6379> expire usr 10
(integer) 1
127.0.0.1:6379> ttl usr
(integer) 4
127.0.0.1:6379> ttr usr
(error) ERR unknown command `ttr`, with args beginning with: `usr`, 
127.0.0.1:6379> ttl ust
(integer) -2
127.0.0.1:6379> ttl usr
(integer) -2
127.0.0.1:6379> exists usr
(integer) 0
127.0.0.1:6379> exit

可以发现10s之后就自动删除了usr这个数据

可以用expire和ttl设计验证码功能

不使用redis,那么要使用验证码,就是创建验证码之后存入数据库,这个时候包含其创建时间;
用户输入之后,会和数据库中的验证码进行比较,同时比较时间差,如果大于X,那么验证码失效了;  ---> 这样子操作进行了数据库的访问,会占用数据库的内存,同时效率低,性能不好

使用redis就可可以解决
创建验证码之后,放入redis数据库,【缓存】, 放入的时候就执行expire命令设置存活时间为X;
用户输入后,使用ttl 用户验证码,   如果这个值>0,说明没有过期,验证成功;  如果< 0 ,那么就是-2,说明验证码失效了

type key 查看key所存储的数据类型

redis中的数据类型还是有几种,这个命令的返回值就是字符串表示数据类型

  • none key不存在
  • string 字符串
  • list 列表
  • set 集合
  • zset 有序集合
  • hash 哈希表
(integer) 3
127.0.0.1:6379> keys *
1) "stuclass"
2) "stuname"
3) "stuno"
127.0.0.1:6379> type stuclass
string
127.0.0.1:6379> del stuno
(integer) 1
127.0.0.1:6379> exists stuno
(integer) 0
127.0.0.1:6379> dbsize
(integer) 2
127.0.0.1:6379> quit

这里存储的时候就没有进行指定,所以存储的数据类型就是string

del key 删除key

之前的flushdb是一次性删除当前数据库下面的所有的数据,想要删除一条数据,使用del命令;该命令的返回值为1或者0,1代表删除成功,0代表删除失败【当key不存在当然就会删除失败了】

127.0.0.1:6379> del stuno
(integer) 1

redis的数据类型

redis上面已经提到过,数据类型很少,一般都是string,还有hash,list等

string字符串类型

字符串类型是Redis中最基本的数据类型,它能够存储任何形式的字符串,包括二进制的数据,序列化后的数据,JSON化的数据,或者一张图片【stirng格式】,最大的内存限制【512M】

key       value
usr       你猜我是谁,你说我是谁我就是谁

hash 哈希类型 映射表

Redis hash 是一个string类型的filed和value的映射表,hash特别适合用于存储对象 【key -value】大map中的小map

key                                     value
logusr    								field      value
										userName    zs
										times        5
										region      Peking

可以看到存放的就是一个对象类型的,类似于Map<String,Map<String,String>> , 就一个嵌套

可以用这个hash来处理上面的session的分布式的问题

对于单一架构,登录可以使用session来解决,但是分布式架构中,有多台服务器,那么其他的服务器中没有session的,如果都复制那么就冗余了
解决的办法就是session共享; 单独使用一台服务器使用redis做存储,hash存储session,每次访问的时候就先从该服务器中获取session实现共享

list 列表类型

Redis列表是简单的字符串列表,按照插入顺序排序【和java的list列表是相同的,就是有序可重复 的(插入的顺序)】,但是添加的时候可以选择添加在左边或者右边

key       value
region     Peking Peking NeYork MAyanmar

set 集合类型

Redis的Set和java中的Set也是相同的,就是无序不可重复

key           value
framework      spring springMVC springBoot spirngCloud springSecurity

有序集合zet(sorted set)

Redis有序集合zset也是string类型元素的集合,不允许出现重复,但是zsethi给每一个元素关联一个分数【分数可以重复,通过分数来进行从小到大排序】

key    value  score
usr    zs      100
       ls      102

Redis数据类型操作命令

redis中对于不同类型的数据类型的操作命令是不相同的

String类型的操作命令

string作为redis中最基本的数据类型,其命令是需要熟练运用的

set (key value) 将字符串值设置给key

这个命令就类似java的map的操作put,设置数据,string的最大数据量为512M,所以可以任意设置

[root@localhost src]# ./redis-cli
127.0.0.1:6379> set weight 55kg
OK
127.0.0.1:6379> set height 169cm
OK
127.0.0.1:6379> keys *ight
1) "weight"
2) "height"

在redis中,所有的key都是文本类型的, 唯一的key,创建一个唯一的数据; 和java的map类似,当重新写入相同的key的数据,新的value会覆盖原来的vlaue

get key 获取key的value

获取key设置的字符串值,这个上面演示过很多次,就不演示了

如果key不存在,则返回的就是nil,等同于java的null

incr/decr key 将key的数字值++/–, 不存在创建0

该操作是原子性的,也就是同步的,安全的,当incr操作的时候,多线程环境下,其他的线程会等待,不会影响最终的结果【比如这里就可以进行当作一个计数器,不会受其他的线程影响】

【increase Mysql中有atuoincrement】incr 就是将key存储的数字值增加1,如果key不存在,就会创建该key,将value初始化为0【这些都是string类型的数字】,然后增加1;返回值就是+1之后的结果

对于非数字类型string,操作时不行的,会报错

1) "weight"
2) "height"
3) "stuclass"
4) "stuname"
127.0.0.1:6379> incr count 
(integer) 1
127.0.0.1:6379> incr count
(integer) 2
127.0.0.1:6379> incr count
(integer) 3
127.0.0.1:6379> decr count
(integer) 2
127.0.0.1:6379> decr count
(integer) 1
127.0.0.1:6379> decr stuname
(error) ERR value is not an integer or out of range

可以看到这个功能可以完美适应计数器

append key value 将value追加到key的stirng后面

如果key存在,那么会将vlaue追加到key后面;如果key不存在,那么创建一个key 值为value ,等同于set key value

  • 返回值代表的是执行后key的value的长度
//类似linux中的>>
127.0.0.1:6379> get height
"169cm"
127.0.0.1:6379> append height --1m
(integer) 9
127.0.0.1:6379> get height
"169cm--1m"

strlen key 返回key存储的string的长度

这个久类似于之前的jav的length()方法,和C中相同;这里的strlen返回的就是key的value的长度

  • 如果key不存在,返回的就是0,对于中文,还是按照字符个数计算的
127.0.0.1:6379> dbsize
(integer) 5
127.0.0.1:6379> keys *
1) "count"
2) "stuname"
3) "height"
4) "stuclass"
5) "weight"
127.0.0.1:6379> incr count
(integer) 2
127.0.0.1:6379> decr count
(integer) 1
127.0.0.1:6379> strlen height
(integer) 9
127.0.0.1:6379> exit

getrange key start end [ ,] 取字串

这个命令可以将key所对应的字符串的从start到end的数据给取出来,类似substr,类似copyOfRange,这里左右两端闭区间,copy是[)

返回值就是返回的字符串【可以从左向右就是0开始,从右向左就是-1开始,-1,-2,-3…】

  • 取出整个字符串就是0 -1 即可
127.0.0.1:6379> get height
"169cm--1m"
127.0.0.1:6379> getrange height 0 2
"169"

setrange key offset value 用vlalue替换key的offset开始的字符串

这里就是替换操作,从offset开始后面的字符串替换,返回值就是修改后的字符串

如果不存在,key当作空白字符串处理,类似java的replace操作

这里只是取代从offset开始后的和其等长的字符串

127.0.0.1:6379> setrange height -2 2m
(error) ERR offset is out of range
127.0.0.1:6379> setrange height 5 2m
(integer) 9
127.0.0.1:6379> get height
"169cm2m1m"

mset k1 v1 k2 v2 … 一次创建多个key

set命令只能一次创建一个记录,对于多个key,可以是使用mset进行设置,返回值就是OK; 类似于Mysql的INSET VALUES (多组数据)

127.0.0.1:6379> mset name xiaohuan age 22 shcool PUD
OK

mget k1 k2 … 一次获取多个key,和mset类似

如果不存在,那么返回值就是nil;返回的就是value的列表,是一一对应的

127.0.0.1:6379> mget name age shcool
1) "xiaohuan"
2) "22"
3) "PUD"

Hash

redis hash 是一个string类型的field和value的映射表,hash特别适合用来存储对象,对于hash也有很多基本的指令来进行操作

hset hash表key field value 加入一个hash记录

作为一个map,插入记录,还是使用的指令set,只是string最基本类型直接使用set,这里的hash使用的是hset,将hash表key的域field的值设置为value,如果key不存在,新建hash表; 存在就是覆盖

  • 返回值,如果表field不存在,设置成功,返回1
  • 如果表的field存在,就覆盖新值,返回0

所以插入的时候就是插入的key对应的那张map,返回值就是map对应的field的情况

[root@localhost src]# ./redis-cli
127.0.0.1:6379> select 1
OK
127.0.0.1:6379[1]> hset website baidu www.baidu.com 
(integer) 1
127.0.0.1:6379[1]> hset website firefox www.firefox.com
(integer) 1
127.0.0.1:6379[1]> hexists website baidu
(integer) 1

hget key field 获取hash表中某个field值

返回值就是field域的值,如果key不存在或者filed不存在,都会返回nil

127.0.0.1:6379[1]> hget website baidu
"www.baidu.com"

hmset key field XX field2 XX 向hash的key中的map加入多个记录

同时将field-value设置到hash表key中,这个命令会覆盖已经存在的field,hash表的key不存在,那么就会创造一个新的空hash表,执行hmset

  • 如果设置成功,返回Ok,如果失败,就返回error

注意和string的mset区别,这里是在同一个key的hash表中取出多个记录,mset是设置多个key

127.0.0.1:6379[1]> hmset website taobao www.taobao.com cfeng www.cfeng.com
OK

hmget key field1 field2… 获取一张表中的field

这个命令会获取hash表key中的一个或者多个给定域的值, 返回值返回和field顺序对应的值,如果field不存在,那么就会返回nil

127.0.0.1:6379[1]> hmget website taobao baidu cfegn
1) "www.taobao.com"
2) "www.baidu.com"
3) (nil)

hgetall 返回表中的所有的filed域以及value

该命令就会获取hash表key中所有的域和值

返回值就是以列表形式返回hash中的所有的域和值,key不存在,就返回空的hash

上面的get只是获取的值,没有获取域

127.0.0.1:6379[1]> hgetall website
1) "baidu"
2) "www.baidu.com"
3) "firefox"
4) "www.firefox.com"

hdel key field field … 删除一张表中的filed

删除hash表中一个或多个指定的field,不存在field就会直接忽略,返回值就是成功删除field的数量,而之前通用的key就是只能一次删除一个key【这里只是删除的一个key中的一个或者多个field,key还是存在】

(integer) 0
127.0.0.1:6379> hdel website taobao
(integer) 0
127.0.0.1:6379> hkeys website
(empty array)
127.0.0.1:6379> select 1
OK
127.0.0.1:6379[1]> hdel website taobao cfeng
(integer) 2
127.0.0.1:6379[1]> hkeys website
1) "baidu"
2) "firefox"

之前进入的是数据库0,删除失败的,因为没有数据

hkeys key 查看表中所有的field域

查看哈希表key中的所有的field域,返回值就是包含所有的field的泪飙,key不存在就会返回空的列表,至于和山脉的hgeall的区别,不会返回value

127.0.0.1:6379[1]> hkeys website
1) "baidu"
2) "firefox"

hvals key 查看表中所有的value

查看hash表中所有的value,所以hgetall就是hkeys 和hvals的组合,返回值就是查询的列表

127.0.0.1:6379[1]> hvals website
1) "www.baidu.com"
2) "www.firefox.com"

hexists key field 查看key表中是否存在field

查看查看哈希表key中,给定域的field是否存在,如果存在,那么返回1,不存在就返回0

127.0.0.1:6379[1]> hexists website cfeng
(integer) 1

可以看到起始hash的操作和上面的string的操作异曲同工,主要就是要经常使用命令,如果经常使用自然就记住了

list 列表

redis列表时简单的字符串列表,强调的按照插入顺序排序,但是可以添加元素到列表头部或者尾部,这里的理解就可以当作一个单链表来操作

lpush/lpop key [value] 向key中插入多个值/删除 头插法

这里就是从链表的左边,也就是头部进行插入和删除操作,类似于头插法,所以结果是逆序的,将一个或者多个值插入到key的表头,返回值就是数字,表示列表的长度

pop操作时lpop key count —> 从左边头部开始删除几个元素【返回值就是删除的元素的列表,如果不存在,返回的就是空nil

rpush/rpop key [value] 向key列表中尾插多个值/删除

这里就类似于之前的尾插法,插入的顺序和输入的顺序一致,同时返回值也是数字,和上面的相同

lrange key start stop 获取指定位置的元素

返回值就是指定区间的列表,这里计数的方式和之前的String类似,都是从左边开始0,右边开始-1

lindex key index 返回指定位置元素

和java中的列表的get(index)类似,就是返回指定位置的元素,如果index不在列表中,返回值为nil;同时-1从右边,0从左边

llen key 获取key列表的长度

这里的返回值就是表示列表的长度,如果可以不存在就返回0

lrem key count value 删除值为value的count个元素

这里删除列表中和value值相等的元素,删除的元素的个数和count值有关系

  • 当count > 0, 从列表的左侧开始删除,当count< 0时,就从列表的右侧开始移除
  • 当count = 0,时删除里欸博爱中所有的和value相等的元素

lset key index value 替换,将index位置的元素进行替换为vlaue

将列表key下标为index的元素的值设置为value,返回值就是如果设置成功要求返回ok,如果key不存在或者index超出范围返回错误信息

linsert key [before/after] pivot value 在参考的pivot值前面/后插入vlaue

这里就是将值value插入列表key当中位于值pivot之前或者之后的位置。key不存在,pivot不在列表中,不执行任何操作

返回值就是如果操作命令执行成功,那么就返回新列表的长度,如果没有找到pivot,那么返回-1,如果key不存在,那么返回0

127.0.0.1:6379[1]> select 2
OK
127.0.0.1:6379[2]> dbsize
(integer) 0
127.0.0.1:6379[2]> lpush animal bee ant fly butterfly
(integer) 4
127.0.0.1:6379[2]> lrange aniaml 0 -1
(empty array)
127.0.0.1:6379[2]> lrange animal 0 -1
1) "butterfly"
2) "fly"
3) "ant"
4) "bee"
127.0.0.1:6379[2]> lpop aniamal 3
(nil)
127.0.0.1:6379[2]> lpop animal 3
1) "butterfly"
2) "fly"
3) "ant"
127.0.0.1:6379[2]> lrange animal 0 -1
1) "bee"
127.0.0.1:6379[2]> rpush animal dog cat hen duck pig 
(integer) 6
127.0.0.1:6379[2]> lindex aniaml 0
(nil)
127.0.0.1:6379[2]> lindex animal 0
"bee"
127.0.0.1:6379[2]> llen animal
(integer) 6
127.0.0.1:6379[2]> lrem animal 1 dog
(integer) 1
127.0.0.1:6379[2]> lrange animal 0 -1
1) "bee"
2) "cat"
3) "hen"
4) "duck"
5) "pig"
127.0.0.1:6379[2]> lset animal 0 beef
OK
127.0.0.1:6379[2]> linsert aniaml before cat catMother
(integer) 0
127.0.0.1:6379[2]> lrange animal 0 -1
1) "beef"
2) "cat"
3) "hen"
4) "duck"
5) "pig"
127.0.0.1:6379[2]> linsert animal before cat catMother
(integer) 6
127.0.0.1:6379[2]> lrange animal 0 -1
1) "beef"
2) "catMother"
3) "cat"
4) "hen"
5) "duck"
6) "pig"
127.0.0.1:6379[2]> exit

无序集合set

redis的Set就是string类型的无序集合,集合成员是唯一的,【如果相同,那么就会进行忽略】,集合中不能出现重复的元素

sadd key member … 向集合中加入元素

这里就是将一个或者多个member元素加入集合key中,存在于集合的member元素将会被忽略,不会再加入, 返回值将被忽略,不会再加入

smembers key 获取key集合中的所有的元素

这里和之前的普通的string类型的keys类似,之前的因为hash表hkeys、hvals、hgetall等也是,还有后面的列表就是lrange 0 -1 获取所有的元素

这里返回的就是所有的集合的列表,如果不存在那么就视为空,就是返回empty

sismemeber key member 查看member是否在集合中

这个命令就是贩毒案是否在集合中,如果在集合中,那么在,就返回1,其他情况【不存在】都返回0

scard key 获取集合的元素的个数

scard就可以获取集合中元素的个数,返回值就是数字,表示元素的个数,其他的所有情况都返回0

srem key member 移除集合中的一个或者多个元素

删除key集合中的一个或者多个member元素,不存在的元素就会被忽略,返回值就是数字,表示的是成功删除元素的个数,不包括被忽略的元素

srandmember key count 随机返回集合中count个元素

只是提供key,默认情况下就返回的是一个元素,元素不删除【还是在集合中】,提供了count,cunt整数返回的就是count个元素,元素不重复

当count为负数时,随机的count个元素就是可以重复的元素

spop key count 随机删除count个元素

随机从集合中删除一个元素,count是删除元素的个数,

返回值表示的是被删除的元素的列表,如果key不存在或者空就返回null

127.0.0.1:6379> select 3
OK
127.0.0.1:6379[3]> dbsize
(integer) 0
127.0.0.1:6379[3]> sadd group CFENG CSHEN CHUAN CLEI CLU
(integer) 5
127.0.0.1:6379[3]> sadd group CFENG
(integer) 0
127.0.0.1:6379[3]> sadd group CGONG
(integer) 1
127.0.0.1:6379[3]> smembers group
1) "CLU"
2) "CGONG"
3) "CHUAN"
4) "CLEI"
5) "CSHEN"
6) "CFENG"
127.0.0.1:6379[3]> sismember group CFENG
(integer) 1
127.0.0.1:6379[3]> scard group
(integer) 6
127.0.0.1:6379[3]> srandmember group 3
1) "CLEI"
2) "CHUAN"
3) "CFENG"
127.0.0.1:6379[3]> srandmember group -4
1) "CGONG"
2) "CLU"
3) "CHUAN"
4) "CGONG"
127.0.0.1:6379[3]> srem group CHUAN
(integer) 1
127.0.0.1:6379[3]> spop group group 2
(error) ERR syntax error
127.0.0.1:6379[3]> spop group 2
1) "CSHEN"
2) "CFENG"
127.0.0.1:6379[3]> smembers group
1) "CLU"
2) "CGONG"
3) "CLEI"
127.0.0.1:6379[3]> exit

有序集合 zset (sorted set)

相比上面的单纯的无序集合,zset中也是sring类型元素的集合,不允许重复,但是每一个元素都会关联一个score,分数可以重复,redis通过分数来对成员进行排序【分数相同,按照成员的字典序排序】

zadd key score member score2 member2 … 插入有序集合

将一个或者多个member及其score插入到有序集合中,如果member存在集合中,就更新覆盖,score可以是整数或者浮点数

返回值就是数字,代表的就是添加的元素的个数

zrange key start stop [withscores] 查询有序集合指定区间元素

集合成员是按照score值从小到大来进行怕羞,start和stop都是从0开始,0是第一个元素,-1是最后一个元素,

返回的就是自定义区间的成员的集合

zrevrange key start stop [withscores] 查询有序集合指定区间元素

这里和上面的唯一区别就是按照递减的顺序排序

zrem key member… 删除集合成员

这里可以删除集合key的一个或者多个成员,不存在的成员将会被忽略

返回值: 被成功删除的成员的数量,不包括忽略的成员

zcard key 获取集合个数

和上面的scard的效果相同,返回的就是集合的元素的个数,其他的情况返回的是0

zrangebyscore key min max withscores [limit offset count]

这里就是获取有序集key中,所有的score值介于min和max之间【包括min和max)的成员,有序成员是按照递增排序

min、max 可以使用-inf和 + inf表示无穷大,limit和之前的Mysql中的类似【表示的就是分页显示】

可以在min位置比如(min 那么就是不包括min的区间

zrevrangebyscore max min 相反,分数从大到小

这里除了顺序和上面相反之外其他的都是相同的

zcount key min max [min,max]间的数量

这里和mysql有些类似,返回的就是分数值介于min和max之间的元素的数量,其他情况返回的就是0

[root@localhost src]# ./redis-cli
127.0.0.1:6379> select 4
OK
127.0.0.1:6379[4]> dbsize
(integer) 0
127.0.0.1:6379[4]> zadd salary 800 Smith 8999 Jonh 4000 Alex2747:M 27 Apr 2022 14:59:09.018 * 1 changes in 3600 seconds. Saving...
                                                                                                                                  2747:M 27 Apr 2022 14:59:09.110 * Background saving started by pid 3437
            3437:C 27 Apr 2022 14:59:09.119 * DB saved on disk
                                                              3437:C 27 Apr 2022 14:59:09.120 * RDB: 2 MB of memory used by copy-on-write
                                                                                                                                         2747:M 27 Apr 2022 14:59:09.212 * Background saving terminated with success
127.0.0.1:6379[4]> zadd salary 800 Smith 8999 Jonh 4000 Alex 5000 Linda 3000 Goulh
(integer) 5
127.0.0.1:6379[4]> zcard salart
(integer) 0
127.0.0.1:6379[4]> zcard salary
(integer) 5
127.0.0.1:6379[4]> zrange salary 0 -1 
1) "Smith"
2) "Goulh"
3) "Alex"
4) "Linda"
5) "Jonh"
127.0.0.1:6379[4]> zrevrange salary 0 -1 withscores
 1) "Jonh"
 2) "8999"
 3) "Linda"
 4) "5000"
 5) "Alex"
 6) "4000"
 7) "Goulh"
 8) "3000"
 9) "Smith"
10) "800"
127.0.0.1:6379[4]> zrangebyscore salary 1000 5000 withscores
1) "Goulh"
2) "3000"
3) "Alex"
4) "4000"
5) "Linda"
6) "5000"
127.0.0.1:6379[4]> zrangebyscore salary 1000 (5000 withscores limit 5
(error) ERR syntax error
127.0.0.1:6379[4]> zrangebyscore salary 1000 (5000 withscores
1) "Goulh"
2) "3000"
3) "Alex"
4) "4000"
127.0.0.1:6379[4]> zcount salary 1000 5000
(integer) 3
127.0.0.1:6379[4]> zrange salary -inf +inf
(error) ERR value is not an integer or out of range
127.0.0.1:6379[4]> zrangebyscore salary -inf +inf
1) "Smith"
2) "Goulh"
3) "Alex"
4) "Linda"
5) "Jonh"
127.0.0.1:6379[4]> zrangebyscore salary -inf 5000 withscores
1) "Smith"
2) "800"
3) "Goulh"
4) "3000"
5) "Alex"
6) "4000"
7) "Linda"
8) "5000"
127.0.0.1:6379[4]> quit

这些就是常用的一些指令,像string、hash、list、set、zset的常用指令就上面的这些,但是常用的指令还有很多,如此多的指令还是不用全部记住,多用就下意识记住了,并且还要具有快速查询指令的能力🎉

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值