Redis教程

一、简介  

  Redis是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。它通常被称为数据结构服务器,因为它的值可以是字符串、哈希、列表、集合和有序集合等类型。

(1) Redis 优势

  • 性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。
  • 丰富的数据类型 – Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
  • 原子 – Redis的所有操作都是原子性的。单个操作是原子性的,多个操作也支持事务(可通过MULTI和EXEC指令包起来)。
  • Redis支持数据的备份,即master-slave模式的数据备份。
  • 丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。

(2) Redis与其他key-value存储有什么不同?

  • Redis有着更为复杂的数据结构并且提供对他们的原子性操作,Redis的数据类型都是基于基本数据结构的同时对程序员透明,无需进行额外的抽象。
  • Redis运行在内存中但是可以持久化到磁盘,相比在磁盘上相同的复杂的数据结构,在内存中操作起来非常简单,这样Redis可以做很多内部复杂性很强的事情。同时,在磁盘格式方面他们是紧凑的以追加的方式产生的,因为他们并不需要进行随机访问。但是存储的数据量不能超过内存大小。

(3) 安装

  • 下载地址:http://redis.io/download
  • 服务器端:双击redis-server.exe  或 在cmd窗口输入redis-server.exe redis.windows.conf
  • 客户端:双击redis-cli.exe, 或另启一个窗口输入 redis-cli.exe -h 127.0.0.1 -p 6379,这时就可以读写键值对了。

(4) 配置

  Redis 的配置文件位于 Redis 安装目录下,文件名为redis.windows.conf。你可以通过 CONFIG 命令查看或设置配置项,包括设置绑定的主机地址, 端口, timeout, loglevel, 本地数据库文件名(默认值为dump.rdb)等。参数说明

  • 查看所有配置项:CONFIG GET *
  • 查看某个配置项:CONFIG GET 选项名 -- CONFIG GET loglevel
  • 设置某个配置项:CONFIG SET 选项名 参数 -- CONFIG SET loglevel "notice"

二、Redis命令

a. keys 命令

b. 数据类型及其相关命令

1. String(字符串)

  string是redis最基本的类型,与Memcached一样,一个key对应一个value。string类型是二进制安全的,即redis的string可以包含任何数据,比如jpg图片或者序列化的对象 。一个键最大能存储512MB。

2. Hash(哈希)

  Redis hash是一个键值对集合,即一个string类型的key和value的映射表,它特别适合用于存储对象。每个hash可以存储 232 - 1键值对(40多亿)。

3. List(列表)

  Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。

4. Set(集合)

  Redis的Set是string类型的无序集合。集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。集合中最大的成员数为 232 - 1。

5. zset(sorted set:有序集合)

  Redis zset 和 set 一样也是string类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。zset的成员是唯一的,但分数(score)却可以重复。

三、Redis高级教程

1. 安全验证

  默认情况下你无需通过密码验证就可以连接到 redis 服务。可以通过 redis 的配置文件设置密码参数,或者使用客户端修改验证密码。设置密码后,客户端连接 redis 服务就需要密码验证,否则无法执行命令。

127.0.0.1:6379> CONFIG get requirepass  -- 查看是否设置了密码验证
1) "requirepass"
2) ""

127.0.0.1:6379> CONFIG set requirepass "test"  -- 设置密码
OK

127.0.0.1:6379> AUTH password              -- 密码验证

127.0.0.1:6379> CONFIG get requirepass  -- 查看验证密码
1) "requirepass"
2) "test"
View Code

2. 性能测试   

  Redis-benchmark测试Redis性能

3. 持久化               

  Redis 持久化 , 持久化方式的配置如下:

修改redis.conf可以改变Redis服务器持久化方式

RDB持久化配置: Redis会将数据集的快照dump到dump.rdb文件中
save 900 1              #在900秒(15分钟)之后,如果至少有1个key发生变化,则dump内存快照。
save 300 10             #在300秒(5分钟)之后,如果至少有10个key发生变化,则dump内存快照。
save 60 10000           #在60秒(1分钟)之后,如果至少有10000个key发生变化,则dump内存快照。

AOF持久化配置
appendfsync always      #每次有数据修改发生时都会写入AOF文件。
appendfsync everysec    #每秒钟同步一次,该策略为AOF的缺省策略。
appendfsync no          #从不同步。高效但是数据不会被持久化。
View Code

4. 发布订阅

  当有新消息通过 PUBLISH 命令发送给频道 channel1 时, 这个消息就会被发送给订阅它的客户端。

    

1. publish channel message:         发布者向指定的频道发布消息
2. subscribe channel [channel...]:  订阅者订阅某个或几个频道,监听channel的消息
3. psubscribe pattern [pattern...]: 根据匹配模式订阅频道,可订阅多个匹配的频道
4. unsubscribe [channel...]:         退订指定的频道
5. pubsub channels [pattern]:       列出活跃的频道
6. pubsub subnum channel [channel...]:  查询频道订阅者数量

5. Redis 集群

  主从配置

6. Redis 事务

  redis事务提供了一种“将多个命令打包, 然后一次性、按顺序地执行”的机制, 并且事务在执行的期间不会主动中断 — 服务器在执行完事务中的所有命令之后, 才会继续处理其他客户端的其他命令。

关系型数据库的事务具有四个特性: 原子性、 一致性、 隔离性、持久性。

a. 事务的生命周期
(1) 事务的创建:使用MULTI开启一个事务
(2) 加入队列: 开启事务后,服务器在收到来自客户端的命令时不会立即执行, 而是将这些命令全部放进一个事务队列里,然后返回"QUEUED"表示命令已入队
(3) EXEC命令进行提交事务

b. 事务的常用命令
(1) MULTI: 标记一个事务块的开始, 这个命令将客户端的REDIS_MULTI选项打开, 让客户端从非事务状态切换到事务状态
(2) EXEC: 执行这个事务内的所有命令。使用WATCH命令时,只有当受监控的键没有被修改时,EXEC命令才会执行事务中的命令,利用了CAS机制。
(3) DISCARD:清除所有先前在一个事务中放入队列的命令,然后恢复正常的连接状态。若使用WATCH命令,该命令会将当前连接监控的所有键取消监控。
(4) WATCH:监控一个或者多个key,若这些key在提交事务(EXEC)之前被其他用户修改过,事务将执行失败,需要重新获取最新数据重头操作(类似于乐观锁)
(5) UNWATCH:清除所有先前为一个事务监控的键。如果你调用了EXEC或DISCARD命令,那么就不需要手动调用UNWATCH命令。

c. redis事务的三个性质
(1) 单独的隔离操作:事务中的所有命令会被序列化、按顺序执行,在执行的过程中不会被其他客户端发送来的命令打断
(2) 没有隔离级别的概念:队列中的命令在事务没有被提交之前不会被实际执行
(3) 不保证原子性:redis中的一个事务中如果存在命令执行失败,那么其他命令依然会被执行,没有回滚机制

d. 事务提交成功的例子

redis> MULTI
OK
redis> SET bookname "Mastering C++"
QUEUED
redis> GET bookname
QUEUED
redis> SADD tag "C++" "Programming" "Mastering Series"
QUEUED
redis> SMEMBERS tag
QUEUED
redis> EXEC
1) OK
2) "Mastering C++"
3) (integer) 3
4) 1) "Mastering Series"
   2) "C++"
   3) "Programming"

  使用事务后,redis服务端将为客户端创建以下事务队列, 当执行EXEC命令时, 服务器根据客户端所保存的事务队列, 以先进先出(FIFO)的方式执行事务队列中的命令,并为队列中的命令创建相应的回复队列。

e. 事务提交失败的例子

redis> WATCH name
OK
redis> MULTI
OK
redis> SET name peter
QUEUED
redis> EXEC
(nil)

  时间 T4 ,客户端 B 修改了 name 键的值, 当客户端 A 在 T5 执行 EXEC 时,Redis 会发现 name 这个被监视的键已经被修改, 因此客户端 A 的事务不会被执行,而是直接返回失败。

  

参考: 菜鸟教程  Redis设计与实现

 

原文地址:https://www.cnblogs.com/anxiao/p/8378218.html