Redis教程

1 数据库概述

1.1 Redis简介

1.1.1 Redis介绍

REmote DIctionary Server(Redis)是⼀个由Salvatore Sanfilippo开发的⾼性能的key-value数据库(存储系 统)。 

Redis是⼀个开源的使⽤ANSI C语⾔编写、遵守BSD协议、⽀持⽹络、可基于内存亦可持久化的⽇志型、Key-Value 数据库,并提供多种语⾔的API。 

它通常被称为数据结构服务器,因为值(value)可以是字符串(String)、哈希(Map)、列表(List)、集合 (Set)和有序集合(sorted sets)等类型。 

Redis是⼀种运⾏速度很快,并发性能很强(⾼并发、⾼可扩、⾼性能),并且运⾏在内存上的NoSQL(Not Only SQL)数据库。 

NoSQL数据库和传统数据库相⽐的优势: 

  • NoSQL数据库⽆需事先为要存储的数据建⽴字段,随时可以存储⾃定义的数据格式。
  • ⽽在关系数据库⾥,增删字段是⼀件⾮常麻烦的事情。如果是⾮常⼤数据量的表,增加字段简直就是⼀个噩 梦。 

1.1.2 Redis优势 

性能极⾼ – Redis能读的速度是110000次/s,写的速度是81000次/s。 

丰富的数据类型 – Redis⽀持⼆进制案例的Strings、Lists、Hashes、Sets及Ordered Sets数据类型操作。 

原⼦ – Redis的所有操作都是原⼦性的,同时Redis还⽀持对⼏个操作全并后的原⼦性执⾏。 

丰富的特性 – Redis还⽀持publish/subscribe、通知key过期等特性。 

1.1.3 Redis使⽤场景 

缓存。毫⽆疑问这是Redis当今最为⼈熟知的使⽤场景。在提升服务器性能⽅⾯⾮常有效;⼀些频繁被访问的数 据,经常被访问的数据如果放在关系型数据库,每次查询的开销都会很⼤,⽽放在Redis中,因为Redis是放在内存 中的可以很⾼效的访问。 

排⾏榜。在使⽤传统的关系型数据库(MySQL、Oracle等)来做这个事⼉,⾮常的麻烦,⽽利⽤Redis的SortSet (有序集合)数据结构能够简单的搞定。 

计算器/限速器。利⽤Redis中原⼦性的⾃增操作,我们可以统计类似⽤户点赞数、⽤户访问数等,这类操作如果⽤ MySQL,频繁的读写会带来相当⼤的压⼒;限速器⽐较典型的使⽤场景是限制某个⽤户访问某个API的频率,常⽤ 的有抢购时,防⽌⽤户疯狂点击带来不必要的压⼒。 

好友关系。利⽤集合的⼀些命令,⽐如求交集、并集、差集等。可以⽅便搞定⼀些共同好友、共同爱好之类的功 能。 

简单消息队列。除了Redis⾃身的发布/订阅模式,我们也可以利⽤List来实现⼀个队列机制,⽐如:到货通知、邮 件发送之类的需求,不需要⾼可靠,但是会带来⾮常⼤的DB压⼒,完全可以⽤List来完成异步解耦。 

Session共享。以JSP为例,默认Session是保存在服务器的⽂件中,如果是集群服务,同⼀个⽤户过来可能落在不 同机器上,这就会导致⽤户频繁登陆;采⽤Redis保存Session后,⽆论⽤户落在哪台机器上都能够获取到对应的 Session信息。 

1.2 NoSQL对⽐分析 

都是NoSQL数据库的著名代表。 

1.2.1 Redis和MemCache 

Redis和MemCache都是内存数据库。不过MemCache还可⽤于缓存其他东⻄,例如图⽚、视频等。 

MemCache数据结构单⼀key-value,Redis更丰富⼀些,还提供list、set、hash等数据结构的存储,有效的减少⽹ 络IO的次数。 

虚拟内存。Redis当物理内存⽤完时,可以将⼀些很久没⽤到的value交换到磁盘。 

存储数据安全。MemCache挂掉后,数据没了(没有持久化机制);Redis可以定期保存到磁盘(持久化)。 

灾难恢复。MemCache挂掉后,数据不可恢复;Redis数据丢失后可以通过RBD或AOF恢复。 

1.2.2 Redis和MongoDB 

Redis和MongoDB并不是竞争关系,更多的是⼀种协作共存的关系。 

MongoDB本质上还是硬盘数据库,在复杂查询时仍然会有⼤量的资源消耗,⽽且在处理复杂逻辑时仍然要不可避 免地进⾏多次查询。这时就需要Redis或MemCache这样的内存数据库来作为中间层进⾏缓存和加速。 

⽐如在某些复杂⻚⾯的场景中,整个⻚⾯的内容如果都从MongoDB中查询,可能要⼏⼗个查询语句,耗时很⻓。 如果需求允许,则可以把整个⻚⾯的对象缓存⾄Redis中,定期更新。这样MongoDB和Redis就能很好地协作起 来。 

1.2.3 Redis与其他key-value存储有什么不同 

Redis有着更为复杂的数据结构并且提供对他们的原⼦性操作,这是⼀个不同于其他数据库的进化路径。Redis的数 据类型都是基于基本数据结构的同时对程序员透明,⽆需进⾏额外的抽象。 

Redis运⾏在内存中但是可以持久化到磁盘,所以在对不同数据集进⾏⾼速读写时需要权衡内存,因为数据量不能 ⼤于硬件内存。在内存数据库⽅⾯的另⼀个优点是, 相⽐在磁盘上相同的复杂的数据结构,在内存中操作起来⾮常 简单,这样Redis可以做很多内部复杂性很强的事情。同时,在磁盘格式⽅⾯他们是紧凑的以追加的⽅式产⽣的, 因为他们并不需要进⾏随机访问。 

1.3 分布式数据库CAP原理 

1.3.1 CAP简介 

传统的关系型数据库事务具备ACID:原⼦性(A)、⼀致性(C)、独⽴性(I)、持久性(D)。 

分布式数据库的CAP: 

C(Consistency):强⼀致性。“all nodes see the same data at the same time”,即更新操作成功并返回客户端 后,所有节点在同⼀时间的数据完全⼀致,这就是分布式的⼀致性。⼀致性的问题在并发系统中不可避免,对于客 户端来说,⼀致性指的是并发访问时更新过的数据如何获取的问题。从服务端来看,则是更新如何复制分布到整个 系统,以保证数据最终⼀致。

A(Availability):⾼可⽤性。可⽤性指“Reads and writes always succeed”,即服务⼀直可⽤,⽽且要是正常的 响应时间。好的可⽤性主要是指系统能够很好的为⽤户服务,不出现⽤户操作失败或者访问超时等⽤户体验不好的 情况。

P(Partition tolerance):分区容错性。即分布式系统在遇到某节点或⽹络分区故障时,仍然能够对外提供满⾜⼀ 致性或可⽤性的服务。分区容错性要求能够使应⽤虽然是⼀个分布式系统,⽽看上去却好像是在⼀个可以运转正常 的整体。⽐如现在的分布式系统中有某⼀个或者⼏个机器宕掉了,其他剩下的机器还能够正常运转满⾜系统需求, 对于⽤户⽽⾔并没有什么体验上的影响。 

1.3.2 CAP理论 

CAP理论提出就是针对分布式数据库环境的,所以,P这个属性必须容忍它的存在,⽽且是必须具备的。因为P是必 须的,那么我们需要选择的就是A和C。 

⼤家知道,在分布式环境下,为了保证系统可⽤性,通常都采取了复制的⽅式,避免⼀个节点损坏,导致系统不可 ⽤。那么就出现了每个节点上的数据出现了很多个副本的情况,⽽数据从⼀个节点复制到另外的节点时需要时间和 要求⽹络畅通。所以,当P发⽣时,也就是⽆法向某个节点复制数据时,这时候你有两个选择: 

  • 选择可⽤性A。此时,那个失去联系的节点依然可以向系统提供服务,不过它的数据就不能保证是同步的了 (失去了C属性)。 
  • 选择⼀致性C。为了保证数据库的⼀致性,我们必须等待失去联系的节点恢复过来,在这个过程中,那个节点 是不允许对外提供服务的,这时候系统处于不可⽤状态(失去了A属性)。

最常⻅的例⼦是读写分离,某个节点负责写⼊数据,然后将数据同步到其它节点,其它节点提供读取的服务,当两 个节点出现通信问题时,你就⾯临着选择A(继续提供服务,但是数据不保证准确)、C(⽤户处于等待状态,⼀直 等到数据同步完成)的问题。 

1.3.3 CAP总结 

分区是常态,不可避免,三者不可共存。 

可⽤性和⼀致性是⼀对冤家。 

  • ⼀致性⾼,可⽤性低
  • ⼀致性低,可⽤性⾼ 

因此,根据CAP原理将NoSQL数据库分成了满⾜CA原则、满⾜CP原则和满⾜AP原则的三⼤类:

  • CA - 单点集群,满⾜⼀致性,可⽤性的系统,通常在可扩展性上不太强⼤。
  • CP - 满⾜⼀致性,分区容忍性的系统,通常性能不是特别⾼。 
  • AP - 满⾜可⽤性,分区容忍性的系统,通常可能对⼀致性要求低⼀些。

2 Redis⼊⻔ 

2.1 Redis下载与安装 

2.1.1 Redis下载 

1.Redis下载地址:http://www.redis.net.cn。 

2.Redis Desktop Manager图形⼯具下载地址:https://redisdesktop.com/download。 

2.1.2 Redis安装 

Redis虽然可以安装在Windows操作系统上,但是官⽅不推荐,所以我们⼀如既往的安装到Linux操作系统上。 

1.拷⻉redis-5.0.4.tar.gz到opt⽬录。 

# 1.Windows系统使⽤Xftp⼯具或者lrzsz⼯具将Redis安装包上传⾄CentOS系统
# 2.Mac系统使⽤scp命令将Redis安装包上传⾄CentOS系统
scp /Users/yuanxin/Downloads/redis-5.0.4.tar.gz root@192.168.230.131:/opt

 2.将redis-5.0.4.tar.gz解压到/opt⽬录下。

tar -zxvf redis-5.0.4.tar.gz

 3.安装gcc。Linux系统必须处于连⽹的状态下。

yum -y install gcc

 4.忘记是否安装过,可以使⽤ gcc -v 命令查看gcc版本,如果没有安装过,会提示命令不存在。

gcc -v

 5.进⼊Redis的安装⽬录redis-5.0.4,进⾏编译。

make

 6.编译完成后,开始安装。

make install

 2.2 Redis基本操作

1.后台运⾏⽅式 

Redis默认不会使⽤后台运⾏,如果你需要将Redis配成后台运⾏,需要在redis.conf⽂件中进⾏修改。当你后台服 务启动的时候,会写成⼀个进程⽂件运⾏。 

1.编辑redis.conf⽂件。 

vim /opt/redis-5.0.4/redis.conf

 2.在redis.conf⽂件中配置Redis为后台运⾏。

3.以配置⽂件的⽅式启动。 

(1) 进⼊到/usr/local/bin⽬录下。

cd /usr/local/bin

 (2) 通过后台⽅式启动Redis。

redis-server /opt/redis-5.0.4/redis.conf
2.关闭数据库

1.单实例关闭Redis。 

redis-cli shutdown

 2.多实例关闭Redis。

redis-cli -p 6379 shutdown
 3.常⽤操作

1.检测6379端⼝是否在监听。 

netstat -lntp | grep 6379

 2.检测后台进程是否存在。

ps -ef | grep redis

 3.Redis为什么是6379端⼝?

6379在是⼿机按键上MERZ对应的号码,⽽MERZ取⾃意⼤利歌⼥Alessia Merz的名字。MERZ⻓期以来被 antirez(Redis作者)及其朋友当作愚蠢的代名词。 

4.连接Redis并测试 

1.进⼊Redis的命令终端。 

/usr/local/bin/redis-cli

 2.在Redis终端输⼊ping命令。

127.0.0.1:6379> ping
PONG
 5.读写数据

1.向k1保存数据。 

127.0.0.1:6379> set k1 HelloWorld
OK

 2.获取k1数据。

#获取数据
127.0.0.1:6379> get k1
"HelloWorld"
6.测试性能

1.先按 `ctrl+c `键,退出Redis客户端。 

2.输⼊ redis-benchmark 命令测试Redis的性能。

[root@localhost bin]# redis-benchmark
====== PING_INLINE ======
 100000 requests completed in 0.54 seconds # 在0.54秒内完成100000个请求
 50 parallel clients
 3 bytes payload
 keep alive: 1
99.91% <= 1 milliseconds
99.96% <= 2 milliseconds
99.97% <= 3 milliseconds
99.97% <= 4 milliseconds
99.98% <= 5 milliseconds
100.00% <= 7 milliseconds
184842.88 requests per second
...

 3.执⾏ redis-benchmark 命令后,命令不会⾃动停⽌,需要我们⼿动 ctrl+c 停⽌测试。

7.默认数据库 

1.查看redis.conf配置⽂件信息。 

cat /opt/redis-5.0.4/redis.conf

 2.默认配置16个数据库。

# Set the number of databases. The default database is DB 0, you can select
# a different one on a per-connection basis using SELECT <dbid> where
# dbid is a number between 0 and 'databases'-1
databases 16

 3.查看数据库键的数量。

[root@localhost bin]# /usr/local/bin/redis-cli
127.0.0.1:6379> dbsize
(integer) 4
 8.清空数据库

1.清空Redis当前库。 

flushdb

 2.清空Redis所有(16个)库,此命令慎⽤。

flushall

 2.3 键

2.3.1 模糊查询 

模糊查询keys命令,有三个通配符: * 、 ? 、 [] 。 

1.匹配任意字符 

* 通配任意多个字符。 

1.查询所有的键。 

keys *

 2.模糊查询"k"开头,后⾯随便多少个字符。

keys k*

 3.模糊查询"e"为最后⼀位,前⾯随便多少个字符。

keys *e

 4.双*模式,匹配任意多个字符,查询包含"k"的键。

keys *k*
 2.匹配单个字符

? 通配单个字符。 

1.模糊查询"k"字符头,并且匹配⼀个字符 

keys k?

 2.查询字符⻓度为3,并且以"k"字符开头的键。

keys k??
 3.匹配指定字符

[] 通配括号内的某⼀个字符。 

记得其他字⺟,就第⼆个字⺟可能是"a"或"e"。 

keys r[ae]dis

 2.3.2 键操作

1.exists key:判断某个key是否存在。 

127.0.0.1:6379> exists k1
(integer) 1 # 1表示被查询的键存在
127.0.0.1:6379> exists y1
(integer) 0 # 0表示被查询的键不存在

 2.move key db:移动(剪切,粘贴)键到指定的库(通过编号指定)。

127.0.0.1:6379> move k2 3 # 将键k1移动⾄3号库
(integer) 1 # 1表示移动成功
127.0.0.1:6379> exists k2 # 查看当前库中是否存在键k1
(integer) 0 # 0表示不存在
127.0.0.1:6379> select 3 # 切换⾄3号库
OK
127.0.0.1:6379[3]> exists k2 # 查看当前库中是否存在键k1
(integer) 1

 3.ttl key:查看键还有多久过期(-1表示永不过期,-2表示已过期)。

127.0.0.1:6379> ttl k1
(integer) -1

 4.expire key 秒:为键设置过期时间(⽣命倒计时),单位是秒。

127.0.0.1:6379> set key1 val1
OK
127.0.0.1:6379> ttl key1
(integer) -1
127.0.0.1:6379> expire key1 60 # 设置key1的过期时间为60秒(60秒后⾃动销毁)
(integer) 1 # key1的过期时间设置成功
127.0.0.1:6379> ttl key1 # 查看key1的过期时间
(integer) 49 # 49秒后过期
127.0.0.1:6379> ttl key1 # 查看key1的过期时间
(integer) -2 # -2表示key1已经过期

 5.type key:查看键的数据类型。

127.0.0.1:6379> type key2 # 查看key1键的数据类型
string # 表示是string类型

 3 Redis数据类型

Redis命令参考⽂档:http://redisdoc.com 

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

3.1 Redis字符串(String)

3.1.1 Redis字符串介绍 

string是Redis最基本的类型,你可以理解成与Memcached⼀模⼀样的类型,⼀个key对应⼀个value。 

string类型是⼆进制安全的。意思是Redis的string可以包含任何数据。⽐如jpg图⽚或者序列化的对象 。 

string类型是Redis最基本的数据类型,⼀个键最⼤能存储512MB。 

3.1.2 Redis字符串命令 

Redis字符串数据类型的相关命令⽤于管理Redis字符串值。 

下表列出了常⽤的Redis字符串命令: 

3.1.3 Redis字符串案例 1.使⽤set/get/del/append/strlen命令的案例。 

127.0.0.1:6379> set k1 v1
OK
127.0.0.1:6379> get k1
"v1"
127.0.0.1:6379> del k1
(integer) 1
127.0.0.1:6379> keys *
(empty list or set)
127.0.0.1:6379> set k1
(error) ERR wrong number of arguments for 'set' command
127.0.0.1:6379> set k1 v1
OK
127.0.0.1:6379> append k1 abc
(integer) 5
127.0.0.1:6379> get k1
"v1abc"
127.0.0.1:6379> strlen k1
(integer) 5

 2.使⽤incr/decr/incrby/decrby命令进⾏加减操作时,操作的必须是数字类型。

  • incr:意思是increment,增加
  • decr:意思是decrement,减少 
127.0.0.1:6379> set k1 1
OK
127.0.0.1:6379> incr k1
(integer) 2
127.0.0.1:6379> get k1
"2"
127.0.0.1:6379> decr k1
(integer) 1
127.0.0.1:6379> get k1
"1"
127.0.0.1:6379> incrby k1 3
(integer) 4
127.0.0.1:6379> get k1
"4"
127.0.0.1:6379> decrby k1 2
(integer) 2
127.0.0.1:6379> get k1
"2"

 更多请在百度网盘去看

 链接: https://pan.baidu.com/s/1Y8sxz0HmSXPdw2lXN_ntiw?pwd=2w9h

提取码: 2w9h

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值