1概念

Redis是一个开源的基于内存的集合对数据库

特点:

1基于内存,读写速度快,可以处理大量读写请求

2支持多种数据结构,如字符串,哈希,列表,集合,有序结合

3支持主从赋值,提供数据冗余和故障恢复能力

4支持持久化,可以将内存数据保存到磁盘中

5支持事物,可以一次执行多个命令

6丰富的功能,可用于缓存,消息队列等场景

主要场景

1:缓存查询结果,热点数据,大大降低数据库负载

2处理大量的读写请求,比如访问统计和消息队列

3排行榜、计数器等功能实现

4pub/sub订阅

5QUE计划任务

6分布式锁

2入门

使用虚拟机启动(这里要求虚拟机了装一个ssh)

1Redis-cli

Linux操作系统进入输入redis-cli

Redis的默认端口是6379所以会有redis-cli

2切换数据库

Redis默认由16个数据库(0-15),在默认配置下,Redis 最多支持 16 个数据库,编号从 0 到 15,不能直接创建编号为 16 等超出默认范围的数据库可以使用select 语句进行切换,如果Index值大于这个范围就会报错

你如果非要改的话也是可以改的 ,进入redis的配置,更改databases的数量

不过还是不建议改,16个数据库也是够用了

Ubuntu进入方法:sudo nano /etc/redis/redis.conf

改完之后用先ctrl +O  +enter +ctrl+x

然后sudo systemctl restart redis-server

如果你想供别的计算机访问的话可以把里面有一个有设置的127.0.0.1改成0.0.0.0,这样主机就可以直接访问虚拟机的redis了

用select语句来切换

可以通过client INFO命令来查看

第二行有个db属性代表着这是第二个

3核心数据类型

无序集合类型

元素不能重复

哈希类型

用于存储对象的键值对

列表类型(双向链表结构)

适合做队列和栈

有序集合类型

关联一个值,按这个值排序,不能重复

字符串

最基本的数据类型,可以存储任何串

3get和set相关命令

set

创建键:set 键名(自己随便) 值

不过set有个缺点

就是set如果有一个存在的值,会直接把这个数值覆盖掉

Setnx

为了应对这个问题我们可以使用setnx

setnx也可以对值进行设置,不过它的返回值是0 和-1 如果该键原本存在,则返回0 代表设置失败,如果该不存在才设置成功

get

可以使用get   来对键获取所对应的值

这里可以看到我们set键的时候全都是数字,没有引号,但是get命令查看的时候全都是字节流,因为redis的底层存储方式是二进制的字节流,可以看出redis是个弱类型

同时可以看到刚刚存储的username中的内容变成了编码,它其实是存进去了,但存的是二进制编码,不管是什么,存储的时候字节序列

--raw

如果想要看到我们set的时候写的值需要进入redis时写个--raw

如果想查看存储的容量可以通过DBSIZE

这个是写了--raw的 ,看起来比较人性化

这个是不写raw的,返回了其内容

Type

我们可以通过Type来观看其数据的值

可以看到返回的类型的是string ,它是string的方法来存储二进制数据的

keys

如果看到设置的所有的键,需要用到keys*

这个是在没有raw下的

此外keys可以间接的来查找

可以把符合的全都查询出来,如果没有符合的会爆一个(empty array)

因此可以看出keys的返回对象是个数组

可以用通配符查找

代表一个字符

*

代表的多个字符

一个*代表显示所有数据

这是所有键

a*代表a开头的

A?代表a开头的长度为2的字符

Nli

如果get了一个不存在的值会怎么样呢?

比如get  a1

在raw中可以看到没有返回值

在没有raw属性可以看到

(nil)代表着n1或者a1没有设置值或者这个值已经过期了

getset

getset命令是先执行get然后在执行set,有返回值,返回值是get的返回值

mset和mget

我们可以通过mset来设置多个键,通过mget来查看多个键

我们可以先用试探性的去传参

我们可以看到 mset的使用方式是

Mset 键 值 ........

第二种设置方式,(和第一种没区别,但是更容易看)

这种的键值是user:1:name和user:1:age 是两个单独的键值

msetnx同时设置多个值

原理就是mset+setnx  不能重复设置值

这里要注意:msetnx也有个缺点,就是一大堆键值中 只要有一个是存在的,返回值就是0.

这里a1我上面设置过了

Flushdb和flushall

可以用flushdb命令来清除当前的数据库的数据

Flushallk可以用于清除所有数据库的数据

4设置过期与删除操作相关命令

可以用del来直接删除值

exists:

可支持多键查找,也可以单一查找

在单一查找中,如果返回0代表没找到,如果返回1代表找到了

DBSIZE=0代表我这里没有添加其他的

在单键查找中,我没设置a4,所以a4不存在,所以返回0

多键查找

对每一项查找的值做了加法运算

a1 存在  a4不存在 因此1+0=1

a1和a2全部都存在1+1=2

以此类推

Expire和ttl

和上面一样还是只有a1 a2 a3

expire可以设置键的过期

ttl可以查看键的还有多久过期

默认数据是永久保存的,因此返回值是-1

如果ttl 一个不存在或者已经过期的键,会返回-2

使用expire 键 时间后会返回1

这个单位是秒

这里看到设置之后expire返回1,代表的是成功设置了60S后过期

这里没有设置a4,所以设置过期时返回0,代表设置失败

当a1的时间过期后

使用keys *可以看到

已经被删除掉

当然,设置了expire的键我也可以再次修改

这里要注意:如果expire 设置一个键为-1 将会直接过期

这种写法是错误的expire的值为大于0的

Persist

如果要设置永久有效的化

需要用到persist关键字

格式presist 键

Setex

之前用set设置的值无法同时设置过期时间,而setex可以在设置键值的同时设置过期时间。

格式是 setex 键 剩余时间(秒为单位) 对应值

和set一样如果存在会直接覆盖原来的值

Move

我们可以通过move命令来讲数据从一个数据库移动到另一个数据库中

我们看到当前数据库中有

Move命令和返回值1代表成功操作 0代表操作失败

转到 1号表

5string类型

刚刚上面看到用set设置的值,返回值类型都是string

strlen

获取字符串的长度函数strlen

格式strlen 键

Append

append在值后面追加新的值

格式  append 键 值

返回值不是1 是追加后字符的总长度

Incr和decr

Incr类似于C语言中的自加(i++)decr类似于C语言的自减(i--)

这两个命令的格式都是一样

命令   键  :执行的操作是进行自加或者是自减

使用incr后

可以看到它不仅用字符串的形式实现了数字之间的加法,而且,使用Incr的返回值是这个数的本身值,并且是integer类型的

Decr也是如此

这个相当于是自减 和incr原理差不多

如果你写的键所对应的值不是一个数字字符串会报错

Incrby和decrby

如果上面的Incr,decr可以理解为i++或者i--,这里的incrby和decrby可以理解为i+=一个数和i-=一个数

格式 incrby/decrby 键  一个数

Getrange

字符串截取的命令是getrange

格式getrange 字段名 开始下标 结束下标

范围是开始和结束全部包括的

当然redis的下标类似于python 可以支持负数下标,-1是最后一个元素

可以用0  和-1来表示其所有内容

Setrange

字符串替换的命令是setrange

格式是 setrange  下标值  数量

表示从改位开始逐个字符替换,如果替换的字符不够就在后面追加

返回值是字符串的数量

6List

底层:当元素比较少的时候,使用压缩列表,插入和删除需要移动元素,当元素比较多的时候变成双向链表

1Lpush和rpush和lrange

Lpush和rpush对应的是分别插入列表的位置为头部与尾部

格式

Lpush 变量名  值

返回值是这个列表的长度

查看列表中的元素

Lrange 列表名  查看下标  (如果填 0和 -1代表全部元素)

首先插入一个12,然后在12 的左边插入一个90bd,因此,类似于一个栈结构,第一个元素为栈顶

Rpush 变量名 值

返回值也是一个列表的长度

Rpush是右边插入 类似于一个队列结构

2lpop和rpop

顾名思义 lpop就是弹出左边的第一个值,rpop就是弹出右边的一个值

Lpop和rpop是有返回值的,可以返回删掉的内容

3llen lindex

或者列表长度的命令是llen  ,获取某个下标的值是lindex

3lset设置具体的值

.lset可以将列表的的一个值进行更改

格式 lset 键 index  value

如果超出index值的范围会报错

4lrem删除指定值

删除指定个数的值

使用方法:lrem 键值 数量 值

返回值为0和1 ,0代表删除失败,1代表删除成功

5ltrim列表截取

用法:ltrim  键值  start  end  

截取键值

6linsert插入

主要操作,在具体某个字段之后或者之前进行插入

这个有两个关键字   after 和Before  

linsert也是有自己返回值的返回的是列表数量

如果返回-1 代表没有找到你要求的字段

7set类型集合

1sadd和smembers

Sadd用于集合的添加元素

用法:sadd 键 值

我们可以用smembers 来查看集合种的元素

sadd的返回值是你成功插入元素的数量

这里要注意一点,集合种元素不能重复

2查询元素和删除

sismember

如果找到了返回1

没有找到返回0

Srem 是删除元素的操作

可以删除一个也可以删除多个值

Srem 的返回值是删除元素的数量

如果写了不存在的值,也可以把存在的值删除不报错,返回成功删除元素的数量

3集合的随机操作

1srandmember

随机抽取出元素

也可以抽取出多个元素

随机删除spop

4smove移动元素

如果乱加元素返回值是0

Smove的参数只有三个,一个集合1 一个集合2  还有个member

因此只能一个个移动

5集合之间的操作

Sdiff

差集操作

sinter

交集

sunion

并集

S1:6 3 4 1 5 pos 2 9

S2:1 3 4 5 6 7 8

交集

并集

差集

8哈希类型

1hset和hget

添加数据

Hset 变量名  键  值 [键  值】

返回的是成功插入元素的个数

我们可以用hget来获取数据

Hset的set的原理有点相似,当hset一个存在的键,指定另一个值,返回值为0,代表没有加入,但可以对所对应的键值进行更新操作

2hgetall和hmget和hmset

奇数是键 偶数是值

获取多个值hmget

有hmget也就有hmset

其实和hset的区别就在于返回值不一样了

3hkeys和hvals

获取所有键和获取所有值hkeys和hvals

4hsetnx

和setnx一样的道理如果存在不会设置,但是如果不存在会设置

可以看到返回值为0 没有更改

这里teacher原先不存在,可以用setnx进行添加

5hlen获取长度

6hdel删除操作

删除之后

也可以删除多个键

7判断字段是否存在hexists

可以用hexists

返回值是1或者0

如果查多个值会报错

8指定增加

增加后查看

这个和string的incrby同样只能给整数相加

相减

9有序集合zset

zset和set的对比是一个有顺序,一个是无顺序,因此在zset要声明在第几个位置

1zset和zrange

添加元素,zset可以一个个加,也可以直接加一堆

返回的是添加的数量

是从0开始

2我们可以通过zrange 0 -1来查看这个有序集合的所有元素

Zrange的实现的和lrange'差不多

现在来看一个神奇的

-1不是加在最后,而是加在0的前面

还有

Zadd 中重复插入0 他会把位置腾出来,在把元素插入进去

和之前的一样也允许插入之前插入过的

2zrem删除元素

这个是z2中的元素

接下来进入删除操作

这是删除一个

这个是删除多个

3查看元素个数zcard

4排序

排序是的关键字

Zrangebyscore  键 范围(全部的话是-inf   +inf)  withscore(可选)

他是按score来排序的

这个score就是输入的时候的值,既是位置,又代表着score值

我们可以在后面增加scores来看我们初始的值

当然也可以反着排zrevrange

你能同0 和-1但是用inf 和-inf会报错

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐