Redis课件DIY
2017.8.31
3.6 有序集合与列表(EXT):................................................................................. 9
六. redis管道技术(pipeline)-了解即可...................................................................... 11
一.redis简介
1.redis介绍
Redis 是一个开源的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。为了实现其卓越的性能,Redis 采用运行在内存中的数据集工作方式. 根据您的使用情况, 您可以每隔一定时间将数据集导出到磁盘, 或者追加到命令日志中。您也可以关闭持久化功能,将Redis作为一个高效的网络的缓存数据功能使用。
2.redis支持的数据类型
Redis支持多种类型的数据结构,有 :
字符串(strings:简单的key-value键值对,value仅仅是String,也可以是int类型)
散列(hashes:可看做StringKey与StringValue的map容器)
列表(lists:栈、队列)
集合(sets:集合)
有序集合(sorted sets:有序集合)
3.Redis 产品有以下三个特点
Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
Redis支持数据的备份,即master-slave模式的数据备份。
二.Redis 安装与启动
2.1 redis下载与安装
下载:https://redis.io/download
Redis 没有官方的Windows版本,但是微软开源技术团队(Microsoft Open Tech group)开发和维护着这个 Win64 的版本,可在https://github.com/MicrosoftArchive/redis/releases下载或redis解压即用:
可以查看一下安装说明:README.md 和 INSTALL
2.2 redis服务、客户端启动
DOS命令进入安装主目录,启动redis服务:
redis-server.exe #使用默认配置启动redis服务
redis-server.ext redis.conf #或者指定配置文件启动redis服务
启动客户端连接:
redis-cli #使用默认配置连接服务器
redis-cli-h 127.0.0.1 -p 6379 #或者指定服务器IP连接redis服务
查看客户端是否连接成功:
>ping
PONG
注:出现PONG,则连接成功!
2.3 redis服务关闭
关闭服务:
①客户端命令窗口关闭:redis-cli-h 127.0.0.1 -p 6379 shutdown
注:若配置安全认证需添加密码,如:
edis-cli -h 127.0.0.1 -p6379 -a pwd shutdown
②服务端口窗口:CTRL+C
③强制杀死进程
三.五种基本类型操作
3.1 string 操作
String举例:
添加/修改一个 string:
127.0.0.1:6379> set test 123
重新赋值:
127.0.0.1:6379>set test 456
查询一个string:
127.0.0.1:6379>get test
append追加一个string:
127.0.0.1:6379> append test 456
注:(integer) 6(返回字符串的长度)
删除一个key:
127.0.0.1:6379>del test
返回字符串长度
127.0.0.1:6379>strlen test
3.2 hash 操作
hash是一个string类型的field和value的映射表,可以看做是一个Map表结构容器。
添加一个 hash:可添加多个字段
127.0.0.1:6379>HMSET hashtest name xiaoming age 12
返回整个 hash:
127.0.0.1:6379>HGETALL hashtest
1)"name"
2)"xiaoming"
3)"age"
4)"12"
返回hash中的一个字段:
127.0.0.1:6379>hget hashtest name
"xiaoming"
返回hash中的多个个字段:
127.0.0.1:6379>HMGET hashtest name age
1)"xiaoming"
2)"12"
删除一个hash中的字段:
127.0.0.1:6379>HDEL hashtest age
获取所有hash中所有数据
127.0.0.1:6379>HGETALL hashtest
1)"name"
2)"xiaoming"
添加/修改hash中的字段:
127.0.0.1:6379> HSET hashtest name xiaoxin
(integer) 0
127.0.0.1:6379> HGETALL hashtest
1) "name"
2) "xiaoxin"
查看指定键是否存在:
127.0.0.1:6379> HEXISTS hashtest age
(integer) 0
注:返回整数1或0。
1表示哈希包含该字段。
0 表示哈希不包含该字段,或key不存在。
补:
查看所有存在的键:
127.0.0.1:6379> KEYS *
清空所有数据库数据:
127.0.0.1:6379> FLUSHALL
清空当前数据库数据:
127.0.0.1:6379> FLUSHDB
3.3 list操作
添加元素到列表头:
127.0.0.1:6379>LPUSH listtest a b c
(integer)4
获取列表指定范围内的元素,LRANGElist_name index_start index_end 如:
127.0.0.1:6379> LRANGE listtest 0 2
1)"c"
2)"b"
3)"a"
添加元素到列表尾:
127.0.0.1:6379>RPUSH listtest 1 2 3
(integer)6
查看key对应的value类型:
127.0.0.1:6379>TYPE listtest
list
通过索引获取列表中的值:
127.0.0.1:6379>LINDEX listtest 3
"1"
获取列表长度:
127.0.0.1:6379>LLEN listtest
(integer)6
移除元素:
lremlisttest count value
count > 0 : 从表头开始向表尾搜索,移除与value 相等的元素,数量为 count 。
count < 0 : 从表尾开始向表头搜索,移除与value 相等的元素,数量为 count 的绝对值。
count = 0 : 移除表中所有与 value 相等的值。
例子:
127.0.0.1:6379>LRANGE list 0 2
1)"3"
2)"3"
3)"1"
127.0.0.1:6379>LREM list 1 3
(integer)1
127.0.0.1:6379>LRANGE list 0 2
1)"3"
2)"1"
3.4 set操作
set是string类型的无序集合。集合成员是唯一的,不允许重复
添加数据到集合:
127.0.0.1:6379> SADD settest 1 2 3 4 5
(integer) 5
返回集合数据:
127.0.0.1:6379> SMEMBERS settest
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
获取集合数量:
127.0.0.1:6379> SCARD settest
(integer) 5
移除集合中的值:
127.0.0.1:6379> SREM settest 5
(integer) 1
3.5 sorted set操作
Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。
有序集合特点:
1.有序集合中每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。
2.有序集合的成员是唯一的,但分数(score)却可以重复。
3.有序集合和集合一样也是string类型元素的集合,且不允许重复的成员
添加元素到集合:
127.0.0.1:6379> ZADD sortset 1 a
(integer) 1
注:如果value(a)存在,更新分数,否则添加新value,分数可以相同。
返回指定元素的分数:
127.0.0.1:6379> ZSCORE sortset a
"1"
查询元素,ZRANGE sortset start_index end_index:
127.0.0.1:6379> ZRANGE sortset 0 1
1) "a"
移除集合中的元素:
127.0.0.1:6379> ZREM sortset a
(integer) 1
3.6 有序集合与列表(EXT):
有序集合类型在某些方面和列表类型有些相似:
(1)二者都是有序的。
(2)二者都可以获得某一范围的元素。
但是二者有着很大的区别,这使得它们的应用场景也是不同的:
(1)列表类型是通过链表实现的,获取靠近两端的数据速度极快,而当元素增多后,访问中间数据的速度会较慢,所以它更加适合实现如“新鲜事”或“日志”这样很少访问中间元素的应用。
(2)有序集合类型是使用散列表和跳跃表(Skip list)实现的,所以即使读取位于中间部分的数据速度也很快。
(3)列表中不能简单地调整某个元素的位置,但是有序集合可以。
(4)有序集合要比列表类型更耗费内存。有序集合类型算得上是 Redis的5种数据类型中最高级的类型。
四.Redis HyperLogLog 命令
4.1HypeLogLog概念
Redis 在 2.8.9 版本添加了 HyperLogLog 结构。
Redis HyperLogLog 是用来做基数统计的算法,HyperLogLog 的优点是:
1.在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定的、并且是很小的。
2.在 Redis 里面,每个 HyperLogLog 键只需要花费12 KB 内存,就可以计算接近 2^64 个不同元素的基数。这和计算基数时,元素越多耗费内存就越多的集合形成鲜明对比。
HyperLogLog 不足之处:
1.因为HyperLogLog 只会根据输入元素来计算基数,而不会储存输入元素本身,所以 HyperLogLog 不能像集合那样,返回输入的各个元素。
HyperLogLog 可以接受多个元素作为输入,并给出输入元素的基数估算值:
•基数:集合中不同元素的数量。比如 {'apple', 'banana', 'cherry', 'banana', 'apple'}的基数就是 3 。
•估算值:算法给出的基数并不是精确的,可能会比实际稍微多一些或者稍微少一些,但会控制在合理的范围之内。
4.2HypeLogLog指令示例
下表列出了 redis HyperLogLog 的基本命令:
序号 命令及描述
1 PFADD key element [element ...]
添加指定元素到HyperLogLog 中。
2 PFCOUNT key [key ...]
返回给定 HyperLogLog 的基数估算值。
3 PFMERGE destkey sourcekey [sourcekey ...]
将多个 HyperLogLog 合并为一个 HyperLogLog
以下实例演示了HyperLogLog 的工作过程:
添加统计元素:
redis 127.0.0.1:6379> PFADD pf0 redis mongodb mysql
1) (integer) 1
redis 127.0.0.1:6379> PFADD pf0 js java jsp
1) (integer) 0
基数统计指令:
redis127.0.0.1:6379> PFCOUNT pf0
(integer)3
redis127.0.0.1:6379> PFADD pf1 js java jsp
(integer)1
合并HyperLogLog
redis127.0.0.1:6379> PFMERGE pf pf0 pf1
ok
redis127.0.0.1:6379> PFCOUNT pf
(integer)6
五.发布与订阅
5.1 发布与订阅概念
发布订阅(pub/sub)是一种消息通知模式,主要的目的是消除消息发布者和消息订阅者之间的耦合,Redis作为一个pub/sub的server,在订阅者和发布者之间起到了消息路由的功能。
订阅者可以通过subscribe和psubscribe命令向redis server订阅自己感兴趣的消息类型,redis将消息类型称为通道(channel)。
当发布者通过publish命令向redis server发送特定类型的信息时,订阅该信息类型的全部client都会收到此消息。
5.2 发布订阅模型
5.3 发布订阅指令示例
注意顺序:先pub后sub
六.redis管道技术(pipeline)-了解即可
Redis是一种基于客户端-服务端模型以及请求/响应协议的TCP服务。这意味着通常情况下一个请求会遵循以下步骤:
1.客户端向服务端发送一个查询请求,并监听Socket返回,通常是以阻塞模式,等待服务端响应。
2.服务端处理命令,并将结果返回给客户端。
Redis 管道技术可以在服务端未响应时,客户端可以继续向服务端发送请求,并最终一次性读取所有服务端的响应。
查看 redis 管道,只需要启动 redis 实例并输入以下命令:
$(echo-en "PING\r\n SET runoobkey redis\r\nGET runoobkey\r\nINCR visitor\r\nINCRvisitor\r\nINCR visitor\r\n"; sleep 10) | nc localhost 6379
以上实例中我们通过使用 PING 命令查看redis服务是否可用, 之后我们们设置了 runoobkey 的值为 redis,然后我们获取runoobkey 的值并使得 visitor 自增 3 次。
在返回的结果中我们可以看到这些命令一次性向 redis 服务提交,并最终一次性读取所有服务端的响应
管道技术最显著的优势是提高了 redis 服务的性能。
七.Redis事务
7.1 redis事务
事务可以一次执行多个命令,并且带有以下两个重要的保证:
1.事务是一个单独的隔离操作:事务中的所有命令都会按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。
2.事务是一个原子操作:事务中的命令要么全部被执行,要么全部都不执行。
multi 命令用于开启一个事务,它总是返回 OK 。 multi 执行之后,客户端可以继续向服务器发送任意多条命令,这些命令不会立即被执行,而是被放到一个队列中,当 exec命令被调用时,所有队列中的命令才会被执行。
7.2 redis事务示例
举例:
127.0.0.1:6379>SET name fangjicai
127.0.0.1:6379>LPUSH list 1 2 3 4
127.0.0.1:6379>WATCH name
OK
127.0.0.1:6379>MULTI
OK
127.0.0.1:6379>SET name test
QUEUED
127.0.0.1:6379>LPUSH list 4 5
QUEUED
127.0.0.1:6379>
此时开启另一客户端,将监听的key(name)对应的value做数值改动,如:
127.0.0.1:6379>set name 123
OK
然后再回到之前控制台,执行如下操作:
127.0.0.1:6379>EXEC
(nil)
表明未执行,即事物回滚(1.对未监听的key,如list,则不会回滚。2.对错误命令如 set name 123 456 不会滚)。
对于错误的指令:
注:
在事务处理中使用discard可以取消事务的处理。redis在事务中如果发生错误时事务退出,但是在该错误之前的操作无法回滚。
总之:
multi 命令用于开启一个事务,它总是返回 OK 。
multi 执行之后,客户端可以继续向服务器发送任意多条命令,这些命令不会立即被执行,而是被放到一个队列中,当 exec命令被调用时,所有队列中的命令才会被执行。
八.Redis安全
8.1 redis安全常识
Redis在默认状态可直接登录,也可以设置密码进行安全验证。设置密码时最好设置一个比较复杂的密码,防止暴力破解。因为redis执行速度非常快,正常配置下1s内可以进行150k次密码登录尝试。
8.2 redis基于配置安全验证
打开redis.conf配置文件,做如下配置:
配置完成后,启动redis服务,注意,此时不要点击redis-server.exe启动,因为redis-server.exe启动使用的是默认配置,可以在cmd命令行下启动:
8.3 redis设置临时验证
redis支持临时密码设置:
查看密码
config get requirepass
设置密码
config set requirepass 123
注:这种方式是临时设置密码,如果重启 redis-server 则失效
永久设置密码:
修改redis.window.conf 配置文件,找到 requirepass 参数并设置密码,启动server 时加载配置文件。
登陆时若不指定密码,进入客户端后,执行相关指令会报认证错误:
redis-cli -p 6379
> KEYS *
(error)NOAUTH Authentication required.
> LRANGE list 0 10
(error) NOAUTH Authentication required.
两种通过验证的方式:
redis-cli -h 127.0.0.1 -p 6379 -a 123
或进到客户端里在验证
auth 123
九.Redis持久化
9.1 redis持久化之RDB
Redis的所有数据都是保存在内存中,然后不定期的通过异步方式保存到磁盘上(这称为“半持久化模式”),也可以把每一次数据变化都写入到一个append onlyfile(aof)里面(这称为“全持久化模式”)。
第一种方法filesnapshotting(RDB):
默认redis是会以快照的形式将数据持久化到磁盘的(一个二进制文件,dump.rdb,这个文件名字可以指定),在配置文件中的格式是:save N M表示在N秒之内,redis至少发生M次修改则redis抓快照到磁盘。当然我们也可以手动执行save或者bgsave(异步)做快照。
工作原理简单:
当redis需要做持久化时,redis会fork一个子进程;子进程将数据写到磁盘上一个临时RDB文件中;当子进程完成写临时文件后,将原来的RDB替换掉,这样的好处就是可以copy-on-write
如在修改redis.conf文件:
1.dbfilenamedump.rdb 指定持久化数据存放文件(可更改dump.rdb文件名称)
2.dir./ 默认设置相对路径,此处可指定持久化文件的绝对路径
3.# save <seconds> <changes>........
save 900 1
save 300 10
save 60 10000 可添加或者修改相关参数
9.2 redis持久化之AOF
第二种方法Append-only(AOF):
filesnapshotting方法在redis异常死掉时, 最近的数据会丢失(丢失数据的多少视你save策略的配置),所以这是它最大的缺点,当业务量很大时,丢失的数据是很多的。
Append-only方法可以做到全部数据不丢失,但redis的性能就要差些。AOF就可以做到全程持久化,只需要在配置文件中开启(默认是no),appendonly yes开启AOF之后,redis每执行一个修改数据的命令,都会把它添加到aof文件中,当redis重启时,将会读取AOF文件进行“重放”以恢复到 redis关闭前的最后时刻。
如修改redis.conf文件:
1.appendonly no 修改为yes可转换为aof模式
2.appendfilename"appendonly.aof" 可修改aof文件名称
3.appendfsync everysec
3.# everysec.
十.虚拟内存(了解即可)
Redis的虚拟内存与操作系统的虚拟内存不是一回事,但是思路和目的都是相同的。就是暂时把不经常访问的数据从内存交换到磁盘中,从而腾出宝贵的内存空间用于其他需要访问的数据。尤其是对于redis这样的内存数据库,内存总是不够用的。除了可以将数据分割到多个redis server外。另外能够提高数据库容量的办法就是使用虚拟内存把那些不经常访问的数据交换到磁盘上。
如果想启用虚拟内存功能,在配置文件redis.conf中增加配置如下:
十一.Redis主从复制
11.1redis主从复制概念
Redis主从复制配合和使用比较简单,通过主从复制可以允许多个slave server拥有和master server相同的数据库副本。
master可以拥有多个salveserver,多个slave可以连接同一个master外,还可以连接到其他slave。主从复制不会阻塞master,同步数据时,master可以继续处理client,提高系统伸缩性。
11.2redis主从复制过程
Redis主从复制过程:
1.Salve与master建立连接,发送sync同步命令。
2.Master会启动一个后台进程,将数据库快照保存到文件中,同时master主进程会开始收集新的写命令缓存。
3.后台完成保存后,就将此文件发送给slave。
4.slave将此文件保存到硬盘上。
11.3redis主从复制结构
注:第二种配置方式在master宕机后,可以实现自动切换到slave1
11.4redis主从复制配置
Redis环境说明:
window下Redis服务作为master主机,window的IP为192.168.1.100,虚拟机下linux下的Redis作为slave,linux的IP为192.168.1.150。
在redis从机(linux环境)的redis.conf配置文件中加入以下配置:
11.5 主从示例
主机写入2条记录到数据库,然后从从机中读取,注意:总计无法更新值,只能读取。
主机:
从机:
十二.Java连接redis
十三.Springdata+redis+springtest之demo测试
十四.微博项目