• 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设计与实现

     

  • 相关阅读:
    九连环
    Fruit Ninja(取随机数)
    Distinct Values(贪心)
    Harvest of Apples
    Don't Be a Subsequence
    ConvexScore
    守卫
    Trie树
    NOIP 2005 过河
    HDU 4597 Play Game 记忆化DP
  • 原文地址:https://www.cnblogs.com/anxiao/p/8378218.html
Copyright © 2020-2023  润新知