Redis教程(上课笔记)

Redis教程

1. 什么是NoSql

NoSQL一词最早出现于1998年,是Carlo Strozzi开发的一个轻量、开源、不提供SQL功能的关系数据库。2009年,Last.fm的Johan Oskarsson发起了一次关于分布式开源数据库的讨论,来自Rackspace的Eric Evans再次提出了NoSQL的概念,这时的NoSQL主要指非关系型、分布式、不提供ACID的数据库设计模式。它不同于传统的关系数据库,两者存在许多显著的不同点,其中最重要的是NoSQL不使用SQL作为查询语言。其数据存储可以不需要固定的表格模式。

2. Redis简介

2008年,意大利的一家创业公司Merzia推出了一款基于MySQL的网站实时统计系统LLOOGG,然而没过多久该公司的创始人 Salvatore Sanfilippo便 对MySQL的性能感到失望,于是他决定亲自为LLOOGG量身定做一个数据库,并于2009年开发完成,这个数据库就是Redis。 不过Salvatore Sanfilippo并不满足只将Redis用于LLOOGG这一款产品,而是希望更多的人使用它,于是在同一年Salvatore Sanfilippo将Redis开源发布,并开始和Redis的另一名主要的代码贡献者Pieter Noordhuis一起继续着Redis的开发,直到今天。短短的几年时间,Redis就拥有了庞大的用户群体。Hacker News在2012年发布了一份数据库的使用情况调查,结果显示有近12%的公司在使用Redis。国内如新浪微博、街旁网、知乎网,国外如GitHub、Stack Overflow、Flickr等都是Redis的用户。VMware公司从2010年开始赞助Redis的开发, Salvatore Sanfilippo和Pieter Noordhuis也分别在3月和5月加入VMware,全职开发Redis。

Redis是使用c语言开发的一个高性能键值数据库。常用于分布式系统中的缓存、电商秒杀、排行榜、访问量统计、分布式会话共享等高并发应用场景。Redis可以通过一些键值类型来存储数据。其数据类型包括字符类型、散列类型、列表类型、集合类型、有序集合类型。

3. 安装Redis

访问Redis官网https://redis.io/download下载最新的版本 。

image-20190127091355834

解压并编译安装

$ tar xzf redis-5.0.3.tar.gz
$ cd redis-5.0.3
$ make install

Redis官网并没有提供windows版本,但可以前往https://github.com/tporadowski/redis/releases下载windows的个人编译版本(注意:并不是最新的版本)。

image-20190127091500286

4. 启动服务

4.1 前端启动

在redis的src目录有一个redis-server文件,用于启动一个redis服务。

image-20190128080006944

redis的默认端口为6379,当客户端需要连接到redis服务时,就通过服务端的IP地址以及这个端口进行连接。也可以修改这个默认端口。在redis的根目录下有一个redis.conf文件,它是redis的核心配置文件,redis的所有配置信息都在此文件中。如果需要修改端口,我们在配置文件中找到port配置,并将6379改为其他的端口号。

image-20190128081730591

修改完后需要重新启动redis服务,需要注意的是,在使用redis-server启动服务时需要指定redis.conf文件的绝对路径,否则redis将以默认的配置启动一个服务实例。

image-20190128082950744

前端启动的模式我们可以在终端看到redis的启动信息和相关的操作日志,但此时如果关闭了终端或者使用control+c将会立即停止redis服务。

4.2 后端启动

所谓后端启动,就是以一个独立的进程来运行一个redis服务。首先修改redis.conf文件,找到daemonize选项并设置为yes,如下图:

image-20190203082011881

保存退出后重新启动redis服务,此时redis将以后台进程的方式启动服务。终端没有显示相关的启动信息,并且启动完成后,终端可以继续执行其他的操作。

image-20190203082246538

5. 客户端连接

5.1 Redis客户端

在redis的src目录下有一个redis-cli命令,这个就是官方提供的redis客户端,可以使用它来连接和操作redis。当然,这仅仅只是一个命令行的客户端程序,在实际的开发中会有不同的平台语言,因此官网也提供了对各种语言的客户端实现,在实际的项目开发中使用不同语言的客户端来操作redis。例如官网提供了一个Java的客户端Jedis。

image-20190203090500297

1)使用redis-cli

可以使用使用官方自带的redis-cli客户端来连接redis服务。参数-h为连接redis服务器的IP地址,-p为redis的端口号。连接完成后就可以对redis进行操作了,我们使用简单的set和get命令来进行存储和访问操作。

image-20190203084322124

2)退出客户端

如果想要退出客户端的连接只需要在连接的状态下输入quit或者exit即可。

image-20190203084736497

3)身份认证

默认连接Redis时是不需要认证密码的,我们可以为其设置一个连接的认证密码。首先在redis.conf中找到requirepass配置项,取消注释并设置一个密码。

image-20190213160312170

保存后重启服务,在连接客户端时加上-a参数并输入配置的密码。

image-20190213160856278

连接时也可以不指定密码也可以正常连接,但在操作Redis时候会提示一个错误,要求输入认证密码。这时使用auth命令来输入密码即可。

image-20190213161510434

如果设置了认证密码,在关闭客户端时也同样需要指定。

image-20190213163407190

5.2 可视化客户端

也可以使用第三方的redis的可视化客户端RDM(redis-desktop-manager),它同时提供了各种系统平台的编译版本,安装后即可使用。下载地址:

image-20190203091654632

点击左上角的Connect to Redis Server,在弹出的窗口中填写相关的Name(连接名称)、Address(连接地址)、端口号以及认证密码(Auth),点击OK即可。

image-20190203091505965

image-20190203091546340

这里我们看到连接redis后默认有16个库(0 ~ 15),这是redis默认的配置,可以在redis.conf中可以找到相应的选项并修改默认数量。

image-20190203092012415

当我们使用客户端连接redis时,默认选择的是index为0的数据库,然而也可以使用select命令选择其他数据库。例如选择index为15的数据库,如下操作:

image-20190203141448968

5.3. 停止服务

如果使用前端启动redis,可以使用control+c或者kill命令来杀掉进程的方式关闭redis(注意:control+c并不能停止后端启动的redis),但这些方式都是强制性的关闭redis,由于redis保存的数据先会存储在内存,如果此时强制关闭,将导致redis还没将数据持久化到文件中就退出,可能会照成部分的数据丢失。因此,应该使用正常的退出方式来停止redis服务,正常退出redis同样使用redis-cli客户端。

image-20190203085109054

上面的命令表示关闭本机端口为6379的redis服务。

6. 数据类型及常用API

Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及sorted set(zset:有序集合)。

6.1 string(字符串)

String 是 redis 最基本的类型,一个 key 对应一个 value。它是二进制安全的,可以包含任何数据,如jpg图片或者序列化的对象。

1)SET

语法:set key value

赋值操作。

image-20190204083836073

2)GET

语法:get key

取值操作。

image-20190204083932618

3)GETSET

语法:getset key value

取值并赋值。

image-20190204084114612

4)MSET

语法:mset key value [key value …]

同时设置多个键值。

image-20190204084331152

5)MGET

语法:mget key [key …]

获取多个键值。

image-20190204084449235

6)DEL

语法:del key [key …]

删除一个或多个键值对。

image-20190204084649996

7)INCR

语法:incr key

当存储的字符串是整数时,让当前键值递增,并返回递增或增加后的值。

image-20190204085509956

8)INCRBY

语法:incrby key increment*

当存储的字符串是整数时,让当前键值增加指定的数值,并返回递增或增加后的值。

image-20190204085627802

9)DECR

语法:decr key

让当前键值递减,并返回递减或减少后的值。

image-20190204090103737

10)DECRBY

语法:decrby key decrement

让当前键值减少指定的数值,并返回递减或减少后的值。

image-20190204090142201

11)APPEND

语法:append key value

向键值的末尾追加value。如果键不存在则将该键的值设置为value,即相当于 SET
key value。返回值是追加后字符串的总长度。

image-20190204090432914

12)获取字符串长度(STRLEN)

STRLEN命令返回键值的长度,如果键不存在则返回0。

image-20190204090808672

6.2 hash(哈希)

hash是一个string类型的field和value的映射表,而field只能是String类型,hash特别适合用于存储对象。

image-20190204091157360

1)HSET

语法:HSET key field value

HSET一次只能设置一个字段值。HSET命令不区分插入和更新操作,当执行插入操作时HSET命令返回1,当执行更新操作时返回0。

image-20190204134214619

2)HMSET

语法:HMSET key field value [field value …]

HMSET和HSET作用一样,只不过一次可以设置多个字段值。

image-20190204134551593

3)HSETNX

语法:HSETNX key field value

当字段不存在时赋值,类似HSET。区别在于如果字段存在,该命令不执行任何操作。

例如:hsetnx user name zing

说明:如果user中不存在name字段则设置name的值为zing,否则不做任何操作。

image-20190204135606457

4)HGET

语法:HGET key field

HGET一次只能获取一个字段值。

image-20190204140214213

5)HMGET

语法:HMGET key field [field …]

HMGET一次可以获取多个字段值。

image-20190204140321356

6)HGETALL

语法:HGETALL key

获取所有字段值。

image-20190204140544575

7)HDEL

语法:HDEL key field [field…]

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

image-20190204140809745

8)HINCRBY

语法:HINCRBY key field increment

为某个字段增加数值。

image-20190204141142522

9)HEXISTS

语法:HEXISTS key field

判断字段是否存在,存在则返回1,否则返回0。

image-20190204141526465

10)HKEYS

语法:HKEYS key

获取所有的字段名。

image-20190204141719881

11)HVALS

语法:HVALS key

获取所有字段的值。

image-20190204141859820

12)HLEN

语法:HLEN key

获取字段数量。

image-20190204143508898

6.3 list(列表)

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

1)LPUSH

语法:LPUSH key value [value …]

向列表左边添加元素。

image-20190204150049467

2)RPUSH

语法:RPUSH key value [value …]

向列表右边添加元素。

image-20190204150259434

3)LRANGE

语法:LRANGE key start stop

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

image-20190204150640331

4)LPOP

语法:LPOP key

LPOP命令从列表左边弹出一个元素,会分两步完成:第一步是将列表左边的元素从列表中移除。第二步是返回被移除的元素值。

image-20190204151255741

5)RPOP

语法:RPOP key

RPOP命令从列表右边弹出一个元素,步骤与LPOP类似,第一步是将列表右边的元素从列表中移除。第二步是返回被移除的元素值。

image-20190204151330740

6)LLEN

语法:LLEN key

获取列表中元素的个数

image-20190204163548551

7)LREM

语法:LREM key count value

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

当count>0时, LREM会从列表左边开始删除。

当count<0时, LREM会从列表右边开始删除。

当count=0时,LREM删除所有值为value的元素。

image-20190228095106676

8)LINDEX

语法:LINDEX key index

获得指定索引的元素值。

image-20190204165017260

9)LSET

语法:LSET key index value

设置指定索引的元素值。

image-20190204165126605

10)LTRIM

语法:LTRIM key start stop

只保留列表的指定片段

image-20190204165405908

11)LINSERT

语法:LINSERT key BEFORE|AFTER pivot value

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

image-20190204165828783

12)RPOPLPUSH

语法:RPOPLPUSH source destination

将一个列表的最后一个元素转移到另一个列表的最前面

image-20190204170459521

6.4 set(集合)

Redis 的 Set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。

1)SADD

语法:SADD key member [member …]

增加一个或多个元素。

image-20190205085821980

2)SREM

语法:SREM key member [member …]

移除一个或多个元素。

image-20190205090001732

3)SMEMBERS

语法:SME

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值