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