引入

Nosql

基本概念

NoSQL最常见的解释是“non-relational”, “Not Only SQL”也被很多人接受。NoSQL仅仅是一个概念,泛指非关系型的数据库,区别于关系数据库,它们不保证关系数据的ACID特性。

它不能替代关系型数据库,只能作为关系型数据库的一个良好补充。

优点:

  • 易扩展
  • 高性能
  • 大数据量、高性能
  • 高可用

Nosql 分类

不同分类特点对比:

分类 Examples举例 典型应用场景 数据模型 优点 缺点
键值(key-value) Tokyo Cabinet/Tyrant, Redis, Voldemort, Oracle BDB 内容缓存,主要用于处理大量数据的高访问负载,也用于一些日志系统等等。 Key 指向 Value 的键值对,通常用hash table来实现 查找速度快 数据无结构化,通常只被当作字符串或者二进制数据
列存储数据库 Cassandra, HBase, Riak 分布式的文件系统 以列簇式存储,将同一列数据存在一起 查找速度快,可扩展性强,更容易进行分布式扩展 功能相对局限
文档型数据库 CouchDB, MongoDb Web应用(与Key-Value类似,Value是结构化的,不同的是数据库能够了解Value的内容) Key-Value对应的键值对,Value为结构化数据 数据结构要求不严格,表结构可变,不需要像关系型数据库一样需要预先定义表结构 查询性能不高,而且缺乏统一的查询语法。
图形(Graph)数据库 Neo4J, InfoGrid, Infinite Graph 社交网络,推荐系统等。专注于构建关系图谱 图结构 利用图结构相关算法。比如最短路径寻址,N度关系查找等 很多时候需要对整个图做计算才能得出需要的信息,而且这种结构不太好做分布式的集群方案。

基本概念

Redis 是一个使用c语言开发的高性能的key-value数据库。 redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部 分场合可以对关系数据库起到很好的补充作用。它提供了Java,C/C++,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby,Erlang等客户端,使用很方便。

Redis 常被称作是一款数据结构服务器(data structure server)。Redis 的键值可以包括字符串(strings)类型,同时它还包括哈希(hashes)、列表(lists)、集合(sets)和 有序集合(sorted sets)等数据类型。

对于这些数据类型,你可以执行原子操作。例如:对字符串进行附加操作(append);递增哈希中的值;向列表中增加元素;计算集合的交集、并集与差集等。

Redis 的优点

  • 性能极高:Redis 能支持超过 100K+ 每秒的读写频率。
  • 丰富的数据类型:Redis 支持二进制案例的 Strings,Lists,Hashes,Sets 及 Ordered Sets 数据类型操作。
  • 原子:Redis 的所有操作都是原子性的,同时 Redis 还支持对几个操作全并后的原子性执行。
  • 丰富的特性:Redis 还支持 publish/subscribe,通知,key 过期等等特性。

下载及安装

下载地址

windows:

  1. Github下载地址:https://github.com/MicrosoftArchive/redis/releases
  2. 百度网盘下载地址:https://pan.baidu.com/s/1ziIEpSazWeAAH8HDUUwdgQ 提取码:uvy2

安装步骤

  1. 首先先把下载的压缩包解压到一个文件夹中

  2. 打开cmd命令窗口

  3. 跳转到你刚才文件的解压路径,不会或者忘了的读者可以参考cmd操作

  4. 然后输入redis-server redis.windows.conf 命令

  5. 接下来部署Redis为windows下的服务,首先关掉上一个窗口再打开一个新的cmd命令窗口。

    同样进入redis的解压路径,然后输入指令redis-server --service-install redis.windows.conf

  6. 随后,进入右击此电脑–管理–服务和应用程序–服务 在服务列表中找到Redis 启动服务

  7. 测试redis,通过cd到我们解压的目录,输入指令通过Set get指令查看是否成功

image-20210531205603824

Redis常用的指令

卸载服务:redis-server --service-uninstall
开启服务:redis-server --service-start
停止服务:redis-server --service-stop

数据类型

String 类型

字符串是一种最基本、最常用的 Redis 值类型。

Redis 字符串是二进制安全的,这意味着一个 Redis 字符串能包含任意类型的数据

  • 赋值 set key value
1
set a 123
  • 取值 get key
1
2
get a
结果 "123"

image-20210531211024477

  • 取值并赋值 getset key value
1
2
3
4
getset a 321
"123"
get a
"321"

image-20210531211135272

  • 设置获取多个键值 mset key value [key value…] mget key [key…]
1
2
3
4
5
mset a 1 b 2
OK
mget a b
1) "1"
2) "2"

image-20210531211328319

  • 删除 del key
1
2
del a
(integer) 1

image-20210531211359135

  • 递增数字 当存储的字符串是整数时,Redis提供了一个实用的命令incr,其作用是让当前键值递增,并返回递增后的值。

    语法:incr key

    1
    2
    set num 1
    incr num

    image-20210531211849188

  • 增加指定的整数 incrby key increment

    1
    incrby num 2

    image-20210531211957366

  • 递减数值 decr key

    1
    decr num

    image-20210531212050655

  • 减少指定的数值 decryby key decrement

    1
    decrby num 2

image-20210531212114636

  • 向尾部追加值 append的作用是向键值的末尾追加value。

    如果键不存在则将该键的值设置为value,即相当于 SET key value。

    返回值是追加后字符串的总长度。

    语法:append key value

1
2
3
set str hello
append str "world"
get str

image-20210531212521021

  • 获取字符串长度 STRLEN命令返回键值的长度,如果键不存在则返回0。

    语法:strlen key

1
strlen str

image-20210531212705769

List 类型

Redis的list是采用来链表来存储的,所以对于redis的list数据类型的操作,是操作list的两端数据来操作的。

命令

向列表两端增加元素

  • 向列表前端增加元素

    语法:lpush key value [value…]

1
lpush list:1 1 2 3

image-20210531213009353

  • 向列表后面增加元素

    语法:rpush key value [value…]

1
rpush list:1 4 5 6

image-20210531213107294

  • 查看列表 LRANGE命令是列表类型最常用的命令之一,获取列表中的某一片段,将返回start、stop之间的所有元素(包含两端的元素),索引从0开始。索引可以是负数,如:“-1”代表最后边的一个元素。

    语法:lrange key start stop

1
2
lrange list:1 0 2
lrange list:1 0 -1

image-20210531213223845

  • 从列表两端弹出元素 LPOP命令从列表左边弹出一个元素,会分两步完成:

    • 第一步是将列表左边的元素从列表中移除
  • 第二步是返回被移除的元素值。

    语法: lpop key rpop key

    1
    lpop list:1

image-20210531213739927

  • 获取列表中元素的个数

    语法:llen key

1
llen list:1

image-20210531213936234

  • 删除列表中指定的值 LREM命令会删除列表中前count个值为value的元素,返回实际删除的元素个数。根据count值的不同,该命令的执行方式会有所不同:

    • 当count>0时, LREM会从列表左边开始删除。
    • 当count<0时, LREM会从列表后边开始删除。
    • 当count=0时, LREM删除所有值为value的元素。

    语法:lrem key count value

1
lrem list:1 1 2

image-20210531214505140

  • 获得/设置指定索引的元素值

    • 获得指定索引的元素值

      语法:lindex key index

    1
    lindex list:1 2

    image-20210531215418446

    • 设置指定索引的元素值

      语法:lset key index value

    1
    lset list:1 2 2

    image-20210531215510782

  • 只保留列表指定片段 指定范围和 lrange 一致

    语法:ltrim key start stop

1
ltrim list:1 0 2

image-20210531215703029

  • 向列表中插入元素 该命令首先会在列表中从左到右查找值为pivot的元素,然后根据第二个参数是before还是after来决定将value插入到该元素的前面还是后面。

    语法:linsert key before | after pivot value

1
linsert list:1 after 1 9

image-20210531220104565

  • 将元素从一个列表转移到另一个列表 语法:rpoplpush source destination
1
rpoplpush list:1 newlist

image-20210531220546553

Hash 散列类型

使用 string 的问题

介绍

hash叫散列类型,它提供了字段和字段值的映射。字段值只能是字符串类型,不支持散列类型、集合类型等其它类型。如下:

image-20210601160132684

注意:图中字段是按字母出现顺序排序的,但是在散列存储中,是没有顺序的

命令

  • 赋值 HSET命令不区分插入和更新操作,当执行插入操作时HSET命令返回1,当执行更新操作时返回0。

    • 一次只设置一个字段值 语法:hset key field value
    1
    hset dict H 1

    image-20210601160354741

    • 一次设置多个字段值 语法:hmset key field value [field value…]
    1
    hmset dict e 1 l 2

    image-20210601160506121

    • 当字段不存在时赋值,类似hset,区别在于如果字段存在,该命令不执行任何操作。 语法:hsetnx key field value
    1
    hsetnx dict o 1

    image-20210601160633018

  • 取值

    • 一次获取一个字段值 语法:hget key field
    1
    hget dict H

    image-20210601160746852

    • 一次可以获取多个字段值 语法:hmget key field [field…]
    1
    hmget dict e l

    image-20210601160831409

    • 获取所有字段值 语法:hgetall key
    1
    hgetall dict

    image-20210601160921571

  • 删除字段 可以删除一个或多个字段,返回值是被删除的字段的个数。

    语法:hdel key field [field…]

1
hdel dict H

image-20210601161209066

  • 增加数字

    语法:hincrby key field increment

1
hincrby dict H 2

image-20210601161302659

  • 判断字段是否存在

    语法:hexists key field

1
hexists dict H

image-20210601161400178

  • 获取字段名

    语法: hkeys key

  • 获取字段值

    语法: hvals key

1
2
hkeys dict
hvals dict

image-20210601162009254

  • 获取字段数量

    语法:hlen key

1
hlen dict

image-20210601162150172

Set 类型

集合(Set)类型:无序、不可重复

列表(List)类型:有序、可重复

命令

  • 增加/删除元素

    语法:sadd key member [member…]

1
sadd set a b c

​ 语法:srem key member [member…]

1
srem set c

image-20210601162647450

  • 获得集合中的所有元素

    语法:smembers key

1
smembers set

image-20210601162724674

  • 判断元素是否在集合中

    语法:sismember key member

1
sismember set a

image-20210601162828675

运算命令

  • 集合的差集运算 A-B 属于 A 并且 不属于 B 的元素构成的集合

image-20210601163236299

​ 语法:sdiff key [key…]

1
2
3
4
sadd setA 1 2 3
sadd setB 2 3 4
sdiff setA setB
sdiff setB setA

image-20210601163120029

  • 集合的交集运算 属于A且属于B的元素构成的集合

image-20210601163254020

​ 语法:sinter key [key…]

1
sinter setA setB

image-20210601163154159

  • 集合的并集运算 属于 A 或者 属于 B 的元素构成的集合

image-20210601163309968

​ 语法:sunion key [key…]

1
sunion setA setB

image-20210601163341689

  • 获得集合中元素的个数

    语法:scard key

1
scard setA

image-20210601163456093

  • 从集合中弹出一个元素

    注意:由于集合是无序的,所以spop命令会从集合中随机选择一个元素弹出。

    语法:spop key

1
spop setA

image-20210601163545832

Sortedset 类型

Sortedset 又叫 zset

Sortedset 是有序集合,可排序的,但是唯一。

Sortedset 和 set 的不同之处,会给 set 中元素添加一个分数,然后通过这个分数进行排序。

命令

  • 增加元素

    向有序集合中加入一个元素和该元素的分数,如果该元素已经存在则会用新的分数替换原有的分数。返回值是新加入到集合中的元素个数,不包含之前已经存在的元素。

    语法:zadd key score member [score member…]

1
zadd scoreboard 80 zhangsan 89 lisi 94 wangwu

image-20210601164535943

  • 获取元素分数

    语法:zscore key member

1
zscore scoreboard lisi

image-20210601164559384

  • 删除元素

    移除有序集key中的一个或多个成员,不存在的成员将被忽略。 当key存在但不是有序集类型时,返回一个错误。

    语法:zrem key member [member…]

1
zrem scoreboard lisi

image-20210601164630233

  • 获得排名在某个范围的元素列表

    • 按照元素分数从小到大的顺序返回索引从start到stop之间的所有元素(包含两端的元素)

      语法:zrange key start stop [withscores]

    1
    zrange scoreboard 0 2

    image-20210601164712369

    • 按照元素分数从大到小的顺序返回索引从start到stop之间的所有元素(包含两端的元素)

      语法:zrevrange key start stop [withscores]

    1
    zrevrange scoreboard 0 2

    image-20210601164822080

    如果需要获得元素的分数可以在命令末尾加上 withscores 参数 ···

    1
    zrevrange scoreboard 0 2 withscores

image-20210601164952901

  • 获取元素的排名

    • 从小到大

      语法:zrank key member

    1
    2
    zrank scoreboard zhangsan
    zrank scoreboard wangwu

    image-20210601165042330

    • 从大到小

      语法:zrevrank key member

    1
    2
    zrevrank scoreboard zhangsan
    zrevrank scoreboard wangwu

image-20210601165132149

  • 获得指定分数范围的元素

    语法:zrangebyscore key min max [withscores] [limit offset count]

1
zrangebyscore scoreboard 90 97 withscores

image-20210601165644019

  • 增加某个元素的分数

    返回值是更改后的分数

    语法:zincrby key increment member

1
zincrby scoreboard 4 lisi

image-20210601170100767

  • 获得集合中元素的数量

    语法:zcard key

1
zcard scoreboard

image-20210601170124912

  • 获得指定分数范围内的元素个数

    语法:zcount key min max

1
zcount scoreboard 80 90

image-20210601170155032

  • 按照排名范围删除元素

    语法:zremrangebyrank key start stop

1
2
zremrangebyrank scoreboard 0 1
zrange scoreboard 0 -1

image-20210601170248813

  • 按照分数范围删除元素

    语法:zremrangebyscore key min max

1
2
zadd scoreboard 84 zhangsan
zremrangebyscore scoreboard 80 100

image-20210601170327131

keys 命令

常用命令

  • keys 返回满足给定pattern 的所有key

    1
    keys list*

    image-20210601172151520

  • exists 确认一个key 是否存在

    示例:从结果来看,数据库中不存在HongWan 这个key,但是A这个key 是存在的

    1
    2
    exists HongWan
    exists age

    image-20210601173332782

  • del 删除一个key

    1
    2
    del A
    exists A

    image-20210601173545137

  • rename 重命名key

    示例:b成功的被我们改名为B了

    1
    2
    3
    keys * 
    rename b B
    keys *

    image-20210601174148844

  • type 返回值的类型

    示例:这个方法可以非常简单的判断出值的类型

    1
    2
    3
    type B
    type dict
    type setA

    image-20210601174355434

设置 key 的生存时间

Redis在实际使用过程中更多的用作缓存,然而缓存的数据一般都是需要设置生存时间的,即:到期后数据销毁。

EXPIRE key seconds 设置key的生存时间(单位:秒)key在多少秒后会自动删除
TTL key 查看key剩余的生存时间
PERSIST key 清除生存时间
PEXPIRE key milliseconds 生存时间设置单位为:毫秒

例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
set test 1
#设置test的值为1

get test
#获取test的值

EXPIRE test 5
#设置test的生存时间为5秒

TTL test
#查看test的生于生成时间还有1秒删除

TTL test

get test
#获取test的值,已经删除

image-20210601174754939

Redis 持久化方案

Rdb 方式

Redis 默认的方式,redis 通过快照方式将数据持久化到磁盘中。

设置持久化快照的条件

在 Redis路径中的redis.conf(windows中是redis.windows.conf) 中修改持久化快照的条件:

image-20210601180050139

将数据库保存在磁盘上:

#保存

#如果达到给定的秒数 和 给定的对数据库执行的写入操作数。

#在下面的示例中,将会进行保存操作:

#900秒(15分钟)后,至少有一个键更改

#300秒(5分钟)后,至少有10个键更改

#60秒后,至少10000个密钥发生更改

#注意:您可以通过注释掉所有“save”行来完全禁用保存。

#也可以删除以前配置的所有保存

#通过添加带有单个空字符串参数的save指令

#如以下示例所示:

#save“”

持久化文件的存储目录

在 redis.conf 中可以指定持久化文件的存储目录

image-20210601180437617

#将数据库转储到的文件名

dbfilename dump.rdb

#工作目录

#DB将被写入这个目录,使用上面使用’dbfilename’配置指令指定的文件名。

#只附加的文件也将在这个目录中创建。

#请注意,必须在此处指定目录,而不是文件名。

dir ./

Rdb 的问题

一旦redis非法关闭,那么会丢失最后一次持久化之后的数据。

如果数据不重要,则不必要关心。 如果数据不能允许丢失,那么要使用 aof 方式。

Aof 方式

Redis 默认是不使用该方式持久化的。Aof 方式的持久化,是操作一次 redis 数据库,则将操作的记录存储到 aof 持久化文件中。

  • 第一步:开启 aof 方式持久化方案。 将redis.conf中的appendonly改为yes,即开启aof方式的持久化方案。

    image-20210601180959284

  • Aof文件存储的目录和rdb方式的一样。 Aof文件存储的名称

    img

#默认情况下,Redis将数据集异步转储到磁盘上。

#此模式在许多应用程序中已经足够好了,

#但是Redis进程或断电可能会导致几分钟的写操作丢失(取决于配置的保存点)。

#仅附加文件是一种提供更好的耐用性。

#例如,使用默认数据fsync策略(请参阅后面的配置文件)

#Redis在一段时间内只会丢失一次的写操作

#某些戏剧性的事件,

#比如服务器断电,或者某个事件发生时的一次写入导致Redis进程本身出错,但操作系统仍然正常运行。

#AOF和RDB持久性可以同时启用而不会出现问题。

#如果启动时启用了AOF,Redis将加载AOF,

#即文件具有更好的耐久性保证。

appendonly yes

#仅附加文件的名称(默认值:“appendonly.aof”)

appendfilename“appendonly.aof”

在同时使用aof和rdb方式时,如果redis重启,则数据从aof文件加载。

总结

这次的《初识Redis》就写到这里了,笔者在写这篇文章中也收获良多,本次部分学习来源:实验楼《Redis 简明教程》掘金社区轻云时解《Redis 入门》Redis官网教程文档